ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

メールが送信できるようになった

メールサーバーの管理者の方と話せるということで、再調査に行ってきた。

原因特定

SMTPサーバーからは、「SMTP server response: 451 See http://pobox.com/~djb/docs/smtplf.html.」が返されていた。

http://pobox.com/~djb/docs/smtplf.htmlを見ると、http://cr.yp.to/docs/smtplf.htmlにリダイレクトされていた。

内容を読むと、改行コードがCRとLFではなく、LFだけの行があるために、エラーとしているらしい。

発生原因不明

サーバー管理者の方からヒアリングしたが、SMTPサーバーの設定は変更していないし、パッチを適用したのは、随分前とのこと。

こちらのプログラムも、1年以上はいじっていない状態なので、なぜ突然メール送信できなくなったのか、原因が不明。

対策

メール本文にLFだけの行があることまでは調べられたので、LFだけの行を CR+LFに置き換えるようにプログラムを修正することになった。

PHPMailerを呼び出す前のメール本文には改行がないが、PHPMailer内のmail()を呼び出す直前に確認すると、1バイト追加されて改行されていたので、PHPMailer内で改行コードが追加されていることがわかった。

PHPMailer内を順番に調べると、以下のようになっていたので、それぞれ変更した。

  • 改行コードを一律LFにするようになっている==>一律 CR+LF にするように変更
  • 最後にLFを追加するようになっている==>最後に CR+LF を追加するように変更

変更した結果、メールを送信できるようになって、エラーは発生しなくなった。

 

今回のエラーは、bare LFという問題らしい。

RFCで改行コードはCR+LFと決まっているのに、LFだけのメールを送ろうとした場合に発生するというのは、規約違反だという考えからは納得できる。

現在のSMTPサーバーでは、LFをCR+LFに置き換えて対処してくれる場合もあるようなので、今回のSMTPサーバーもエラーにしないでくれれば、気づかなかった。

なぜ突然発生するようになったのかだけ、未だに不明なのが気になる。