そろそろ 各々が思う、冬が訪れます。勝利です。
今回はCakePHPの2系で「特定のメールサーバーでメールが受信できない」という事象に出会ったので、その対処法をご紹介します。
環境
事象の確認済みVersionは以下です。
cakephp-2.3.10
※2013.10.7 現在において安定版の最新Version。
おそらくこのバージョン以下で2系であれば発生しうる問題だと思います。
事象
特定のメールサーバーでメールが受信できない。
試した限りでは、フリードメイン(gmail/yahoo等)で受信できたものが、LIGメールサーバーでは受信できなかったです。
対処方法
CakePHPのEmailComponentのtransport設定を「Mail」に設定した場合、単純にsend_mailが実行されます。その際に、メールサーバーによってはセキュリティに引っかかり、受信できない場合があるので、今回の場合は明示的に正しいReruen-Pathの指定を行うことでその対処ができました。
そもそもReturn-Pathってなに?
メールヘッダー情報の種類のひとつで、正常にメール受信が行えなかった場合などの返送先を示す。
RFC2822(詳細はRFC2821)に定義されている。このヘッダーは、メールを一番最後に受け取ったSMTPサーバーがつけるが、任意のヘッダーであるため、Return-Pathの有無はサーバーに依存する。
上記の通り、メールを一番最後に受け取ったSMTPサーバーが付与する情報です。CakePHPのEmailComponentを使用する場合には、Return-Pathの設定がサーバーのデフォルト設定として反映されてしまいます。
そのサーバーのデフォルト設定が特定のメールサーバではスパム扱いされる等により、はじかれてしまうのですね。
実際に記述したコード
コンフィグの設定でなんとか出来ます。
app/Config/email.php
public $default = array(
'transport' => 'Mail',
'from' => 'shori_muraoka@liginc.co.jp',
// 以下additionalParamerwesにReturn-Pathの設定を記述
'additionalParameters'=> '-fshori_muraoka@liginc.co.jp',
'charset' => 'utf-8',
'headerCharset' => 'utf-8',
);
上記の「additionalParameters」の値を設定することによってReturn-Pathの値が書き換わります。
実際にメールを送信してみてヘッダー情報を確認してみてください。
ほら、書き換わってるでしょ。
※実は・・・
CakePHPにはReruen-Pathを設定する明示的なプロパティ(returnPath)があるのですが、こちらの値を設定してもどうにもこうにも行きません。
詳しく見たい方は、coreファイルを参照してみてください。
まとめ
メールをただ単に送信しようとするとCakePHPの場合、transport値をMailにするパターンが多いと思います。その際に設定すべき一つのパラメータとして覚えておければよいかなと思います。