Eccubeから注文などのメールが、約10分遅延する問題があり、
まだ、ピークではないので、やり過ごしていたが、
ここ1ヶ月ほど悩んだことが、やっと解決された!!
***
原因は、PHP 5.6 / PEAR::SMTPにあり!
5.6から、587ポートに接続のTLSは、認証が必要になっています。
function enableCrypto($enabled, $type){ if (version_compare(phpversion(), "5.1.0", ">=")) { if (!is_resource($this->fp)) { return $this->raiseError('not connected'); } // ▼ この行を追加 stream_context_set_option($this->fp, 'ssl', 'verify_peer_name', false); return @stream_socket_enable_crypto($this->fp, $enabled, $type);// 問題の場所 } else { $msg = 'Net_Socket::enableCrypto() requires php version >= 5.1.0'; return $this->raiseError($msg); } }
前バージョンのPEAR::SMTPにはついていたコードなんでしょうか?
7行目のコードを足せば、動くようになります!
AWS SES の設定や制限解放
SESの設定は、こちら。
あとは、制限解放依頼。
初期は、サンドボックスになっているので、登録したメアドにしか、
メールが送れないので、その制限を解除↓
解除リクエスト先 >?http://aws.amazon.com/ses/extendedaccessrequest/
参考 >?Amazon SESの送信制限を解除する(SandBoxの外へ移動する)
※スパムメール送る送信元としてSESが利用されていることが、多いらしいので、サイトがある程度完成してから、申請しました。
AWS SES 送信テストサンプルコード
PHP で Amazon SES の SMTP インターフェイスから E メールを送信する
の通り、USER / PASSWORDを指定するだけなんですが、
PEARが入ってないと、当然動きません。
※USER / PASSWORD は、SESのメール設定時にIAMで取得する乱数文字
※HOSTは、今回オレゴンを使ったので、
define('HOST', 'email-smtp.us-west-2.amazonaws.com');
また、AWS(Amazon AMI)の場合、
include_path = .:/usr/share/pear:/usr/share/php
となっているので、インストールするか、
ECCUBE内にもある(data/module)ので、これを追加してやる。
この場合、ECCUBE のルートにあるdefine.phpで書かれているとおり、
/** data/module 以下の PEAR ライブラリを優先的に使用する */ set_include_path(realpath(dirname(__FILE__) . '/' . HTML2DATA_DIR . 'module') . PATH_SEPARATOR . get_include_path());
をECCUBE固有の固定値を修正し、
サンプルコードの上の方に書き足せば、動きます。
(直接、module/Mail.phpをincludeしようとしたりして、罠にハマったのでw)
ECCUBE 2.13系?MAIL_BACKEND >> SMTP
define('MAIL_BACKEND', 'mail');
config.phpのこの行を、mail >> smtpに変え、host / port / user / passwordを適切に変えるだけ。
「ECCUBE SMTP」で検索すると、module / Mail / smtp.phpも書き直せ
と出てきますが、そんな必要はありません。!
古いバージョンでは、書き直しが必要だったかもしれませんが、
config.phpの変更だけで、おk。
呼び出し元(module/mail.php)のソースを読む限り、
Mail->factory('smtp', $param)
このコードで、上記configで指定されたsmtpの値
=$paramが渡され、引き継がれています。
また、まとまってない文章っぽいですが、お察しくださいw
実際に注文してみたところ、全く遅延はありませんでした!
MAIL_BACKENDのmail / PHP のメールは、規制がかかっているので、
SES取得、制限開放して、
MAIL_BACKEND = SMTPで運用すると、幸せになれます!
関連