4

PHP で HTML 電子メールを送信しましたが、クライアントはこれを純粋なコードとして受信します。メールを送信するための PHP コードは次のとおりです。

$subject = 'HTML e-mail test';
$message = '<html>
    <body>
        <h1>TEST</h1>
    </body>
</html>';
$headers = "MIME-Version: 1.0\r\n"; 
$headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
$headers .= "To: <".$to.">\r\n"; 
$headers .= "From: <".$email.">\r\n";

$mailb = mail($to, $subject, $message, $headers);

それは私にとってはうまくいきますが、彼らはそれを次のように受け取ります:

Content-type: text/html; charset=iso-8859-1

To: <email@email.com>
From: <email@email.com>

<html>
    <body>
        <h1>TEST</h1>
    </body>
</html>

ヘッダーに何か問題がありますか? それとも彼らの見通しですか?この問題を解決するにはどうすればよいですか?
前もって感謝します!

4

6 に答える 6

3

そうですか:

Content-typetext/html; charset=iso-8859-1

私が見るべき場所:

Content-type: text/html; charset=iso-8859-1

それは切り貼りエラーですか?コードで、または結果で?

HTML のみのメールは (SpamAssassin、SpamBouncer などを使用して) スパム スコアが高くなることが多いため、マルチパート メッセージに text/plain と text/html の両方のタイプを含めたい場合があることに注意してください。

更新#1:

\r\n、1 つではなく 2 つの改行として解釈されているようです。異なるプラットフォームでは、SMTP の実装に異なるバグがある可能性があります。行末を just に変更することで回避できる可能性があります\n。それがあなたのシステムで動作する場合、別のシステムでは動作しない可能性があるため、それに依存しないでください。

また、別のメール送信方法への切り替えも検討してください。 PHP の内部関数よりも、 phpMailerSwiftMailerの両方をお勧めします。mail()

更新#2:

Incognito の提案に基づいて、ヘッダーをより適切に整理し、プレーンテキスト部分を作成するために使用できるコードを次に示します。

filter_var($to, FILTER_VALIDATE_EMAIL) or die("Invalid To address");
filter_var($email, FILTER_VALIDATE_EMAIL) or die("Invalid From address");

$subject = 'HTML e-mail test';

$messagetext = 'TEST in TEXT';

$messagehtml = '<html>
    <body>
        <h1>TEST</h1>
        <p>in HTML</p>
    </body>
</html>';

// We don't need real randomness here, it's just a MIME boundary.
$boundary="_boundary_" . str_shuffle(md5(time()));

// An array of headers. Note that it's up to YOU to insure they are correct.
// Personally, I don't care whether they're a string or an imploded array,
// as long as you do input validation.
$headers=array(
    'From: <' . $email . '>',
    'MIME-Version: 1.0',
    'Content-type: multipart/alternative; boundary="' . $boundary . '"',
);

// Each MIME section fits in $sectionfmt.
$sectionfmt = "--" . $boundary . "\r\n"
      . "Content-type: text/%s; charset=iso-8859-1\r\n"
      . "Content-Transfer-Encoding: quoted-printable\r\n\r\n"
      . "%s\n";

$body = "This is a multipart message.\r\n\r\n"
      . sprintf($sectionfmt, "html", $messagehtml)
      . sprintf($sectionfmt, "plain", $messagetext)
      . "--" . $boundary . "--\r\n";

$mailb = mail($to, $subject, $body, implode("\r\n", $headers));

これが決してこれを行う正しい方法だと言っているわけではありませんが、戦略に魅力を感じ、6か月または12か月間見ていなかった後でもこのようなコードを維持できると思う場合(つまり、それは理にかなっています)一見すると)、自由に使用または適応してください。

免責事項:これはテストされておらず、時々私はタイプミスをします...人々を緊張させないようにするためです. :)

于 2012-08-22T11:53:05.023 に答える
0

確認する良い方法の 1 つは、ヘッダーを次のように変更することです。

$to = 'bob@example.com';

$subject = 'Website Change Reqest';

$headers = "From: " . strip_tags($_POST['req-email']) . "\r\n";
$headers .= "Reply-To: ". strip_tags($_POST['req-email']) . "\r\n";
$headers .= "CC: susan@example.com\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";

また、これと比較して、コードの残りの部分を再確認してください。

http://css-tricks.com/sending-nice-html-email-with-php/

于 2012-08-22T11:53:08.103 に答える
0

これは Microsoft Outlook (Windows) の問題です。

解決策は、ヘッダーの末尾にある「\r」を削除して、「\n」のみを使用することです。

于 2014-05-20T16:47:00.717 に答える
0

mail()PHPの関数を使用しないことをお勧めします。はい、電子メールを送信できますが、あらゆる種類の複雑さがある場合は、物事が難しくなります.

phpMailerなどのクラスを使用することをお勧めします。これにより、柔軟性が大幅に向上します。HTML メールの送信、添付ファイルの追加、代替 MTA の使用などの作業がはるかに簡単になります。

于 2012-08-22T11:58:21.540 に答える
0

私はこの問題を自分で抱えていましたが、\r\n の代わりに \n を使用することで修正されました。ヘッダーの最後の行にのみ \r\n を使用します。

于 2012-08-22T12:02:18.977 に答える