HTML电子邮件使用PHP以纯文本形式发送

时间:2012-04-18 08:07:15

标签: php email

我有这段代码通过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 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:2)

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

对于linux / unix系统,

  

标题中的换行符应该是。的原生行结尾   正在运行PHP的系统。

     

mail()函数不与SMTP服务器通信,因此RFC2822可以   不适用于此处。 mail()正在与一个命令行程序对话   本地系统,期望该程序是合理的   系统本地换行符。

source

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

答案 2 :(得分: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";

答案 3 :(得分:0)

尝试从你的html电子邮件中删除html和head标签,只需为内容添加简单的html,无需添加额外的HTML标签,以及Body 在身体开始标记后启动html标记