先日、Xserverにサーバー移転した時の話です。メールフォームCGIからメールが飛ばなくなりました。
CGIの中身はsendmailを使っているだけのシンプルなフォームなのですがなぜかメールが飛ばない。もちろん移転前は飛んでいた。
エラーが出るかもという予想はしていましたが、エラーなしでメールが飛ばないケースは想定外だったので、結構焦りました。
この記事では、その時の対処方法をまとめておきたいと思います。
使用していたCGIはmailform
私は知らなかったのですが、結構有名なPerlのCGIのようです。
基本的には、send.cgiというファイルだけで動くシンプルなファイル構造で、メールの送信はsendmailを呼び出してテキストを投げているだけ。
郵便番号からの住所自動入力や送信ログのダウンロード機能もある。
問題の現象
フォームから送信ボタンを押しても、全然メールが届かない。自動返信メールも来ない。
mailformで送信できない時の対処方法
mailformなのかsendmailなのか問題を切り分ける必要があります。
コマンドラインでsendmailでメールが送れるか?
コマンドラインでメールを送信してみました。
echo Meowning! |sendmail hotaru@example.ne.jp
送れることがわかりました。
sendmailは生きています。
sendmailの使い方が悪いのか?
使い方の問題なのかと思って調べると、それらしい記事が見つかりました。
send.cgiの中身を確認すると、-tオプションが使われていたので、-tをやめて直接コマンドラインで指定するように変更しました。
そうしたら送れるようになりました。
sub sendmail {
my($mailto,$mailfrom,$subject,$body) = @_;
if($conf{'geoplus'}){
$mailfrom = $conf{'mailto'};
sleep(3);
}
# open(MAIL,"| $conf{'sendmail'} -f $mailfrom -t");
open(MAIL,"| $conf{'sendmail'} -f $mailfrom $mailto");
# print MAIL "To: $mailto\n";
print MAIL "Errors-To: $mailto\n";
print MAIL "From: $mailfrom\n";
print MAIL "Subject: $subject\n";
print MAIL "MIME-Version:1.0\n";
print MAIL "Content-type:text/plain; charset=$conf{'charset'}\n";
print MAIL "Content-Transfer-Encoding:7bit\n";
print MAIL "X-Mailer:Web Mail Delivery System\n\n";
print MAIL "$body\n";
close(MAIL);
}
まとめ
CGIのフォームからメールを送れない時はsendmailの-tオプションをやめて、コマンドラインで指定しましょう。