PHP的mail()函数发送邮件,其中的html标签未被正常解析的问题

问题描述

最近有一台线上服务器迁移到了欧洲节点,服务器配置,操作系统和应用环境与之前都是一样,Centos6.5,PHP5.5,但是使用PHP自带的mail函数发送邮件,其中的html标签未被解析,被当成字符串直接显示出来,奇怪的是之前的服务器并没有这个问题。
PHP的mail()函数发送邮件,其中的html标签未被正常解析的问题_第1张图片

问题分析

查看官方文档,mail函数的定义如下:

bool mail ( string $to , string $subject , string $message 
[, string $additional_headers [, string $additional_parameters ]] )

通过官方文档的例子,不难看出要想发送html的邮件,关键在于第四个参数$additional_headers


// multiple recipients
$to  = '[email protected]' . ', '; // note the comma
$to .= '[email protected]';

// subject
$subject = 'Birthday Reminders for August';

// message
$message = '


  Birthday Reminders for August


  

Here are the birthdays upcoming in August!

PersonDayMonthYear
Joe3rdAugust1970
Sally17thAugust1973
'
; // To send HTML mail, the Content-type header must be set $headers = 'MIME-Version: 1.0' . "\r\n"; $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; // Additional headers $headers .= 'To: Mary , Kelly ' . "\r\n"; $headers .= 'From: Birthday Reminder ' . "\r\n"; $headers .= 'Cc: [email protected]' . "\r\n"; $headers .= 'Bcc: [email protected]' . "\r\n"; // Mail it mail($to, $subject, $message, $headers); ?>

使用这个例子在线上服务器上测试,仍然不行。但是在文档中发现了这样一个提示:

Note:
If messages are not received, try using a LF (\n) only. 
Some poor quality Unix mail transfer agents replace LF 
by CRLF automatically (which leads to doubling CR if 
CRLF is used). This should be a last resort, as it 
does not comply with » RFC 2822.

提示说,如果没有收到消息,尝试只用(\n),因为一些质量差的Unix邮件传输代理商自动将LF(\n)替换为CRLF(\r\n)(如果使用CRLF,则会导致出现两个CR)。

于是我将$headers中的所有的(\r\n)全部替换成(\n),再次发送邮件,HMTL标签全部显示正常。

你可能感兴趣的:(Php)