• ベストアンサー

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

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

  • PHP
  • 回答数5
  • ありがとう数10

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

  • ベストアンサー
  • 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

  • メール配信リストからエラーメールを自動で削除する方法

    メールマガジン配信でいつまでも 存在しないメールアドレスへメール送信しないように したいのですが以下2つの方法のいずれかを された事がある方はおられますか? 1.メールログを1日毎にプログラム解析する 2./etc/aliasに指定したメールアカウントerror等に エラー時にメールが返されるように メールヘッダにX-Errto:error@自ドメイン を記述してメール配信し、aliasで指定した プログラムでエラーメールアドレスを自動削除 できればエラーメールアドレスがすぐにわかる 2.で実現したいですが、X-Errtoのヘッダはあまり 聞かないので果たしてできるのかがわかりません。

  • メールアドレスのみを抜き出す方法

    phpでメールの返信プログラムを作成しています。 メール送信プログラムはできたのですが、さんぷる<exsample.com>やexsample.com(sample)といった文字列の中からメールアドレスのみを抜き出す方法がわかりません。 ご教授よろしくお願いします。 動作環境:Windows+Apache2.0.52+php4.4.2

    • 締切済み
    • PHP
  • メールのCCに複数のアドレスを指定する時の記述

    PHPでメール配信処理をしています。 TOもしくはCCに複数のアドレスを指定する時に「,」(カンマ)で指定することで 複数のメールアドレスに配信されるという認識でPHPコードを記述しました。 しかし、TOは正常に配信されますがCCだけ最後に指定したアドレスが配信されないです。 Webで調べましたが、やはり分からないのでアドバイスいただきたいです。 OS:CentOS release 5.4 PHP 5.1.6 mb_language("ja"); mb_internal_encoding("UTF-8"); $header = "From: " . mb_encode_mimeheader("TOサンプル") . "<" . $from . ">\n"; $header .= "Cc: " . mb_encode_mimeheader("CCサンプル") . "<aaa@sample.com>"; $header .= "," . mb_encode_mimeheader("$cc") . "<" . $cc . ">"; mb_send_mail($to, $sub, $data, $header) or die ("メールの送信に失敗しました"); aaa@sample.com は常にCCに入れるためここで記述しています。 受信後のメールのヘッダを見ると下記のようになります。 <"bbb@sample.com, ccc@sample.com, ddd"@sample.com> 最後に指定したメールアドレスの「@」の直前に「"」が入ってしまい メールアドレスのフォーマット要件を満たしていないため配信されないことは分かったのですが、 何故こうなるかが分かりません。 TOに同様に「,」区切りでメールアドレスを複数指定すると、問題なく配信されます。 cat -e で改行コードもチェックしましたが問題ないです (全て末尾に「$」が付いたため) 宜しくお願いします。

    • ベストアンサー
    • PHP
  • QRコードでメールアドレス以外の情報を取得

    QRコードで読み取ったメールアドレスに空メールを送信すると、なんらかのプログラムが実行されるというのはよくあると思います。 読み取る際に、メールアドレスでけでなく、件名や本文も読み取れるような記述方法ってないでしょうか? 要は、パラメータのように、ある値を渡したいのです。

  • mail関数のheader情報

    PHPのmail関数のheader情報には、メールの件名、送り先メールアドレス、差出人メールアドレス等々が指定できますが、上記以外に独自の(独自に作成した基準の)情報を加えてもメールの送受信に問題は起こらないのでしょうか? 例えば、ヘッダー情報に「AB123」など独自の記号を加えて、受信者のメールソフト内で、その記号により自動的にメールを振り分けたいのですが? もちろんこれには、受信者がメールのヘッダーに独自の記号が不可さていることを予め知っていて、かつ、メール振り分け機能のついたメールソフトを使用していることが前提です。 また、上記が可能な場合、そのやり方などが詳しく記載されているサイトなどお知りでしたら、お教え下さい。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • メール送信失敗アドレスを取得

    一括メール送信プログラムで送信した際、リターンメールで指定アドレスへ返ってくるメールの送信先アドレスをPHPで取得する方法ってありますか? 要は送信できなかったアドレスを一覧で見れるようなシステムを作りたいんです。

    • 締切済み
    • PHP
  • TimerProc コールバック関数を利用する方法

    タイマを使いたくてメッセージマップでOnTimerを追加しましたが、 CWnd::SetTimerの第3パラメタに何を設定したらよいかわかりません。 lpfnTimer WM_TIMER メッセージを処理するためのアプリケーションが用意した、 TimerProc コールバック関数のアドレスを指定します。 このパラメータが NULL の場合は、WM_TIMER メッセージはアプリケーションの メッセージ キューに置かれ、CWnd オブジェクトによって処理されます。 とあり、NULL指定のサンプルはあるのですが、 「TimerProcコールバック関数のアドレスを指定する法」を試したいのです。 関数のアドレスというのが何をいっているのか理解できないのですが 試しに void CXXXCtrl::method1() { SetTimer(timerID, 10000, &OnTimer); } void CXXXCtrl::OnTimer(UINT nIDEvent) { // 処理 COleControl::OnTimer(nIDEvent); } としたところ error C2276: '&' : 仮想関数のアドレスを取ろうとしました。 のエラーになってしまいます。

  • mail関数を使った場合のReturn-Pathは?

    Apache 1.3.33 PHP Version 4.4.1 $header = "From:".$_from; $header .= "Return-Path:".$_from; のようにヘッダー部を設定し、mail関数を使っています。 $result = mail($_email, $subject, $message, $header); しかし、Return-Pathが反映されていないようで、 メールが届かない場合などの、 「failure notice」メールが Apache側で設定されているメールアドレスに 送信されてしまいます。 どのように設定すればよろしいのでしょうか? またパラメータを使って $header = "From:".$_from; $para ="-f".$_from; $result = mail($_email, $subject, $message, $header,$para) 上記のように記述してみたのですが、だめでした。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPのメール関数について

    メールマガジン発行を考えているのですが、 読者のメールアドレスをMysqlに格納し、 PHPのメール関数で配信しようと思っています。 そこで、PHPのメール関数とは、 PHP→そのサーバのMTA→相手MTA と行くのでしょうか? それとも、 PHPメール関数自体が直接DNSサーバを探し確認した上で、 相手MTAに送信するのでしょうか? (つまりMTAを利用しないのでしょうか?) 基本的な質問で申し訳ございません。 MTAを利用するのなら配信スピードがqmailの方が 良いと聞きますので、sendmailから変更しようかと 思っています。 宜しくお願いします。

    • ベストアンサー
    • PHP
  • System関数で変数を受け渡す方法

    Apache+PHP+MySQL1でサイトを作っています。 時間がかかる処理をバックグラウンドで処理したいのですが、メイン処理の変数をバックグラウンド処理に受け渡したいのですがうまくいきません。 http://www.stackasterisk.jp/tech/php/php02_02.jsp インターネットで調べたところ上記URLが見つかったので参考にサンプルを作ってみました。 --------sample.php(メイン処理)------- <?php $arg = 123456; System("/usr/local/bin/php bgprog.php $arg &"); ?> --------bgprog.php(バックグラウンド処理)------- <?php sleep(10); echo "読み込み完了<br>"; echo $arg; ?> このサンプルだと10秒スリープした後に「読み込み完了」と表示されるのですが$argが表示されません。 上記URLに「メインの処理から引数を渡したい場合には、bgprog 側できちんと受け取るようにしておかなければなりません」と書かれているのですがその方法がまったくわかりません。 このプログラム自体に無理があるのか、bgprog側でなんらかの処理をすれば解決するのかもわかっていません。 よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう