PHP関数を使用して電子メールを送信するスクリプトを作成するmail()
と、新しい行に関する問題が発生します。Unixシステム上のPHPは、ドキュメントLF
に記載されていることにもかかわらず、ヘッダーが文字で区切られていることを想定しています。その後、sendmailはこれらを正しいに置き換えます。ただし、Windowsでは、メッセージとヘッダーは提供されたとおりに送信されます。これは、長期にわたるPHPバグレポートで説明されています。CRLF
したがって、Windowsで使用および使用するには、システムがUnixバージョンのsendmailを実行しているかどうかを検出する方法が必要です。私は知っていますが、これを処理するためのよりエレガントな方法があるかどうか疑問に思っています。LF
CRLF
PHP_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:
)がメッセージ本文の一部になります。
–実際にはPHP 5.3のバグであり、修正されました。X-PHP-Originating-Script
PHPは実際には、行末が正しくないヘッダーを挿入します。これは副次的な問題ですが、それでも厄介です。
このクロスプラットフォームを処理する理想的な方法に関するアイデアはありますか?
ありがとう、
アロン