• ベストアンサー

mail関数を使用した場合のエラー情報取得方法

みなさん。宜しくお願いいたします。 現在、PHP3.0を使用して「プログラムからのメール配信」の処理を作成しています。ここで困ったことに、「存在しないメールアドレス(入力間違いなど・・)にメール配信」した場合、当然、届かないのですが「届かなかったよ!(address unknow・・?)」みたいな情報を「プログラムで指定したメールアドレス」に返信させたいのですが、どのように記述するのか分かりません。(多分・・PHP上で記述する「ヘッター情報のパラメータ部分」に問題ありと考えていますが・・) 誰か教えてください・・サンプルがあれば大変うれしいです。

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

  • ベストアンサー
  • tujige
  • ベストアンサー率68% (13/19)
回答No.5

このスペースでは詳しく書けないのですが、envelope from を指定しない場合、phpから送信されたメールの from (この from はメールのヘッダにある from ではありません。smtp session での from です。)は、apache のユーザー、つまり大半の apache では、nobody となっているはずです。 で、結果として、nobody, MAILER-DEAEMON, postmaster, root のいづれかにかえってきているんでしょう。 もういちど、sendmail の -f オプションを確かめてみては? # 別に、情報の出し惜しみをしているわけではないです。:-) # こういったプログラムを書く場合「関数があるから」ではなく、メールが送信 # されるプロセスを知っておいたほうがよいからです。 # ちなみに、y-boss さんの求めている「そのものズバリのサンプル」 # はしっかり検索すればありますよ。 # php のメーリングリストを検索してみては?

y-boss
質問者

お礼

アドバイス・・大変有難うございます。頑張って調べてみます。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • tujige
  • ベストアンサー率68% (13/19)
回答No.4

すいません。チャチャになるかもしれませんが :-) Reply-To: は、返信のアドレスであって、y-boss さんのおっしゃっている届かなかった場合の戻りアドレスは、 Return-Path: ではなかったでしょうか?(Errors-to: もあったと思いますが、あれはすでに時代遅れですよね?たしか。) で、sendmail の -f オプションは envelope from を指定して送るオプションですので、結果として、Return-Path: がそのアドレスになるはずです。 Host unknown, User unknown 等々のエラーがそのアドレスに戻ってきます。 たとえ、追加ヘッダ情報(mail関数の第4引数)に Return-Path: を書いたとしても、envelope from が指定されていなければ効力は持たなかったような気がします。 で、私の環境では、wrap script を用意して envelope from を追加するようにしているわけであります。 PHP 4.0.5 から、第5引数としてコマンドラインパラメーターを指定できるようになって、便利になったな。と感じております。 # すいません。チャチャでしたね。

y-boss
質問者

お礼

色々と有難うございます。日夜頑張っております。本当に皆さん詳しいですね~(尊敬です)ところで、mail関数にて皆様が言われていることを実際にやってはみたのですが「???(戻ってこない)」のです。この文章で気になったのは、「たとえ、追加ヘッダ情報(mail関数の第4引数)に Return-Path・・・・」なのですが、この「envelope from 」なるものもヘッダー情報として記述するのですか?またまた、Sendmailの難しい指定の中に隠れているのですか?教えてください!

y-boss
質問者

補足

//$mail_buf : 送信先メールアドレス格納 //$mailtitle : 件名格納 //$msgbuf : メール本文格納 //$headers : ヘッダ格納 $headers = "From: " . $e_mail . "\n"; $headers .= "X-Sender: " . $e_mail ."\n"; $headers .= "X-Mailer: PHP3 Engine\n"; // メイラー //$headers .= "X-Priority: 1\n"; // 緊急メッセージ! $headers .= "Return-Path: " . $e_mail . "\n"; // エラー時の返信先 $headers .= "Reply-To: " . $e_mail; //mail送信 $rtn1=mail("$mail_buf", "$meiltitle", "$msgbuf","$headers"); ※こんなロジックになっているのですが・・・?

すると、全ての回答が全文表示されます。
  • alfeim
  • ベストアンサー率58% (114/195)
回答No.3

wrap scriptを作る、というのはsendmailやqmailなどのMTAプログラムを呼び出し、それにメール本文を渡すことで送信するメール本文をより詳細に指定することです。 これ以上の事をしようとするとMTAを使わず、自身でSMTPを話しメールを送信する必要が生じます。 なお、PHP3のMail関数でもHeader情報操作できますんでtujigeさんのかかれてる方法を使わなくでも大丈夫です(^^; なお参考URLのレファレンスを見ると第4引数に拡張ヘッダを記述するので・・・ mail("送信先メールアドレス", "Subject", "本文", "Reply-To: 戻り先アドレス"); と記述すればReply-Toに記述したアドレスにErrorメールが戻ってくるはずです(相手のMTAがまともならば、という注釈付ですが。NTT DocomoはFromヘッダのみしか見てなかった可能性あり)。 >プログラム作るなぁ~ とはいいませんが、(最初はみんな何も知りませんし)まずは社内にサンドボックス程度は作れる程度の知識は身につけてから、にした方がよいでしょう。 いきなり外部のサーバに向けて実験では正気を疑われても文句は言えません。 なお、あまり自信がないのであれば、この辺外注にしちゃったほうがよいと思います。なにせ、相手はInternetでつながった世界中のサーバ、ということなんで下手打つと自分だけでなく外のサーバにも迷惑がかかりますので。 そのトラブルが元で会社の信用度とかも落ちる、ということも上に説明しておけば外注にすることも考えさせやすいかもしれません。 とりあえず、自分たちで何とかするのであれば・・・DNSによる名前解決の原理、メール配送原理、RFC822、SMTPによるメール配送手続き、あたりは最低限の知識として身につけておきましょう。 すでに立ち上がってるサーバの設定がなされているのであれば、その管理者に聞けばどのような本を読めばいいかぐらいは聞き出せるでしょう。

参考URL:
http://www.php.net/manual/ja/function.mail.php
y-boss
質問者

お礼

外注ですよね~考えたのですよ!それも・・残念ながら「そこらへんの事ができる開発屋」が身近にいなかったのです・・また、「高いし・・・」ってなことで、自力での開発になってしまいました・・トホホ!再度、挑戦いたします。

すると、全ての回答が全文表示されます。
  • tujige
  • ベストアンサー率68% (13/19)
回答No.2

Unix系か、Win系かわからないので外しているかも知れませんが、php3を使用されているなら、MTA の wrap script を書くのが手っ取り早いです。 で、その script へむけて、php3.ini の sendmail_path を記述する。 sendmail なら、-f オプションをつけてあげればいいです。 ただ、alfeim さんもおっしゃっているように、RFC を一度読んだほうがよいかと。 mail 関数を使用しない方法でメールを送信できるようになれば、-f オプションの意味が理解できると思いますよ。 ちなみに、PHP 4.0.5 以上なら mail 関数の引数にパラメータを渡せるようになっています。

y-boss
質問者

お礼

ご協力!大変有難うございます。お話にあるように「RFC」なるものを読んでは見ているのですが???(サッパリ)です・・トホホ!でも、頑張っています。それでですが ・「MTA の wrap script を書くのが手っ取り早いです。で、その script へむけて、php3.ini の sendmail_path を記述する。 」 この言葉が今現在理解ができていません。(勉強不足・・パンチ)情けないばかりで、こんなもんも知らんかったら「プログラム作るなぁ~」と言われそうなの覚悟で・・・教えてください。どうやって、記述するのですか?おしえて~

すると、全ての回答が全文表示されます。
  • alfeim
  • ベストアンサー率58% (114/195)
回答No.1

http://www.asahi-net.or.jp/~bd9y-ktu/dtd_f/rfc_f/rfc822j.html 但し物が古いので最新版では異なっている可能性があります。 4.4.4. FROM / SENDER / REPLY-TOの自動利用 このあたりが参考になるかと。(機械翻訳っぽい臭いがしますので原文を用意する事をオススメします) もっとも勧告を守らない無作法なサーバもありますので有名なサーバ群でテスト下方が良いと思いますが。 ちなみにこいつ(RFC822)をまじめに守ると一部携帯ユーザにメール出せません(笑)

y-boss
質問者

お礼

お礼の旨が遅くなりまして、大変すみませんでした。有難うございます。今回のシステムは「社内(社外も含め)社員の連絡システム」として作成しているものです。残念なことにこのシステムに携わっているのが「技術オンチ」の私と新人2名での開発体制で、全然前に進まないのが現状です。alfeimさん。実を言いますと、上記資料を読んだのですが、「サッパリ」わかりませんでした・・・トホホ!大変ご迷惑かとは存じますが、「PHP3.0で記述したサンプル」みたいなものを教えていただけませんか?宜しくお願いいたします。

すると、全ての回答が全文表示されます。

関連するQ&A