メールフォームプラグイン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をアップロードし直します。

ただし、エラーメッセージを見ても、サーバーの設定等が原因で、こちらではどうにもできないこともあり得ます。
その場合は、申し訳ありませんが、当プラグインではメールの送信を行うことはできません。

MT Cloud Starter Kit
Movable Typeのプラグイン集「MT Cloud Starter Kit」をぜひご利用ください