Outlook接收PHP HTML电子邮件作为代码?

时间:2012-08-22 11:50:51

标签: php html outlook-2003

我用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>

我的标题有问题吗?或者是 Outlook ? 我该如何解决这个问题呢? 提前谢谢!

6 个答案:

答案 0 :(得分: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时可能会有不同的错误。您可以将行结尾更改为\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个月的查看之后您可以维护这样的代码(即乍一看是有意义的,然后随意使用或改编它。

免责声明:这是未经测试的,有时我会犯错误...只是为了让人们保持警惕。 :)

答案 1 :(得分: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/

答案 2 :(得分:0)

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

我建议使用phpMailer等类,这会给你更多的灵活性。它可以更轻松地执行诸如发送HTML电子邮件,添加附件和使用其他MTA之类的操作。

答案 3 :(得分:0)

我自己遇到过这个问题,通过使用\ n而不是\ r \ n来修复它。 我只使用\ r \ n作为标题中的最后一行。

答案 4 :(得分:0)

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

修复方法是让mime标题成为最后一个。

我和我的一个客户遇到了同样的问题,但我已经打了一段时间。

答案 5 :(得分:0)

这是Microsoft Outlook(Windows)的问题。

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