CakePHPのemailでReturn-Pathを設定する

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
チーズ蒸しパンになりたい

おまとめ三行

Return-Pathの設定ができない!?
additionalParametersを設定するのじゃ
チーズ蒸しパンになりたい

CakePHPの2系を使ってますと、CakeEmailってクラスを呼び出してメールを送信することがあると思うんですが、その際、Return-Pathってやつの設定が、ちょびっとだけややこしい。

いや、作業的には全然たいしたことないんですけど、何か一見するとReturn-Pathを設定する項目があるのに、そこで設定しても反映されず、別のところで反映しないといけないってところがちょいややこしや〜なのです。



Return-Pathって?

Return-Pathってのは、returnって言葉の通り、例えば存在しないアドレスにメールを送っちゃったりしたときに、エラーが返って来るときの、その返り先のアドレスです。普通はメールの送信者のところにそのまま返ってきゃ良いんですけど、システムからメールを送る場合には、明示的にエラーメールを受け取るアドレスを用意してたりすることもあると思うんで、そういうときに設定する感じですね。

あまり気にしなくても良いとこなのかもしれないけど、CakePHPなんかで開発してるとき、ここら辺をサボっちゃうと、Return-Pathが「apache@***」みたいな感じになっちゃってて、おいおい俺のサーバーにはapacheが受け取れるメールボックス用意してねーよーみたいなことになったりするので、設定しとくに越したことはないですね。



CakeEmailの簡単な使い方

CakeEmailを使ってメールを送信する場合、思いっきり端折って書くと、こんな感じで送信しますね。

$email = new CakeEmail('default');
$email->send();

もしCakeEmailを使うんであれば、CakeのAppフォルダの中にconfigってフォルダがあって、その中にemail.phpってやつを置いとくと思うんですが、その中にメールに関する初期設定が書いてあります。上記の「$email->config(‘default’);」ってやつは、その初期設定の中の「$default」っていう設定を使いまっせってな感じです。

email.phpの中身はおよそこんな感じ。

class EmailConfig {

  public $default = array(
    'transport' => 'Mail',
    'from' => 'you@localhost',
    'charset' => 'utf-8',
    'headerCharset' => 'utf-8',
  );

〜 中略 〜

これもめっちゃ端折っちゃいましたが、ここで見るよりも、実際に自分が開発してるemail.phpを見た方が分かると思うから、ここはこれで勘弁。

$defaultの中にtoやらfromやらの設定が全部書いてあれば、上記の記述だけでメールがぽぽぽーんと飛ばせますけど、もし毎回toやらfromが変わる場合は、コントローラーの中とかでメールを送信するときに任意に設定してあげれば良い。

$email = new CakeEmail('default');
$email->to('to@norm-nois.com','あかつき');
$email->from('from@norm-nois.com','まだ見ぬあなた');
$email->send();

こんな感じです。他にもメールのタイトルとか本文とか、まあとにかくいろいろ設定できます。



Return-Pathの設定

じゃあ同じようにReturn-Pathの設定もできるんじゃねーのって話なんですが、これがなぜかできない。

CakeのコアライブラリにあるCakeEmail.phpってファイルの中を見ると、「returnPath()」っていう、いかにもReturn-Pathを設定できそうなメソッドがあるんですよ。toとかfromとかと同じ感じで。だから以下のように書けばできそうに思えるんですけどね。

$email = new CakeEmail('default');
$email->returnPath('return@norm-nois.com','あかつき');
$email->send();

でも残念ながら、ここで設定してもReturn-Pathの設定は反映されない。

何でかってーと、CakeEmailでメールを送信する場合も、最終的にはPHPのmail関数を使って送信しているわけなんですが、そのmail関数でReturn-Pathを指定する場合は、関数の第五引数で設定するんですよ。

mail($to,$subject,$message,$additional_headers,$additional_parameters)

上記の中の「$additional_parameters」ってやつ。ここにReturn-Pathの設定を書く必要がある。

で、CakeEmailの中身をいろいろ漁ってみると、メールを送信する関数のところで、こんな感じのことをやってんですね。

if (ini_get('safe_mode') || !isset($this->_config['additionalParameters'])) {
  @mail($to, $email->subject(), $message, $headers);
} else {
  @mail($to, $email->subject(), $message, $headers, $this->_config['additionalParameters']);
}

若干内容を省略して書いちゃいましたが、ようはお前さんがadditionalParametersってやつを設定してれば第五引数にそれをセットしてやるよって感じですね。

なので、おとなしくそれに従ってadditionalParametersを設定してあげれば、解決です。

//email.php
class EmailConfig {
  public $default = array(
    'transport' => 'Mail',
    'from' => 'you@localhost',
    'charset' => 'utf-8',
    'headerCharset' => 'utf-8',
    'additionalParameters' => '-f return@norm-nois.com',//追加
  );

〜 中略 〜

メールアドレスの前に「-f」をつけるのを忘れずに。この-fってのは、えー……何ですかね? サーバーがメール送信のコマンドを実行するときのオプションとかですかね。ごめんなさい。ちゃんと調べてないんでちょい曖昧です。

コントローラー側で設定したい場合は、こうですかね。

$email = new CakeEmail('default');
$config = array('additionalParameters' => '-f return@norm-nois.com');
$email->config($config);

あとはまあ、CakeEmailの方のreturnPath()の中身を自分で改造して、additionalParametersをセットできるようにしちゃうっていう手もありますが……そっちの方が面倒そうかな?



設定できるパターン

じゃあ何のために「$email->returnPath()」があんのよって話なんですが、transportがSmtpの場合だと、こっちでReturn-Pathを設定することができるっぽいですね。

//Mailの場合
public $default = array(
  'transport' => 'Mail',
  'from' => 'you@localhost',
  'charset' => 'utf-8',
  'headerCharset' => 'utf-8',
  'additionalParameters' => '-f return@norm-nois.com',
);

//コントローラーで設定するなら
$email = new CakeEmail('default');
$config = array('additionalParameters' => '-f return@norm-nois.com');
$email->config($config);


//Smtpの場合
public $default = array(
  'transport' => 'Smtp',
  'from' => 'you@localhost',
  'charset' => 'utf-8',
  'headerCharset' => 'utf-8',
  'returnPath' => 'return@norm-nois.com',
);

//コントローラーで設定するなら
$email = new CakeEmail('default');
$email->returnPath('return@norm-nois.com');

こんな感じ。






ってことで、Return-Pathの設定でした。

メールの細かい設定ってぶっちゃけあまり気にしたことなかったんですけど、仕事で最近、メールの送受信に関するご指摘がいろいろあったりしまして……このReturn-PathとかReceivedに関する設定とかをやりました。

まったくさぁ……わかんねーことだらけでめんどくせーよ。いちいち調べるのもめんどくせーし。ホントめんどくせーな、システム開発の仕事って。

っていうかもう、働くことがめんどくさい。

チーズ蒸しパンになりたい。

cakePHP - メール送れない(additionalParameters) - Logicky Blog 2014年10月02日 23:04:15
[…] 参考: [CakePHP開発]メールが受信できない時はReturn-Pathを設定してみよう CakePHPのemailでReturn-Pathを設定する […]
もしかしたら何か関連しているかも?