ノノログ

ホーム / ブログ / baserCMS / ロリポップでbaserCMSのメール送信がうまくいかずハマった件

ロリポップでbaserCMSのメール送信がうまくいかずハマった件

ロリポップのロリポプランにBaserCMS(var2.1.0)をインストールしたらメールがちゃんと飛ばなかったので、いろいろ調査してみた。

 

なぜ飛ばないのか

まずは、インストールした状態でお問い合わせフォームを利用してみた。
通常は登録アドレスとお問い合わせ者にメールが送信されるんだが、両方飛ばない。

ちなみに管理者用アドレスはgoogleAppsを利用したいわゆるgmailと同じサーバのアカウント。
もう一つは、利用者を想定したアドレスでMicrosoftのoutlook(旧hotmail)を利用。

どちらも飛ばない。
幾度試しても送信されないのでPHPのmail関数で直で送信すると、やっぱり飛ばない。

そのうちの一通にgmailのデーモンより返信があった

 

私たちのシステムは異常な速度を検出しました
550-5.7.1迷惑メールがあなたのIPアドレスから発信された。保護するために
スパムから当社550-5.7.1ユーザーは、メールがあなたのIPアドレスがあったから送られてきた
ブロックされています。 550-5.7.1はご覧ください
※ Google翻訳

完全にspam判定されています。ありがとうございます。
共有サーバなので、別のユーザによる行為でIP全体がはじかれている印象ですね。

送信を可能にするために考えた対処法

  1. SPFレコードを設定する。
  2. 別のSMTPサーバを利用する。
  3. さくらインターネットに乗り換えちゃう

とりあえず手軽に出来るDNSの設定を変更、数時間後に試すも受信出来ず。(1ダメ)

baserCMSのシステム管理よりSMTPの設定をいろいろ試してみるも受信出来ず(2ダメ)

サーバ乗り換えるのはめんどくさい(3却下)

そもそもロリポのコントロールパネルにあるWEBメールからgmailやoutlookへの送受信は確認出来ているので、
SMTPがなんでうまくいかないのか調査することにした。

 

メール送信のプログラムを読んでみる

最初は最悪Qdmailというライブラリに置き換えれば動くよなぁなどと思っていたが、baserCMSのテンプレート機能などを活かしたまま置き換えるのは難儀そうなのでちゃんとソースを読み始めた。

基本的なソースの流れはこんな感じ

  1. MailController::submit()  (/baser/plugin/mail/controllers/mail_controllers.php)
  2. MailController::_sendMail()
  3. BaserAppController::sendMail() (/baser/controllers/baser_app_controllers.php)
  4. BcEmailComponent::send()  (/baser/controllers/components/bc_email.php)
  5. EmailComponent::__smtp()  (/cake/lib/controllers/components/email.php)

1. メールプラグインのコントローラでリクエストをうけて、
2. メールコントローラの送信メソッドへ処理が移動、
3. baserのメール送信管理機能に処理が移動、このあたりで設定情報からメール送信設定、
4. cakeのメールコンポーネントをwrapしたbaser拡張のメールコンポーネントに処理が移動、
5. 
最終的にはCakePHPのコンポーネントにあるmail送信機能を利用している。

結局どうやって送信してるの?

SMTP-AUTHを利用した送信では、CakePHPのEmailComponent内でsocket通信してた。
設定のミスだのいろいろ調べたが、結局は一般的なメーラーが通信しているような事をやってる。

 

通信を一つ一つ見てみる

  1. コネクションの確立
  2. HELOコマンドのやり取り
  3. 認証を開始
    > AUTH PLAIN
    > 500 Unrecognized command
ここで認証の開始を受け取ってくれない。
なんで??と他の件も含めて、やっていた。
HELO・・ HELO!?

ここでした。

SMTP-AUTHを利用するためにはEHLOの拡張なんとかで通信しないとメールは送信できません。
このへんはメールサーバの通信仕様

ソースを読んでみるとsmtpを利用した際は全てHELOコマンドで挨拶していました。

 

送信出来た!!

/cake/lib/controller/components/mail.php LIne:754をとりあえずベタにすることで、SMTP-AUTHが利用出来ました。

 

 
 
if (!$this->__smtpSend("HELO {$host}", '250')) {
if (!$this->__smtpSend("EHLO {$host}", '250')) {

 

結局、対処法2のSMTPで送信することで、ロリポサーバからbaserCMSのメールを送信する事ができました。
めでたしめでたし。

 

 

 

 

このエントリーをはてなブックマークに追加