php mail()方法发送html格式的邮件

使用mail()方法的前提,已经有自己的邮件服务器,并在Webserver中作了相应的配置。具体方法这里不做介绍。

PHP手册中关于mail()方法定义:
bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )
具体每个参数的意义参见:http://cn2.php.net/manual/zh/function.mail.php

使用php的mail()方法发送html格式的邮件常出现的问题:
1、乱码
2、html格式未被解析,被当作字符串全部显示出来

问题的关键在于mail方法的第四个参数,$additional_headers。以下是可以实现正确发送的一段代码:

$subject = "=?GBK?B?".base64_encode('邮件主题')."?=";    //解决邮件主题乱码问题,GBK编码格式
$header = "From: 发件人姓名 <[email protected]>\n";
$header .= "Return-Path: <[email protected]>\n";	 //防止被当做垃圾邮件,但在sina邮箱里不起作用
$header .= "MIME-Version: 1.0\n";
$header .= "Content-type: text/html; charset=utf-8\n";    //邮件内容为utf-8编码
$header .= "Content-Transfer-Encoding: 8bit\r\n";	 //注意header的结尾,只有这个后面有\r
ini_set('sendmail_from', '[email protected]');	 //解决mail的一个bug
$send_message = wordwrap($send_message, 70);	 //每行最多70个字符,这个是mail方法的限制
mail($email, $subject, $send_message, $header);

其中,要注意的几个关键点:

1、邮件主题编码是GBK(兼容GB2312,个人推测GB2312也可以),否则会乱码。这跟浏览器的默认编码方式有关系。智能的浏览器可以自动检查邮件内容的编码方式,这个就不是问题了。
2、From: 后面, 发件人姓名两边必须各有一个空格,这个是由RFC 2822规定的。
3、邮件内容,每行最多70个字符,否则发不出去。这个在PHP手册中,mail()方法的说明里有。
4、最关键的(个人认为),$header的每个字符串结尾,都有一个\n结尾,最后一个后面是\r\n。
    手册里面的说明是,每个项之间要用\r\n来隔开。手册下面有一段补充例子:

Remember also to write only \r for windows and not for Linux-Servers.
And at the end of the header should be an extra blank line:

$headers .= "Content-Type: text/plain; charset = \"UTF-8\";\n";
$headers .= "Content-Transfer-Encoding: 8bit\n";
$headers .= "\n";
也就是说使用\r还是\n是由服务器决定的,windows服务器使用\r, Linux服务器使用\n。但是无论是什么服务器,都必须在最后额外地加一个\r或\n。即 at the end of the header should be an extra blank line。

你有一个想法,我有一个想法,我们不妨让这两种想法碰撞一下,会发生什么神奇的事呢?我很期待,你呢?

你可能感兴趣的:(html,PHP,邮件,email,mail)