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()
とは何なのか
ご存知の方、いらっしゃいましたら教えてください。