「WordPressで学ぶPHP(3)関数編」を発売しました。
本書は「WordPressで学ぶPHP(1)変数・制御構造編」「WordPressで学ぶPHP(2)データ構造(配列・オブジェクト)編」の続編にあたり、PHP組み込みの関数や、独自の関数を作る方法などを解説します。
Kindle本で、定価400円です。
メールフォームプラグインV2.0・その5(メール送信エラーへの対策)
メールフォームプラグインV2.0を導入された方の中で、「メールを送信すると『メールを送信することができませんでした。』とエラーが表示された」という方が数名いらっしゃいました。
また、これまでのメールフォームプラグインでも、同様の現象が出た方が数名いらっしゃいます。
このエラーへの対策を解説します。
1.メールフォームプラグインのメール送信の仕組み
メールフォームプラグインでは、Movable Typeのメール送信モジュール(MT::Mail)を使って、メールを送信しています。
また、MT::Mailは、サーバーにインストールされているメールサーバーのプログラム(sendmail等)か、外部のメールサーバーのどちらかに、メール送信を依頼する形を取っています。
「メールを送信することができませんでした。」のエラーメッセージは、メールサーバーがメール送信の処理に失敗したときに表示されます。
2.対策その1・mt-config.cgiの書き換え
上で述べたように、メールの送信は、サーバーにインストールされているメールサーバーのプログラムか、外部のメールサーバーを使って行われます。
そのどちらを使うかは、mt-config.cgi(Movable Typeの設定ファイル)で決まります。
Movable Typeのインストール先ディレクトリに、mt-config.cgiファイルがあります。
そのファイルを開いてみて、以下のような記述があるか、もしくはMailTransferに関する記述が何もない場合は、サーバーにインストールされているメールサーバープログラムが使われます。
MailTransfer sendmail SendMailPath メールサーバープログラムのパス
一方、以下のような記述があれば、外部のメールサーバーが使われます。
MailTransfer smtp SMTPServer メールサーバーの名前
ただ、外部のメールサーバーを通してメールを送信することは、現状では多くの場合で無理です。
最近のメールサーバーは、スパムメール等への対策として、「Outbound Port 25 Blocking」(OP25B)という仕組みを導入しています。
ところが、Movable Typeから外部のメールサーバーを通してメールを送信する場合、そのプログラムはOP25Bには対応していません。
したがって、mt-config.cgiに「MailTransfer smtp」の記述がある場合、それを「MailTransfer sendmail」に変更し、また「SendMailPath メールサーバープログラムのパス」の行を追加します。
なお、「メールサーバーのプログラムのパス」は、各レンタルサーバーのヘルプ等のページに、「sendmailのパス」等の形で記載されています。
例えば、「sendmailのパスは『/usr/sbin/sendmail』です。」と記載があるレンタルサーバーの場合、mt-config.cgiに以下の記述を入れます。
MailTransfer sendmail SendMailPath /usr/sbin/sendmail
なお、自宅サーバーで運用している場合、上記の設定をしても、プロバイダを通る際にOP25Bがかかってしまって、メールが送信できないことがあります。
その場合は、自宅サーバーのメールサーバープログラムに、OP25B対策のための設定を行う必要があります。
2.対策その2・メールの送信元アドレスの変更
対策その1を行ってみても、エラーが出ることもあります。
その場合、お使いのサーバーのメールサーバーのプログラムでは、送信元のメールアドレスに制限がかかっていることが考えられます。
メールフォームプラグインでは、メールフォームで入力されたメールアドレスを送信元として、メールを送信する仕組みを取っています。
送信元のメールアドレスに制限がかかっている場合、メールフォームで入力されたメールアドレスを送信元にすることができずに、送信エラーになります。
この場合は、以下の作業を行ってみてください。
- レンタルサーバーの設定で、ご自分のドメインのメールアドレスを1つ作成し
ます。
例えば、ブログのアドレスが「http://www.foo.com」の方なら、「○○○@foo.com」のようなメールアドレスを作ります。
また、すでに作成してあるなら、そのメールアドレスを使うこともできま
す。 - メールフォームの設定で、「基本設定」の「送信先のメールアドレス」の欄に、
上で作成したメールアドレスを入力します。 - メールフォームプラグインのlib/MailForm.pmをメモ帳等で開きます。
- MailForm.pmの340行目付近に、以下のような部分があります。
# send mail $head{To} = $tmail; $head{From} = $email; my $mtmpl = MT::Template->new;
この部分を以下のように書き換えて、MailForm.pmをアップロードし直します。
# send mail $head{To} = $tmail; $head{From} = $tmail; $head{'Reply-To'} = $email; my $mtmpl = MT::Template->new;
3.詳細なエラーメッセージの表示
上記の2つの対策を行っても、状況が改善しないこともあります。
その場合、送信エラー時に詳細なエラーメッセージを表示するようにしてみてください。
エラーメッセージを見れば、何らかの対策を考えられるかも知れません。
まず、lib/MailForm.pmの351行目を、以下のように書き換えてください。
push @errmsg, $app->plugin->translate('Sending mail failed.');
push @errmsg, $app->plugin->translate('Sending mail failed.') . ' : ' . MT::Mail->errstr;
また、368行目でも上と同じ書き換えを行います。
書き換えが終わったら、MailForm.pmをアップロードし直します。
ただし、エラーメッセージを見ても、サーバーの設定等が原因で、こちらではどうにもできないこともあり得ます。
その場合は、申し訳ありませんが、当プラグインではメールの送信を行うことはできません。