【问题标题】:HTML emails sends as plain text with PHPHTML 电子邮件使用 PHP 以纯文本形式发送
【发布时间】:2012-04-29 15:02:54
【问题描述】:

我有这段代码可以通过 PHP 发送电子邮件:

// Prepare email.
$headers = "From: Mi9 Vault <info@mi9vault.com.au>\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=ISO-8859-1";

$msg = file_get_contents($_SERVER['DOCUMENT_ROOT'] . '/edm/confirmation.html');
$msg = str_replace('{first_name}', $contact["First Name"], $msg);


// Send email
mail($contact["Email Address"], "Your Mi9 Registration is Confirmed", $msg, $headers);

confirmation.html 是我们设置的 HTML 电子邮件。

我在使用上述 PHP 代码发送电子邮件之前从未遇到过任何问题,但我似乎只能得到一封包含所有 HTML 的电子邮件,而不是实际的 HTML 格式电子邮件。

基本上我会收到一封包含以下内容的电子邮件:

MIME-Version: 1.0

Content-type: text/html; charset=ISO-8859-1
Message-Id: <20120418080325.C643B407EF@ds3219.dreamservers.com>
Date: Wed, 18 Apr 2012 01:03:25 -0700 (PDT)

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    </head>
    <body>
        .....

我在具有相同主机的另一个网站上拥有相同的 PHP 代码,并且运行良好...

【问题讨论】:

  • 我以前遇到过这个问题,并通过摆弄\r\n 的位置来解决它。您可能想尝试 Dante 的解决方案。
  • 实际上内联 HTML 只能用于非常松散(不兼容)的用户代理。当您修复了 ehaders 中的换行符问题后,您可能会在您的电子邮件客户端中根据需要显示此内容,但您应该使用 7 位传输编码,并且 html 应该标记为 mime 内联内容

标签: php email


【解决方案1】:

似乎在你的标题的每两行之间有额外的换行符。我不确定它是如何发生的,因为您的代码没有将它们放在那里。接收邮件服务器可能以某种方式搞砸了,并将\r\n 解释为两个换行符而不是一个。首先,我会删除\r,只留下\n,看看会发生什么。我知道这对于 RFC 来说是不合适的 - 但从那开始。

为了让您感觉更好,我使用了一个非常相似的代码 - 并且电子邮件可以正确发送。

【讨论】:

  • 我把\r\n从第一行去掉(和From:一起),现在它可以完美运行了……这太奇怪了。
  • @MartyWallace 哦,顺便说一句,尝试将\r\n\r\n 添加到标题的最后一行,而不是删除\r - 也许它会因为缺少双行结束而感到困惑在标题的末尾
  • 刚刚遇到同样的问题,确实通过删除 \r 解决了它。谢谢你:-)
【解决方案2】:

尝试改变:

$headers = "From: Mi9 Vault <info@mi9vault.com.au>\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=ISO-8859-1";

$headers = 'From: Mi9 Vault <info@mi9vault.com.au>' . "\r\n";
$headers .= 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

【讨论】:

    【解决方案3】:

    尝试从您的html电子邮件中删除html和head标签,只需将简单的html用于内容,无需添加额外的HTML标签和Body 在正文开始标签之后开始你的html标签

    【讨论】:

      【解决方案4】:

      您不知道您在哪个平台上运行以及 mail() 使用哪个邮件程序。您正在使用的邮件程序似乎期望 \n 作为分隔符。您可以使用 PHP_EOL 代替 \r\n 或 \n,在这种情况下,它将使用运行平台中使用的行分隔符。

      对于 linux/unix 系统,

      标题中的换行符应该是 运行 PHP 的系统。

      mail() 函数不与 SMTP 服务器通信,因此 RFC2822 会 不适用于此处。 mail() 正在与 本地系统,并且可以合理地期望该程序需要 系统原生换行符。

      (source)

      从长远来看,考虑使用通常解决了几个类似问题的 mail() 替代方案。 mail() 是一个非常“原始”的函数,它有几个陷阱,包括标头注入。这类问题已经解决,例如Swift MailerPHPMailer

      【讨论】:

        【解决方案5】:

        我遇到了类似的问题,我只是通过提供 $headers 作为数组而不是手动添加换行符和回车符的串联字符串来解决它。

        $headers = array(
            'From' => "Mi9 Vault <info@mi9vault.com.au>",
            'MIME-Version' => '1.0',
            'Content-type' => "text/html;charset=ISO-8859-1"
        );
        

        它就像一个魅力。

        【讨论】:

          猜你喜欢
          • 2021-04-12
          • 2017-06-28
          • 2016-03-07
          • 2015-09-19
          • 1970-01-01
          • 1970-01-01
          • 2015-03-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多