baserCMSでOutlook.comからメール送信しようとしてハマる
ナカエです。
本日の記事はbaserCMSでoutlook.com(独自ドメイン)の送信設定で少しハマった件についてです。
baserCMSではデフォルトでメールフォームが用意されており、簡単にお問い合わせに対応することができます。
通常はbaserCMSを設置したサーバからメールが送信されます。
同じサーバでメールサーバも運用している場合は問題にならないはずですが、送信に使うアドレスとして外部メールを指定している場合に、メールが「なりすましメール」と判定されることがあります。
この際は、[システム管理] > [サイト基本設定]のメール設定の項目に、送信用のSMTPサーバとアカウントを登録する必要があります。
単純にメール設定しただけではメールが送信されませんでした。
SMTPホスト: live.smtp.com
SMTPポート: 587 (or 25)
SMTPユーザ: xxxxx@example.com(独自ドメインのメールアドレス)
SMTPパスワード: パスワード
幸い(?)、似たような症状でハマっている先駆者がいらっしゃったのでソースを追うのは楽でした。
ロリポップでbaserCMSのメール送信がうまくいかずハマった件
CakePHPの EmailComponent::__smtp() (/cake/lib/controllers/components/email.php) がソケット通信でメールを送信するメソッドで、
1.コネクションを確立
2.HELOコマンド
3.認証
の順で書かれています。
まずは参考ページの通り、このHELOコマンドをEHLOコマンドに置き換えてみましたがそれだけでは駄目でした。
というわけで手元のスクリプトでsmtp.live.comのサーバと色々お話をしてみた所、
どうやら平文の通信プロトコルで接続してからSTARTTLSを使って暗号化通信を確立する方式であれば認証まで上手くいくようでした。
それならばと__smtp()メソッドにSTARTTLSコマンドのやり取りとTLSによる暗号化通信への切り替え処理を加えてやります。
のように変更すれば無事にsmtp.live.comを経由してメールが送信できました。
CakePHP自体をいじってしまったことと最初からTLSで接続できそうな気がするのが心残りですが、 ひとまず正常に動作しているのでそのまま運用しています。
本日の記事はbaserCMSでoutlook.com(独自ドメイン)の送信設定で少しハマった件についてです。
環境
- baserCMS2.1.2
- PHP 5.4.16
baserCMSでの外部SMTPサーバの利用
baserCMSではデフォルトでメールフォームが用意されており、簡単にお問い合わせに対応することができます。
通常はbaserCMSを設置したサーバからメールが送信されます。
同じサーバでメールサーバも運用している場合は問題にならないはずですが、送信に使うアドレスとして外部メールを指定している場合に、メールが「なりすましメール」と判定されることがあります。
この際は、[システム管理] > [サイト基本設定]のメール設定の項目に、送信用のSMTPサーバとアカウントを登録する必要があります。
Outlook.comの設定が……?
Google Apps無料版亡き後、無料独自ドメインメールを運用できるMicrosoftのOutlook.comをよく利用させていただいるのですが、単純にメール設定しただけではメールが送信されませんでした。
SMTPホスト: live.smtp.com
SMTPポート: 587 (or 25)
SMTPユーザ: xxxxx@example.com(独自ドメインのメールアドレス)
SMTPパスワード: パスワード
ソースを調べる
仕方なくソースを辿ってみることにしました。幸い(?)、似たような症状でハマっている先駆者がいらっしゃったのでソースを追うのは楽でした。
ロリポップでbaserCMSのメール送信がうまくいかずハマった件
CakePHPの EmailComponent::__smtp() (/cake/lib/controllers/components/email.php) がソケット通信でメールを送信するメソッドで、
1.コネクションを確立
2.HELOコマンド
3.認証
の順で書かれています。
まずは参考ページの通り、このHELOコマンドをEHLOコマンドに置き換えてみましたがそれだけでは駄目でした。
STARTTLS
これはSMTPサーバの挙動を調べるしかないか。というわけで手元のスクリプトでsmtp.live.comのサーバと色々お話をしてみた所、
どうやら平文の通信プロトコルで接続してからSTARTTLSを使って暗号化通信を確立する方式であれば認証まで上手くいくようでした。
それならばと__smtp()メソッドにSTARTTLSコマンドのやり取りとTLSによる暗号化通信への切り替え処理を加えてやります。
if (!$this->__smtpSend("HELO {$host}", '250')) { return false; }の部分を
if (!$this->__smtpSend("EHLO {$host}", '250')) { return false; } if (!$this->__smtpSend("STARTTLS", '220')) { return false; } stream_socket_enable_crypto($this->__smtpConnection->connection, true, STREAM_CRYPTO_METHOD_TLS_CLIENT); if (!$this->__smtpSend("EHLO {$host}", '250')) { return false; }
のように変更すれば無事にsmtp.live.comを経由してメールが送信できました。
CakePHP自体をいじってしまったことと最初からTLSで接続できそうな気がするのが心残りですが、 ひとまず正常に動作しているのでそのまま運用しています。