Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Outlook以代码形式接收PHP HTML电子邮件?_Php_Html_Outlook 2003 - Fatal编程技术网

Outlook以代码形式接收PHP HTML电子邮件?

Outlook以代码形式接收PHP HTML电子邮件?,php,html,outlook-2003,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-t

我用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);
$subject='HTML电子邮件测试';
$message='1
试验
';
$headers=“MIME版本:1.0\r\n”;
$headers.=“内容类型:text/html;字符集=iso-8859-1\r\n”;
$headers.=“收件人:\r\n”;
$headers.=“发件人:\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>
内容类型:text/html;字符集=iso-8859-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
,而不受影响。如果你的系统可以这样做,不要依赖它,因为它可能无法在其他系统上工作

也可以考虑切换到一种不同的发送邮件的方法。和都建议使用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));
filter_var($to,filter_VALIDATE_EMAIL)或die(“地址无效”);
过滤变量($email,过滤验证电子邮件)或死亡(“无效发件人地址”);
$subject='HTML电子邮件测试';
$messagetext='testin TEXT';
$messagehtml=
试验
在HTML中

'; //我们不需要真正的随机性,它只是一个MIME边界。 $boundary=“\u boundary\u”。stru-shuffle(md5(time()); //标题数组。请注意,由您来确保它们是正确的。 //就我个人而言,我不在乎它们是字符串还是内爆数组, //只要您进行输入验证。 $headers=数组( “发件人:”, 'MIME版本:1.0', '内容类型:多部分/可选;边界='.$boundary.'', ); //每个MIME部分都包含在$sectionfmt中。 $sectionfmt=“--”$边界。“\r\n” . “内容类型:text/%s;字符集=iso-8859-1\r\n” . “内容传输编码:带引号的可打印\r\n\r\n” . “%s\n”; $body=“这是一条多部分消息。\r\n\r\n” . sprintf($sectionfmt,“html”,$messagehtml) . sprintf($sectionfmt,“plain”,$messagetext) . "--" . $边界。“--\r\n”; $mailb=mail($to、$subject、$body,内爆(“\r\n”,$headers));
我并不是说这是一种正确的方法,但是如果策略对您有吸引力,并且您认为在6个月或12个月没有查看过代码(即,乍一看是有意义的)之后,您可以维护这样的代码,那么就可以随意使用或修改它


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

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

$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";
另外,通过与以下内容进行比较,再次检查代码的其余部分:


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


我建议使用一个类,例如,这将给您更多的灵活性。它使发送HTML电子邮件、添加附件和使用其他MTA等操作变得更加容易。

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

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

修复方法是使您的mime头成为最后一个


我只是在我的一个客户身上遇到了同样的问题,这让我有一段时间受到了打击。

这是Microsoft Outlook(Windows)的问题


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

很抱歉,这是一个打字错误,但他们就是这样接收的。这是一个剪切/粘贴(类型)错误,在代码中是正常的。他们以代码的形式接收HTML消息,就像我的第二个示例中那样,没有标记。我怎样才能发送纯文本消息呢?谢谢你的回答,我同意PHP邮件函数“已损坏”,但PHP邮件函数不是简单地工作吗?就像我的例子一样,邮件标题的格式是一种神秘的艺术形式。PHP的
mail()
函数希望您知道如何操作并正确使用它。是的,它确实可以工作,但是phpMailer可以让你从麻烦中解脱出来。请使用数组,甚至是nowdoc语法来处理像这样的长blob@Incognito—
mail()
中的标题是字符串,而不是数组,并且正式地应该是以
\r\n
结尾的行(不仅仅是系统的换行符)。除非你想在飞行中引爆它们?您如何确保nowdoc具有正确的行尾?@ghoti我是在谈论他使用
=
构建字符串的操作。数组将提供一个有意义的抽象,至少可以包含逻辑帮助防止像
TO:
字段这样的事情被提供
bob@example.com\r\n收件人:billgates@microsoft.com\r\n\r\nspamspam\r\n。\r\n\r\n
--另外,最好只使用下面建议的geat现有解决方案。这可能会回答这个问题,但它隐藏在不重要的信息中(例如“我有这个问题)。请在以后的帖子中尝试更清楚(我已经尝试过编辑,也请查看)。