blogですかい

仕事、プライベートで学んだことなどを発信し、その内容がたとえ少数でも誰かの役に立ったらなら、それはとっても嬉しいなって

CakeEmailクラスでenvelope fromを指定する方法

CakeEmail::returnPath()の罠

CakeEmailクラスには $_returnPathというプロパティを操作するreturnPath()というメソッドが用意されているが、 何故かこのメソッドで設定した値は、送信時のEnvelope Fromに反映されない。

'transport'=>'Mail'の場合

transport=>'Mail'の設定だと、内部的にはPHPのmail()関数が使用される。 mail()関数を直接使用してEnvelope Fromを指定したいときは、mail()の第5引数に"-f{$envelope_from}"`というような文字列を渡す。
CakeEmailにて、それを実現するためには下記のようにする。

  $envelope_from = 'return-path@example.com';

  $email = new CakeEmail();
  $email->from('header_from@example.com');
  $email->to('to@example.com');
  $email->transportClass()
    ->config(array('additionalParameters'=>"-f{$envelope_from}"));
  $email->subject('題名');
  $email->message('本文');
  $email->send();

'transport'=>'Smtp'の場合

'transport'=>'Smtp'の設定だと、CakePHP自体がSMTPセッションを張る。
Envelope FromとRCPT TOは下記のメソッドで送信される。

protected function _sendRcpt() {
  $from = $this->_cakeEmail->from();
  $this->_smtpSend('MAIL FROM:<' . key($from) . '>');

  $to = $this->_cakeEmail->to();
  $cc = $this->_cakeEmail->cc();
  $bcc = $this->_cakeEmail->bcc();
  $emails = array_merge(array_keys($to), array_keys($cc), array_keys($bcc));
  foreach ($emails as $email) {
    $this->_smtpSend('RCPT TO:<' . $email . '>');
  }
}

このように、SMTPの場合 Envelope FromにはCakeEmail::from()が使用されるので

$email = new CakeEmail('smtp');
$email->from('header_from@example.com');
//中略
$email->send();

といったようにすれば、Envelope Fromに'header_from@example.com'が指定されて送信される。

では、CakeEmail::returnPath()とは何なのか

ご存知の方、いらっしゃいましたら教えてください。