1

PHP関数を使用して電子メールを送信するスクリプトを作成するmail()と、新しい行に関する問題が発生します。Unixシステム上のPHPは、ドキュメントLFに記載されていることにもかかわらず、ヘッダーが文字で区切られていることを想定しています。その後、sendmailはこれらを正しいに置き換えます。ただし、Windowsでは、メッセージとヘッダーは提供されたとおりに送信されます。これは、長期にわたるPHPバグレポートで説明されています。CRLF

したがって、Windowsで使用および使用するには、システムがUnixバージョンのsendmailを実行しているかどうかを検出する方法が必要です。私は知っていますが、これを処理するためのよりエレガントな方法があるかどうか疑問に思っています。LFCRLFPHP_EOL

現在、ドキュメントで指定されているように、メッセージを作成しています。

<?php
$to      = "example@website.com";
$subject = "Email Subject Here";
$message = "Hello this is a plaintext\n message with a line break.";
$headers = array(
  "From: webmaster@example.com",
  "Reply-To: webmaster@example.com",
  "X-Mailer: PHP/" . phpversion()
);

$success = mail($to, $subject, $message, join("\r\n", $headers));
if ($success) {
    echo "Mail Sent\n";
} else {
    echo "Mail Failed\n";
}

Unixシステムでは、これにより次のメッセージがsendmailに送信されます(テキスト表現\r\n置き換えられました)。

To: example@website.comLF
Subject: Email Subject HereLF
X-PHP-Originating-Script: 501:mail.phpLF
From: webmaster@example.comCRLF
Reply-To: webmaster@example.comCRLF
X-Mailer: PHP/5.3.1LF
LF
Hello this is a plaintextLF
message with a line break.LF

これがsendmailに渡されると、すべてLFが置き換えCRLFられ、キャリッジリターンが重複します。CR一部のメールサーバーは、この追加を置き換えてCRLF改行を追加し、すべてのヘッダー(この場合は後From:)がメッセージ本文の一部になります。

X-PHP-Originating-ScriptPHPは実際には、行末が正しくないヘッダーを挿入します。これは副次的な問題ですが、それでも厄介です。–実際にはPHP 5.3のバグであり、修正されました。

このクロスプラットフォームを処理する理想的な方法に関するアイデアはありますか?

ありがとう、

アロン

4

1 に答える 1

1

これは、初期の 5.3 リリースではかなり一時的な欠陥でした。このバグ通知を参照してください。

PHP をアップグレードする

于 2010-07-16T12:24:04.777 に答える