【问题标题】:Outlook receives PHP HTML e-mail as code?Outlook 接收 PHP HTML 电子邮件作为代码?
【发布时间】:2012-08-17 20:06:45
【问题描述】:

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

我的标题有问题吗?还是他们的展望? 我该如何解决这个问题?
提前致谢!

【问题讨论】:

  • 请使用数组,甚至是 nowdoc 语法来处理像这样的长 blob。 php.net/manual/en/…
  • @Incognito - mail() 中的标头是一个字符串,而不是一个数组,并且正式应该有以\r\n 结尾的行(不仅仅是您系统的换行符的想法)。除非你正在考虑implode()他们在飞行中?您如何确保 nowdoc 具有正确的行尾?
  • @ghoti 我正在谈论他与.= 的字符串构建操作。该数组将提供一个有意义的抽象,至少可以包括逻辑,帮助防止提供TO: 字段bob@example.com\r\nTo: billgates@microsoft.com\r\n\r\nSpamSpamSpam\r\n.\r\n\r\n。 --此外,最好只使用您在下面建议的 geat 现有解决方案。

标签: php html outlook-2003


【解决方案1】:

我明白了:

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 个月没有查看它之后维护这样的代码(即乍一看很有意义),然后随意使用或调整它。

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

【讨论】:

  • 抱歉打错了,但他们是这样收到的。
  • 这是一个剪切/粘贴(类型)错误,在代码中是正常的。他们接收 HTML 消息作为代码,就像在我的第二个示例中一样,没有标记。我怎样才能发送纯文本消息?
【解决方案2】:

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

$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/

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 感谢您的回答,我同意 PHP 邮件功能已“损坏”,但 PHP 邮件功能不正常工作吗?就像我的例子一样。
    • 邮件标题的格式是一种神秘的艺术形式。 PHP 的mail() 函数希望您知道如何做并正确处理。是的,它确实有效,但 phpMailer 让你摆脱了麻烦。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      解决方法是让你把标题放在最后一个。

      我刚和我的一个客户遇到了同样的问题,这让我困扰了一段时间。

      【讨论】:

        【解决方案6】:

        这是 Microsoft Outlook (Windows) 的问题。

        解决方法是去掉标题末尾的“\r”,直接使用“\n”即可。

        【讨论】:

        • 这可能会回答问题,但它隐藏在不重要的信息中(例如“我遇到了这个问题)。请在以后的帖子中尝试更清楚(我已尝试编辑,请查看此以及)。
        猜你喜欢
        • 1970-01-01
        • 2014-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 2011-01-31
        • 1970-01-01
        • 2011-09-03
        相关资源
        最近更新 更多