WEB教程基地:www.91ctc.com为你搭建学习WEB技术的优秀平台
在线留言 网站地图 加入收藏 设为首页
您的位置:本站首页>>PHP>>PHP使用STMP发送电子邮件,PHP使用STMP发送电子邮件乱码解决

PHP使用STMP发送电子邮件,PHP使用STMP发送电子邮件乱码解决

[ 录入者:91ctc | 时间:2015-05-24 13:04:29 | 作者: 91ctc| 来源:本站原创 | 浏览: 次 ]


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邮箱默认开启。

163邮箱开启SMTP

类文件下载:

email.class.setutf8.rar

测试代码:

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邮箱的退信问题。

PHP使用SMTP发送电子邮件

扩展

不要把任何除了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发送电子邮件


关闭】【返回顶部

相关文章
{xiangguan_list}
91ctc.com 网络先锋,引领科技,本站原创作品[转载请注明出处]。联系我们
Copyright© 2010-2017 计算机教程中心网 . All rights reserved. 苏ICP备11081842号