mailtrapを使いたかったが、無理だったので直した。
ECCUBEバージョンは2.11.4。
ポイント
下記コンストラクタを見れば、どう修正すれば良いか必要な情報が全て書かれています。
// コンストラクタ
function SC_SendMail() {
$this->arrRecip = array();
$this->to = "";
$this->subject = "";
$this->body = "";
$this->cc = "";
$this->bcc = "";
$this->replay_to = "";
$this->return_path = "";
$this->backend = MAIL_BACKEND;
$this->host = SMTP_HOST;
$this->port = SMTP_PORT;
mb_language( 'Japanese' );
//-- PEAR::Mailを使ってメール送信オブジェクト作成
$this->objMail =& Mail::factory($this->backend,
$this->getBackendParams($this->backend));
}
1.定数 MAIL_BACKEND について
定数 MAIL_BACKEND の値をsmtpに設定した場合、
ECCUBEのSC_SendMailクラスを経由して、PearのMail_smtp クラスが実際の送信処理を担当。(移譲)
この定数はPearのMailクラスのファクトリメソッドにそのまま渡されていて、どのクラスで送信処理を行うかが決まっている。
define('MAIL_BACKEND', 'smtp'); → pearの Mail_smtp クラスが送信処理を担当。
define('MAIL_BACKEND', 'mail'); → pearの Mail_mail クラスが送信処理を担当。
2.Mail::factory() のパラメータ
SC_SendMailクラスのコンストラクタで、Mail::factoryを呼び出している。
Mail::factory() の第一引数はバックエンドを示す文字列、第二引数は、各実装クラスのコンストラクタに渡されるパラメータ配列。この第二引数の配列を作っているのは、SC_SendMail::getBackendParams()
SC_SendMail::getBackendParams()が、hostとportしか返していないので、認証が必要なsmtpサーバーは使えません。
なんてこった。
修正箇所
下記2点修正した。
- SC_SendMail::getBackendParams() をオーバーライドして、認証情報を追加。
- config.php に認証情報を追記。
/**
* SC_SendMail::getBackendParams() をオーバーライド。
* smtp認証情報の項目を追加
* @param string $backend
* @return array
* @link http://pear.php.net/package/Mail/
* @see Mail_smtp::Mail_smtp()
*/
function getBackendParams($backend){
$arrParams=parent::getBackendParams($backend);
if($backend ==="smtp"){
if(defined("SMTP_AUTHENTICATION")){
if(SMTP_AUTHENTICATION===true){
$arrParams['auth']=true;
$arrParams['username']=SMTP_USERNAME;
$arrParams['password']=SMTP_PASSWORD;
}
}
}
return $arrParams;
}
//mailtrap.io利用に必要な追加のパラメータ
define('SMTP_AUTHENTICATION',true);
define('SMTP_USERNAME','mailtrap.ioのusername');
define('SMTP_PASSWORD','mailtrap.ioのpassword');