• ベストアンサー

CGI(Perl)からメールを送信するには

ゲストブックに投稿があった際、メール(sendmail)で通知するように改造中です。 メールを送信するには、件名をMIMEエンコードするのが決まりだと知りましたが、下記の送信処理には含まれていないのでしょうか? また、送信処理に不備があるようでしたら、アドバイスを頂ければありがたいです。 送信処理は以下の通りで、書き込み処理(ログファイルに書き込む処理)の直後に加えています。 投稿者は「$in{'name'}」で、投稿内容(本文)は「$in{'body'}」です。 CGIの漢字コードはシフトJISで、改行コードはCR+LFです。 # sendmailのパス $sendmail = '/usr/sbin/sendmail'; # 送信先 $tomail = 'ooooo@ooooo.ne.jp'; # 送信者 $frommail = 'xxxxx@xxxxx.ne.jp'; # 件名 $subject = "ゲストブックに投稿がありました"; # 送信 open (OUT,"|$sendmail -t"); $send = ""; $send .= "To: $tomail\n"; $send .= "From: $frommail\n"; $send .= "Subject: $subject\n"; $send .= "\n"; $send .= "【 名 前 】 $in{'name'}\n\n"; $send .= "【 内 容 】 $in{'body'}\n\n"; &jcode'convert(*send,'jis'); print OUT $send; close (OUT); それから、もうひとつ気になることがあります。 投稿された際に送信される時とされない時があり、4~5時間後にまとめて届くこともありますが、届かないままのものもあります。 届かなかったメールはどこに行ってしまったのでしょうか? サーバの管理者へ届く・消えてしまう場合、私宛にエラーメール(?)を返すことはできないでしょうか? 差し支えなければ、こちらについてもアドバイス頂けると嬉しいです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

(1)件名をMIMEエンコードする処理 このソースにはエンコード処理は入っていません。Jcodeの$j->mime_encode メソッドを使いましょう。 (2)エラーメール SMTPでエラーが出ている物に関しては、sendmailに-fオプションでエラー時のメールの飛び先を指定することで受け取ることができるかもしれません。お試し下さい。 ただし、エラーにもいろいろあります。遅延はエラーではないのでエラーメールは返ってきませんし、SMTPでは正常に受領されるのに、改めてreply-toなど宛てにエラーのお知らせメールを送ってくるプロバイダもあります。迷惑メール対策として、User Unknownなのに正常で受け取ったふりをしてそのまま捨ててしまうプロバイダもあったりします。メールの送信に関しては、 100% 正確にエラーを拾うのは難しいです。

ka_mu
質問者

お礼

お返事が遅くなり、申し訳ありませんでした。 私が書き込んだ処理には、MIMEエンコード処理は含まれていないのですね。 書き込んだ処理は、検索してsendmailでメールを送信する方法を知り、そのソースをそのまま(使用している変数などを書き換えて)利用させてもらっています。 検索した結果、「件名をMIMEエンコードをしなくてはいけない」と書いてあるところや、「base64というものにエンコードしなくてはいけない」という記述もありました。 ですが、私が書き込んだ処理だけで簡単にメールが送れると書いてあるところが多くありましたので、その処理だけを施して送信しても問題ないのかとも思えますが、やはり差し支えがあるのでしょうか?(他の受信環境で文字化けが起こるなど) sendmailを使うのが初めてなので、基本的な事を理解しておらず、何がなんだか分からない(どの記述が正しいのか判断できない)とのが現状です。 Jcodeというのは、Jcode.pmのことでしょうか? モジュール(?)を使ったことがないので、インストールする方法や利用方法も分かりませんし、時間が取れるようになったら検討したいと思います。 エラーメールの件。 open (OUT,"|$sendmail -t -f"); という風に書き換え、何度かテストしてみましたが、送られてくるはずのメールもエラーメールも届きませんでした。 しかし、丸一日経過して遅れて届く場合もあるので、もうしばらく様子を見たいと思います。 メールが何処にも届かず行方不明になっているのか、エラーでサーバ管理者に届いているのか、単に遅れているだけなのか、エラーが返って来るとそれらを判断する材料になるのではないかと思っただけですので、できないのであればそれで構いません。お手数をお掛けしました。 丁寧にお答え頂いて本当にありがとうございました。 エラーメールに関しては、見て回ったサイトよりも分かりやすく、大変勉強になりました。感謝致します。

ka_mu
質問者

補足

書くところがないので、こちらに書き込みます。 sendmailを利用してメールを送信する場合の正しい知識というのは、どういうサイトや書籍を参考にすればよいのでしょうか? サイトによって記述がバラバラで、どれが正しいのか、最低限処理しなければならないものがどれなのかすら分かりません。 参考になるサイトや書籍をご存じの方がいらっしゃいましたら、アドバイス頂けると嬉しいです。 16日に引っ越しをするので、数週間アクセスできません。 ですから、16日の夕方くらいまでに1さん・2さん・その他の方からお返事がない場合は、締め切りたいと思います。 それまでに何かありましたら、ご指摘・ご指導よろしくおねがい致します。 長文、失礼しました。

その他の回答 (1)

  • maura
  • ベストアンサー率46% (48/104)
回答No.1

・4~5時間後にまとめて届く 現在使用されているサーバのメール送信の処理が 非常に重たい状態だと推測できます。 ご使用されている、サーバを管理している人に 「メールの遅延」起きているか確認をとってみはどうでしょうか? --- ・サーバの管理者へ届く・消えてしまう場合、私宛にエラーメールを返すことはできないでしょうか? メールが正常に動作しない状態のようですので、 ログに書き込んでみては? Open(LOG,">>mail.log"); print LOG $send; close (LOG);

ka_mu
質問者

お礼

お返事が遅くなり、申し訳ありませんでした。 メールがまとめて届くのは、恐らくメールの遅延が原因かと思います。 しかし、届かないままになっているものは、何処へ行ってしまったのでしょう? 届いたり届かなかったりするのであれば、ゲストブックに投稿があった際に通知する意味がないので、もう少し安定して届くようにならないかと、頭を悩ませています。 ちなみに、3件の書き込み(メール通知)があった場合、一通は数時間遅れで届き、一通は行方不明、残り一通は瞬時に届くか数時間遅れで届いている状態です。 現在は動作確認中なので、送信先も送信者も私自身ですが…。 教えて頂いた通りにログに書き込んでみたのですが、正常(期待通り)に書き込まれていました。 また、メール通知処理の直前に投稿内容をログに書き込む処理があるのですが、そちらも問題なく書き込まれています。 ローカルだときちんと動作し、メールも全て届くので、もしかするとサーバ側に問題(?)があるのかもしれません。 今は時間が取れませんが、落ち付いたらサーバ管理者に問い合わせてみようと思います。 丁寧にお答え頂いて本当にありがとうございました。感謝致します。