PHP发送电子邮件,方法很多,一是使用PHP自带的email方法,二是使用stmp类,三是使用phpmail。下面分别简单介绍一下。
一、mail()方法
语法: mail(to,subject,message,headers,parameters)
to 规定邮件的接收者
subject 规定邮件的主题。该参数不能包含任何换行字符
message 规定要发送的消息
headers 规定额外的报头,比如 From, Cc 以及 Bcc
parameters 规定 sendmail 程序的额外参数。
用法:
// 当发送 HTML 电子邮件时,请始终设置 content-type $headers = "MIME-Version: 1.0" . "\r\n"; $headers .= "Content-type:text/html; charset=utf-8"; mail($to,$subject,$message,$headers);
用起来很简单,一句头文件定义,一个函数调用即可。这样也避免了乱码,但是需要php.ini支持,这使得部分虚拟主机用户用起来很不方便。而且内置的这个方法有时候能收到邮件,有时候还不能。
二、使用一个smtp类
有一个封装好的smtp类,很好用,借用了163、QQ等厂商的SMTP服务器作为发件方服务器。例如,163,你需要开启163邮箱的smtp功能,一般163邮箱默认开启。
类文件下载:
测试代码:
require_once ('email.class.setutf8.php'); //########################################## $smtpserver = "smtp.163.com";//SMTP服务器 $smtpserverport =25;//SMTP服务器端口 $smtpusermail = "***@163.com";//SMTP服务器的用户邮箱 $smtpemailto = "***@126.com";//发送给谁 $smtpuser = "***@163.com";//SMTP服务器的用户帐号 $smtppass = "***";//SMTP服务器的用户密码 $mailsubject = "您的网站有新的询盘";//邮件主题 $mailbody = "<h4>你有新的询盘</h4>";//邮件内容 $mailtype = "HTML";//邮件格式(HTML/TXT),TXT为文本邮件 //########################################## $smtp = new smtp($smtpserver,$smtpserverport,true,$smtpuser,$smtppass); //这里面的一个true是表示使用身份验证,否则不使用身份验证. $smtp->debug = true;//是否显示发送的调试信息 if($smtp->sendmail($smtpemailto, $smtpusermail, $mailsubject, $mailbody, $mailtype,"utf-8")){ echo "邮件发送成功"; }
在email.class.setutf8.php文件的sendmail()中,设置了编码信息,以此解决乱码引起的163邮箱的退信问题。
扩展:
不要把任何除了iso-8859-1编码之外的文字直接放进subject,正确的方式是让subject里头的文字符合RFC 2047的规范,假设你的subject处的文字的编码是GB2312,那么正确的subject应该是这样的格式
$headers['subject'] ='=?GB2312?B?'. base64_encode('标题文字') .'?=';
如果是UTF-8的话,把上面开头的GB2312替换成UTF-8即可。推荐在标题处使用GB2312 编码,因为MTA的分化实在是严重,大部分的MSP使用的都是自己开发的MTA,而相信国内的大部分MTA 无论如何都是可以支持 GB2312 编码的。
在这里对subject的处理在类里面,而外面只要传参设置编码为utf-8或者GB2312就行了。
在email.class.php里是这样处理的,这样有效的解决了乱码问题。
function sendmail($to, $from, $subject = "", $body = "", $mailtype,$additional_headers = "utf-8", $cc = "", $bcc = "") { $mail_from = $this->get_address($this->strip_comment($from)); $subject ="=?".$additional_headers."?B?".base64_encode($subject)."?="; $body = ereg_replace("(^|(\r\n))(\\.)", "\\1.\\3", $body); $header .= "MIME-Version:1.0\r\n"; if($mailtype=="HTML"){ $header .= "Content-Type:text/html;Charset=\"".$additional_headers."\"\r\n"; }
注意,如果使用这个出现535 Error: authentication failed错误,说明邮箱账号或者密码输错了,小编曾经因为535错误困扰了很久,最后发现,是因为小编的163邮箱长度太长,由于小编很多年前设置的163密码长达19位,后来改短了,就恢复正常。这算是网易的问题吧。
这个方法用起来很稳定,毕竟电子邮件的大供应商还是值得信赖的。
注意:如果PHP升级到5.3及其以上版本,那么ereg_replace()不能使用,否则会提示错误信息,PHP版本高的,请自行替换不兼容的ereg_replace()和其他不兼容的PHP内置方法!
三、使用PHPMail
这个比较强大,功能齐全。
官网:http://phpmailer.worxware.com/
下载:https://github.com/Synchro/PHPMailer
使用方法请点击:使用PHPmail发送电子邮件