Perl/CGI研究室 'PERL-LABO'

Perl/CGI研究室 'PERL-LABO' TOPへ
戻る(History.Back)

エラーメール取得の研究

研究内容

sendmailで送信したメールの宛先が存在しないメールアドレスだった場合、 通常はエラーメールが返ってきますね。ところが、今までに作成したメール送信関数では、 メールの宛先が存在しないメールアドレスの場合でも、 エラーメールが返ってこないようです! これでは、宛先が間違っていてもそれに気が付かないことになります。 修正しましょう。

詳細

エラーメールは誰に送られる?

メールの宛先が存在しないメールアドレスの場合、自動的に送られるエラーメール、 誰に宛てられて送られるんでしょうか? これは当然、送り主ですよね。送り主は、From: で指定するんでした。 ところが、これ、間違いです。エラーメールは、From: で指定した送信元メールアドレスに 送られるのではなく、sendmailを実行した、そのサーバーのアカウントの人に送られるみたいなんです。

通常、ウェブサーバーではsuExecという機能によって、CGIプログラムは"自分"によって実行されるんでしたね。 だから、CGIファイルには"自分"に実行権を与えるんでした。 で、sendmailは、sendmailが実行している、そのサーバーのアカウントを知っていて、 エラーメールをその人に送るんだそうです。

エラーメールを受け取る人を指定したい

エラーメールは、Fromに送って欲しいですよねぇ。 エラーメールを受けとる、そのアカウントの人が、そのアカウントに届いたメールを 読める環境にあるかどうかだって分かりませんし。 メールを読めない場合、エラーメールは事実上消えてなくなることになります。 これは困った。

それで、エラーメールを受け取る人を指定したいわけです。 Fromのメールアドレスにエラーメールが送られるようにしたいわけですね。 調べてみて、その方法が分かりました。 sendmailを開くときに、次のオプションを付けます。

sendmail -f (メールアドレス)

この -f オプションによって、送信元のメールアドレスを指定すると、 このアドレスにエラーメールが送られるんだそうです。 ホッ。簡単ですね!

ということで、メール送信関数を修正しました。

作成したCGIプログラム

(変更点のみ記載)

(変更前)
	if (! open(MAIL, "| $sendmailpath -t")) {
		return 0;
	}
(変更後)
	if (! open(MAIL, "| $sendmailpath -t -f $from_adr")) {
		return 0;
	}

考察

動きました!

わざと存在しないメールアドレスをToに指定してみてテスト。 ちゃんと、エラーメールを受け取ることができました!

実は…

以前作って、このサイトで使っている掲示板CGIプログラムですが、 書き込みがあったらメールで管理人にその書き込みを通知する機能を付けています。 それがちゃんと動いていませんでした。 書き込みがあっても、メールの通知が来ないんですよ! それで調べたところ、メールの送信先アドレスを間違えていたことが分かり、 正しいアドレスに変えたらちゃんと送られるようになりました。 それで一応解決したんですが、疑問に思ったのは、「なぜエラーメールが来ないのか?」でした。 ということで、さらに調べて、その結果がこの研究です。 いやー、奥が深いというか、いろいろトラブルが起きますね (^^;

Perl/CGI研究室 'PERL-LABO' TOPへ
戻る(History.Back)

Copyright (c) 'PERL-LABO' All Rights Reserved.  リンクフリーです。