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

这是剪切/粘贴错误吗?在您的代码中,还是在您的结果中?

请注意,您可能希望在多部分邮件中同时包含text /plain 和 text/html 类型,因为仅 HTML 的邮件通常会获得较高的垃圾邮件分数(使用 SpamAssassin、SpamBouncer 等)。

更新#1:

似乎\r\n被解释为两个换行符而不是一个。不同的平台在实现 SMTP 时可能存在不同的错误。将行尾更改为 just 是可能的\n。如果这适用于您的系统,请不要依赖它,因为它可能无法在其他系统上运行。

此外,请考虑切换到其他发送邮件的方法。 phpMailerSwiftMailer都比 PHP 的内部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

一种确定的好方法是将标题更改为以下内容:

$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

我建议不要使用 PHP 的mail()函数。是的,它可以发送电子邮件,但对于任何复杂的事情,它只会让事情变得困难。

我建议使用诸如phpMailer 之类的类,这将为您提供更多的灵活性。它使发送 HTML 电子邮件、添加附件和使用替代 MTA 等事情变得更加容易。

于 2012-08-22T11:58:21.540 回答
0

我自己也遇到过这个问题,通过使用 \n 而不是 \r\n 解决了这个问题。我只在标题的最后一行使用 \r\n。

于 2012-08-22T12:02:18.977 回答
0

问题是某些防病毒电子邮件扫描程序将 mime 标头后面的任何内容视为正文。

解决方法是让您将标题设置为最后一个。

我刚刚和我的一个客户遇到了同样的问题,这让我很痛苦。

于 2013-05-13T05:02:00.650 回答
0

这是 Microsoft Outlook (Windows) 的问题。

解决方案是删除标题末尾的“\r”,只使用“\n”。

于 2014-05-20T16:47:00.717 回答