1

我有这段代码可以通过 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 代码,它工作正常......

4

5 回答 5

7

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

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

于 2012-04-18T08:14:09.083 回答
2

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

对于 linux/unix 系统,

标题中的换行符应该是运行 PHP 的系统的本机行结尾。

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

来源

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

于 2012-04-18T08:30:44.553 回答
0

尝试改变:

$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";
于 2012-04-18T08:15:26.103 回答
0

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

于 2012-04-18T08:24:06.020 回答
0

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

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

它就像一个魅力。

于 2021-11-21T16:40:26.637 回答