人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPのmb_send_mailでメール送信をしています。

送信が成功すればDB(MySQL)に送信先の情報を保存し、失敗しても「送信出来なかった」という情報を保存出来ればと思います。

有効でないメールアドレスにメール送信を行った場合、エラーメールが返ってきますが、そのエラーメールを解析(メールサーバを解析する?)し、DBに保存するしか方法はないのでしょうか?

出来ればPHPだけの対応で「メールが送れた/送れなかった」が判別出来ればと思います。

完璧でなくても結構ですので、「このような方法は使える」というのがありましたら、教えて下さい。PHPは5.2.0を使っています。

●質問者: kt26
●カテゴリ:ウェブ制作
✍キーワード:2.0 dB MySQL PHP エラー
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● ttomo
●35ポイント

PHPの中で、相手先MTAを探してそこに送る方法をとればある程度のエラーはオンラインで吸収できます。

ただ画面応答を返すのはその分遅くなってしまいますが…。

方法としては、通常のWebアプリであれば

  1. デフォルトのメールサーバの25/tcpに接続して
  2. From/Toを送信してメールを送る

というプログラムにして、デフォルトのメールサーバより先(受信者側)への送信はメールサーバに任せてしまいます。

この実装であれば、メールアドレスの誤り(「@」の左の誤り・右の誤り)はほとんどオンラインのWebアプリで知ることはできません。

これを

  1. メールアドレスの「@」より右をキーにしてDNSのMXレコードを引き
  2. メールサーバが得られなければエラーとする[エラー1]
  3. メールサーバが得られればそのサーバの25/tcpに接続して
  4. From/Toを送信してメールを送る。その時メールサーバからエラーが返ることがある[エラー2]

という風に変更すると、一定範囲のエラーはオンラインWebアプリで拾うことができます。

つまり@の右側を間違えて taro@hattena.ne.jp などとしたときはエラー1になりますし、

@の左側を間違えてttaro@hatena.ne.jp などとしたときはエラー2になることがあります。

どちらの場合も偶然他人に一致した時はエラーになりませんし、

@の左側の間違いについてはあえてエラーとしない(黙って無視する)設定になっているメールサーバも存在しますので完璧ではありません。

企業などでは、MXレコードで公開しているサーバでいったん黙って受け取って、さらに社内のメールサーバにリレーしている場合もありますので、その場合もオンラインWebアプリではエラーを検出することはできません。


環境的に、PHPが稼働しているサーバがグローバルのDNSを引ける、かつ、任意のメールサーバにconnectできる環境なら使えると思います。

頑張ってください。

◎質問者からの返答

回答ありがとうございます。

つまり「サーバをいじらないと駄目・サーバの知識が必要」と言うことですね。

本質問の求めていた回答と異なりますが、考え方・意味としては理解出来ます。ありがとうございました。


2 ● tezcello
●35ポイント

「メールを送った」と「メールが届いた」とは違います。

PHP の mail(), mb_send_mail() では、届いたかどうかまでは関知しないのでは?

(多分設定されているMUAにパラメータを渡す事が出来たかどうかが返り値として得られると思います)


それをする為には、PHP で MUA を作る(=最初の回答者さんの考え方)の他にも、

の方法が考えられると思います。

◎質問者からの返答

そうですね。とりあえず、DBに保存するのは「送った先」としたいと思います。

もう一歩上の仕様にする時は、メールサーバも勉強します。


回答ありがとうございました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ