なんかもう最近はCoreserverに設置したWordpress使ってるお前が悪い、と
言わんばかりのトラブル発生率ですがなんとかなったのでまた記す。

今回やりたかった事

  1. コメントがついた時の通知メールを送る。
  2. プラグイン「Contact Form 7」でフォームを設置。

ドメインはValue-domainで取得してValue-Domain独自のDNS設定してあり
Google Appsでメールアドレス運用はしていない。
設置したドメインと同じサーバ内でSMTPサーバもある状況。

以前のエントリーである
WordPressの送信フォームとGoogle Appsの同時使用のトラブル」の時は
上記の環境プラス、メールはGoogle Appsで運用していたので
プラグインWP-mail SMTPを使用してなんとか乗り切った。

しかし、すんなり行くと思ったのだけど色々と問題が出てきた。

まずは設置

Contact form 7をインストールしてまずはメールフォームを作る。
送信先アドレスは管理者ユーザーと全く同じものにした。

しかし、コメント通知は届いてもフォームメールが送れない。
赤枠で「メッセージの送信に失敗しました。間をおいてもう一度お試しいただくか、別の手段で管理者にお問い合わせ下さい。」とのメッセージが出て終了。

なるほど、という事は前と同じくWP-Mail SMTPの出番だなとインストール。

SMTPサーバーをまずCoreserver内のSMTPサーバに設定。
WP-Mail SMTPのテスト送信では無事にメールが送れたものの
コメント通知は届かず、そしてまたもフォームは赤枠エラー。

SMTPサーバをGmailのものに替えてみた。
smtp.gmail.comでSSL通信でポートは465。
アドレス設定はWP-mail SMTPと同じものにしておいた。

フォームは無事に「送信されました」と出るのだけれども、
設定したメールアドレスには届かない。
コメント通知はちゃんと届いてた。
まさにあちらが立てばこちらが立たず。困った。

そして解決

思い立って、WP-mail SMTPを停止→そして削除。
この時点ではまだフォームは赤枠エラーが出ていたのだけども
海外フォーラムで以下のパッチを発見。

Ticket #20970: 20970.patch
https://core.trac.wordpress.org/attachment/ticket/20970/20970.patch

これはWordpressのコアファイルを直接書き換えるもので、
Wordpressの最新バージョン3.9.1では
wp-include/class-phpmailer.phpの1110行目、そして1116行目に位置する
「, $params」という記述をカットするというもの。

$rt = false;
if ($this->SingleTo === true && count($toArr) > 1) {
foreach ($toArr as $val) {
$rt = $this->mailPassthru($val, $this->Subject, $body, $header, $params);
// implement call back function if it exists
$isSent = ($rt == 1) ? 1 : 0;
$this->doCallback($isSent, $val, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
}
} else {
$rt = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
// implement call back function if it exists
$isSent = ($rt == 1) ? 1 : 0;
$this->doCallback($isSent, $to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
}

が従来の表記だけども以下に書き換えて上書きアップロードする。

$rt = false;
if ($this->SingleTo === true && count($toArr) > 1) {
foreach ($toArr as $val) {
$rt = $this->mailPassthru($val, $this->Subject, $body, $header);
// implement call back function if it exists
$isSent = ($rt == 1) ? 1 : 0;
$this->doCallback($isSent, $val, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
}
} else {
$rt = $this->mailPassthru($to, $this->Subject, $body, $header);
// implement call back function if it exists
$isSent = ($rt == 1) ? 1 : 0;
$this->doCallback($isSent, $to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
}

※$headerのあとの,(カンマ)を削除するのも忘れずに。

これで無事にコメント通知、そしてフォームメールも届くようになった。
しかし、これはコアファイルなのでWordpress本体のアップデートがあれば
また上書きされてしまうかも知れないので注意が必要です。

はー、けっこう時間食った。
というよりCoreserverを使わない、って選択肢を取った方が楽なのかもw