パスワードを忘れた? アカウント作成
1383462 journal
PHP

oh-skyの日記: PHPのmail関数で添付ファイル付きのメールを送るときにつまづいたこと 2

日記 by oh-sky

送信元のMTAがPostfix(kagoya)、送信先がSendmail(sakura)の時に起こった謎挙動

$to="宛先";
$subject="件名";
$header ="From:差出人\r\n";
$header.="Content-Type: multipart/mixed;\r\n";
$header.=" boundary={$boundary}\r\n";
$body = "This is a multi-part message in MIME format.\r\n";
$body.= "\r\n";
$body.= "--{$boundary}\r\n";
$body.=Content-Type: text/plain;charset=ISO-2022-JP\r\n";
(中略)
$body.= "--{$boundary}--\r\n";
mail($to,$subject,$body,$header);

といったプログラムを動かしたときに、送信先に届くメールの最後が

--Boundaryの文字列--

--Boundaryの文字列--

っていうふうに、Boundaryの閉じが2つになってしまうんですよね。
プログラム中には $body.="--{$boundary}--\r\n"; が一行しかないのに。

"\r\n"を"\n"にすることでこの問題は発生しなくなったのですが、
そもそも何故こんなことが起こるのかがよくわかりますん。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by Anonymous Coward on 2012年01月16日 19時49分 (#2081479)

    この現象かどうかわかりませんが、それっぽい話がありました。

    2008/06/22(日) mail関数(PHP)のハマりどころ
    http://www.cpa-lab.com/tech/0149 [cpa-lab.com]

    • by oh-sky (30578) on 2012年01月16日 21時03分 (#2081536) ホームページ 日記

      mmm

      リンク先を見ると、本文はLF・ヘッダ関連はCRLFってなってますね。
      PHP公式のリファレンスにもそういう記述がされてます。
      http://jp.php.net/manual/ja/function.mail.php [php.net]

      ただ、私の試した環境でうまくいったのが、
      全体のヘッダ中はLFのみ
      各パートのヘッダもLFのみ
      各パートの本文中はCRLF
      という設定の時(本文はLFのみでも多分OK)

      良く分かりませんが、まぁ環境によって対応しないとダメってことですね。

      親コメント
typodupeerror

目玉の数さえ十分あれば、どんなバグも深刻ではない -- Eric Raymond

読み込み中...