[PHP-users 32445] Re: mail 関数について

KKuji_Y2a kkuji @ mwb.biglobe.ne.jp
2007年 7月 16日 (月) 16:24:57 JST


KK @ IB です
以下、何か勘違いがあればご指摘ください。

http://www.webpipe.net/howto/Php_mail_envelope_header

Example Code: (envelope fromの指定法)

$to_address     = "somebody @ somewhere.com";
$email_subject  = "Subject of your message";
$email_body     = "This is the body of the email message!";
$email_header   = "From: Website Name <from_address @ your_domain.com>\r\n";
$sendmail_args  = "-fbounce_address @ your_domain.com";
mail($to_address, $email_subject, $email_body, $email_header, 
$sendmail_args);

上記は、英語圏なので、mb_send_mailを使っていませんが、
-f以下の部分が、envelope fromの部分だと思います。
($email_header   = "From: Website Name <from_address @ your_domain.com>\r\n"; は
envelope のfromではないようです。)

あて先の該当ないメールは、このenvelope fromにエラーで返ってくるのが普通です。 

(http://sec.ntt.com/glossary/ja_ha/bounce_mail.html など)
これが指定されていない場合、headerのFROMに返ってくる場合と、送信サーバーの管理者へ返る場合とあるようです。

ここへエラーメールが返ってきたかの調べ方ですが、popで受信してみればよいのですが...
pearか何か使うと便利かな。
(この投稿の末尾にPEARを使わないサンプルを引用しておきます。)

上記-fは、代表的なMTAであるsendmailのコマンドですね。
http://sonic64.com/2004-11-07.html

envelope fromについては、上鍵さんという方が熱心に、書かなければだめ、という具合に説いておられたと記憶しています。
前に(昨年、8月〜9月あたり)、このMLで、この件も含めいろいろやり取りがありました。
http://suika.fam.cx/~wakaba/-temp/wiki/wiki?envelope%20from
http://blog.poyo.jp/

なお、先日も書きましたが、RFC2821を是非ご覧ください。
参考になると思います。(下記再掲)
http://www.puni.net/~mimori/rfc/menu.html

また、メールのやり取り、送受信に関しては先日も言及しました川崎 高志さんのcmail 
writer(特にソースや吐き出すlog)や、
馬場 達夫さんのbasp21というモジュールなども参考になるかと思います。

参考:(受信)
 $sock = fsockopen($host, 110, $err, $errno, 10) or die("サーバーに接続できません");
 $buf = fgets($sock, 512);
 if(substr($buf, 0, 3) != '+OK') die($buf);
 $buf = _sendcmd("USER $user");
 $buf = _sendcmd("PASS $pass");
 $data = _sendcmd("STAT");//STAT -件数とサイズ取得 +OK 8 1234
 sscanf($data, '+OK %d %d', $num, $size);
 // 件数が0の場合は、終了する。
 if ($num == "0")
 {
  $buf = _sendcmd("QUIT");
  fclose($sock);
  exit;
 }

 // 件数分
 for($i=1;$i<=$num;$i++)
 {
  //RETR n -n番目のメッセージ取得(ヘッダ含)
  $line = _sendcmd("RETR $i");
  //EOFの.まで読む
  while (!ereg("^\.\r\n",$line)) {
   $line = fgets($sock,512);
   $dat[$i].= $line;
  }
  //DELE n n番目のメッセージ削除
  $data = _sendcmd("DELE $i");
 }

 // 終わり
 $buf = _sendcmd("QUIT");
 fclose($sock);

/* コマンド送信!! */
function _sendcmd($cmd) {
 global $sock;
 fputs($sock, $cmd."\r\n");
 $buf = fgets($sock, 512);
 if(substr($buf, 0, 3) == '+OK')
 {
  return $buf;
 }
 else
 {
  die($buf);
 }
 return false;
}

なお、以下も参考になるはずです。
http://www.phpguru.org/static/pop3.html


>> > メールを何時配信するかどうかはMTA間のやりとりで決まるので、Envelope-From
>> > に指定されている送信者アドレスにFairue Noticeが返ってくるかどうかで判断
>> > するしかないでしょうね。
>>
>> で処理した方が賢明かと思います。
>
> こちらの処理について、詳しく具体的に知りたいのですが参考になるサイトまたは
> 書籍などありますか?



PHP-users メーリングリストの案内