phpmailer发邮件常见的一些问题总结
来源:互联网 发布:事件提醒软件知乎 编辑:程序博客网 时间:2024/06/16 04:33
这几天做mail群发,碰到不少问题。一些常见的错误网上很多但没有答案,靠自己不断的尝试终于OK了~这里把几个常见的问题列出来做为工作笔记!
前提条件 请确定当前环境如果是局域网内的服务器的话,dns 要正确的地址 要在本地试过autlook 能收发邮件。
要做发送邮件功能,首先要明白邮件收发的原理,引用网友一段话比较容易懂:
要做发送邮件功能,首先要明白邮件收发的原理,引用网友一段话比较容易懂:
- 在Internet上将一段文本信息从一台计算机传送到另一台计算机上,可通过两种协议来完成,即SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)和POP3(Post Office Protocol,邮局协议3)。SMTP是Internet协议集中的邮件标准。在Internet上能够接收电子邮件的服务器都有SMTP。电子邮件在发送前,发件方的SMTP服务器与接收方的SMTP服务器联系,确认接收方准备好了,则开始邮件传递;若没有准备好,发送服务器便会等待,并在一段时间后继续与接收方邮件服务器联系。这种方式在Internet上称为“存储——转发”方式。POP3可允许E-mail客户向某一SMTP服务器发送电子邮件,另外,也可以接收来自SMTP服务器的电子邮件。换句话说,电子邮件在客户PC机与服务提供商之间的传递是通过P0P3来完成的,而电子邮件在 Internet上的传递则是通过SMTP来实现。
在Internet上将一段文本信息从一台计算机传送到另一台计算机上,可通过两种协议来完成,即SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)和POP3(Post Office Protocol,邮局协议3)。SMTP是Internet协议集中的邮件标准。在Internet上能够接收电子邮件的服务器都有SMTP。电子邮件在发送前,发件方的SMTP服务器与接收方的SMTP服务器联系,确认接收方准备好了,则开始邮件传递;若没有准备好,发送服务器便会等待,并在一段时间后继续与接收方邮件服务器联系。这种方式在Internet上称为“存储——转发”方式。POP3可允许E-mail客户向某一SMTP服务器发送电子邮件,另外,也可以接收来自SMTP服务器的电子邮件。换句话说,电子邮件在客户PC机与服务提供商之间的传递是通过P0P3来完成的,而电子邮件在 Internet上的传递则是通过SMTP来实现。
如果觉得不够清楚的话,则引用网上的一张图来解释吧:
有关phpmailer的介绍可以参考官网:http://phpmailer.codeworxtech.com/
常见异常:
1.SMTP Error: Could not authenticate.
这个是因为smtp验证没通过,就是smtp server 的用户名和密码不正确了
- $mail->Username = "smtp@163.com"; // SMTP server username
- t;Password = "******";
$mail->Username = "smtp@163.com"; // SMTP server username$mail->Password = "******";
2.Could not execute: /usr/sbin/sendmail
这是因为
- $mail->IsSendmail(); // tell the class to use Sendmail
$mail->IsSendmail(); // tell the class to use Sendmail
去掉上面的代码就ok了!
3.关于phpmailer发送邮件产生中文乱码问题
环境一:在普通环境,即标题内容等含中文的内容是在脚本中加上去的,或从文本中获取的,只需要进行如下操作(网上有很多):
修改class.phpmailer.php中的EncodeHeader函数,改为:
- public function EncodeHeader($str, $position = 'text', $pl = 0) {
- $x = 0;
- if ($pl){return "=?".$this->CharSet."?B?".base64_encode($str)."?=";}
public function EncodeHeader($str, $position = 'text', $pl = 0) { $x = 0; if ($pl){return "=?".$this->CharSet."?B?".base64_encode($str)."?=";}
再改下使用这个函数的一段:
- if($this->Mailer != 'mail') {
- $result .= $this->HeaderLine('Subject', $this->EncodeHeader($this->SecureHeader($this->Subject),'text',1));
- }
if($this->Mailer != 'mail') { $result .= $this->HeaderLine('Subject', $this->EncodeHeader($this->SecureHeader($this->Subject),'text',1)); }
当然编码设置也不能少了:
- $mail->CharSet="utf-8";
- $mail->Encoding = "base64";
$mail->CharSet="utf-8"; $mail->Encoding = "base64";
环境二:从excel中提取内容然后再发送excel中的内容给用户,这个折腾了我好久。最终找到解决办法了。最关键的地方是:excel中的编码是html格式的unicode,所以得使用下面这个函数将其转化为utf8,这个帖子的最后回复的人帮了我,谢谢他!帖子地址是:http://www.phpchina.com/bbs/viewthread.php?tid=111554
- private function uc2html($str)
- {
- $ret = '';
- for( $i=0; $i<strlen($str)/2; $i++ )
- {
- $charcode = ord($str[$i*2])+256*ord($str[$i*2+1]);
- $ret .= '&#'.$charcode.';';
- }
- return mb_convert_encoding($ret,'UTF-8','HTML-ENTITIES');
- }
private function uc2html($str) { $ret = ''; for( $i=0; $i<strlen($str)/2; $i++ ) { $charcode = ord($str[$i*2])+256*ord($str[$i*2+1]); $ret .= '&#'.$charcode.';'; } return mb_convert_encoding($ret,'UTF-8','HTML-ENTITIES'); }
下面贴段测试代码:
- <?php
- /**
- * Simple example script using PHPMailer with exceptions enabled
- * @package phpmailer
- * @version $Id$
- */
- require '../class.phpmailer.php';
- try {
- $mail = new PHPMailer(true); //New instance, with exceptions enabled
- $body = file_get_contents('contents.html');
- $body = preg_replace('/\\\\/','', $body); //Strip backslashes
- $mail->IsSMTP(); // tell the class to use SMTP
- $mail->SMTPAuth = true; // enable SMTP authentication
- $mail->Port = 25; // set the SMTP server port
- $mail->Host = "smtp.xxxx.com"; // SMTP server
- $mail->Username = "xxx@xxx.com"; // SMTP server username
- $mail->Password = "xxxx"; // SMTP server password
- $mail->IsSendmail(); // tell the class to use Sendmail
- $mail->AddReplyTo("xxx@sina.com","xxxx");
- $mail->From = "xxxx@m6699.com";
- $mail->FromName = "DJB";
- $to = "xxx@sina.com";
- $mail->AddAddress($to);
- $mail->Subject = "First PHPMailer Message";
- $mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test
- $mail->WordWrap = 80; // set word wrap
- $mail->MsgHTML($body);
- $mail->IsHTML(true); // send as HTML
- $mail->Send();
- echo 'Message has been sent.';
- } catch (phpmailerException $e) {
- echo $e->errorMessage();
- }
- ?>
<?php/*** Simple example script using PHPMailer with exceptions enabled* @package phpmailer* @version $Id$*/require '../class.phpmailer.php';try {$mail = new PHPMailer(true); //New instance, with exceptions enabled$body = file_get_contents('contents.html');$body = preg_replace('/\\\\/','', $body); //Strip backslashes$mail->IsSMTP(); // tell the class to use SMTP$mail->SMTPAuth = true; // enable SMTP authentication$mail->Port = 25; // set the SMTP server port$mail->Host = "smtp.xxxx.com"; // SMTP server$mail->Username = "xxx@xxx.com"; // SMTP server username$mail->Password = "xxxx"; // SMTP server password$mail->IsSendmail(); // tell the class to use Sendmail$mail->AddReplyTo("xxx@sina.com","xxxx");$mail->From = "xxxx@m6699.com";$mail->FromName = "DJB";$to = "xxx@sina.com";$mail->AddAddress($to);$mail->Subject = "First PHPMailer Message";$mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test$mail->WordWrap = 80; // set word wrap$mail->MsgHTML($body);$mail->IsHTML(true); // send as HTML$mail->Send();echo 'Message has been sent.';} catch (phpmailerException $e) {echo $e->errorMessage();}?>
再给一个网上的操作excel的类,返回结果是一个数组。非常方便!用到的组件是PHP ExcelParser Pro v.4.2
- /**
- * CopyRight (c) 2009,
- * All rights reserved.
- * 文件名:excel数据获取
- * 摘 要:
- *
- * @author 星期八 [email=ixqbar@hotmail.com]ixqbar@hotmail.com[/email]
- * @version 0.1
- */
- class ExcelParser
- {
- private $_data=array(0,'');
- private $_excel_handle;
- private $_excel=array();
- /**
- * 构造函数
- * @param <string> $filename 上传文件临时文件名称
- */
- public function __construct($filename)
- {
- /**
- * 引入excelparser类
- * 普通方法为
- * requires 路径.'excelparser.php';
- * import为ThinkPHP自带导入类方法
- */
- require("excelparser.php");
- $this->_excel_handle=new ExcelFileParser();
- //错误获取
- $this->checkErrors($filename);
- }
- /**
- * 错误校验
- */
- private function checkErrors($filename)
- {
- /**
- * 方法一
- */
- $error_code=$this->_excel_handle->ParseFromFile($filename);
- /**
- * 方法二
- * $file_handle = fopen($this->_filename,'rb');
- * $content = fread($file_handle,filesize($this->_filename));
- * fclose($file_handle);
- * $error_code = $this->_excel->ParseFromString($content);
- * unset($content,$file_handle);
- */
- switch($error_code)
- {
- case 0:
- //无错误不处理
- break;
- case 1:
- $this->_data=array(1,'文件读取错误(Linux注意读写权限)');
- break;
- case 2:
- $this->_data=array(1,'文件太小');
- break;
- case 3:
- $this->_data=array(1,'读取Excel表头失败');
- break;
- case 4:
- $this->_data=array(1,'文件读取错误');
- break;
- case 5:
- $this->_data=array(1,'文件可能为空');
- break;
- case 6:
- $this->_data=array(1,'文件不完整');
- break;
- case 7:
- $this->_data=array(1,'读取数据错误');
- break;
- case 8:
- $this->_data=array(1,'版本错误');
- break;
- }
- unset($error_code);
- }
- /**
- * Excel信息获取
- */
- private function getExcelInfo()
- {
- if(1==$this->_data[0])return;
- /**
- * 获得sheet数量
- * 获得sheet单元对应的行和列
- */
- $this->_excel['sheet_number']=count($this->_excel_handle->worksheet['name']);
- for($i=0;$i<$this->_excel['sheet_number'];$i++)
- {
- /**
- * 行于列
- * 注意:从0开始计数
- */
- $row=$this->_excel_handle->worksheet['data'][$i]['max_row'];
- $col=$this->_excel_handle->worksheet['data'][$i]['max_col'];
- $this->_excel['row_number'][$i]=($row==NULL)?0:++$row;
- $this->_excel['col_number'][$i]=($col==NULL)?0:++$col;
- unset($row,$col);
- }
- }
- /**
- * 中文处理函数
- * @return <string>
- */
- private function uc2html($str)
- {
- $ret = '';
- for( $i=0; $i<strlen($str)/2; $i++ )
- {
- $charcode = ord($str[$i*2])+256*ord($str[$i*2+1]);
- $ret .= '&#'.$charcode.';';
- }
- return mb_convert_encoding($ret,'UTF-8','HTML-ENTITIES');
- }
- /**
- * Excel数据获取
- */
- private function getExcelData()
- {
- if(1==$this->_data[0])return;
- //修改标记
- $this->_data[0]=1;
- //获取数据
- for($i=0;$i<$this->_excel['sheet_number'];$i++)
- {
- /**
- * 对行循环
- */
- for($j=0;$j<$this->_excel['row_number'][$i];$j++)
- {
- /**
- * 对列循环
- */
- for($k=0;$k<$this->_excel['col_number'][$i];$k++)
- {
- /**
- * array(4) {
- * ["type"] => 类型 [0字符类型1整数2浮点数3日期]
- * ["font"] => 字体
- * ["data"] => 数据
- * ...
- * }
- */
- $data=$this->_excel_handle->worksheet['data'][$i]['cell'][$j][$k];
- switch($data['type'])
- {
- case 0:
- //字符类型
- if($this->_excel_handle->sst['unicode'][$data['data']])
- {
- //中文处理
- $data['data'] = $this->uc2html($this->_excel_handle->sst['data'][$data['data']]);
- }
- else
- {
- $data['data'] = $this->_excel_handle->sst['data'][$data['data']];
- }
- break;
- case 1:
- //整数
- //TODO
- break;
- case 2:
- //浮点数
- //TODO
- break;
- case 3:
- //日期
- //TODO
- break;
- }
- $this->_data[1][$i][$j][$k]=$data['data'];
- unset($data);
- }
- }
- }
- }
- /**
- * 主函数
- * @return <array> array(标识符,内容s)
- */
- public function main()
- {
- //Excel信息获取
- $this->getExcelInfo();
- //Excel数据获取
- $this->getExcelData();
- return $this->_data;
- }
- }
<?php/** * CopyRight (c) 2009, * All rights reserved. * 文件名:excel数据获取 * 摘 要: * * @author 星期八 [email=ixqbar@hotmail.com]ixqbar@hotmail.com[/email] * @version 0.1 */class ExcelParser{ private $_data=array(0,''); private $_excel_handle; private $_excel=array(); /** * 构造函数 * @param <string> $filename 上传文件临时文件名称 */ public function __construct($filename) { /** * 引入excelparser类 * 普通方法为 * requires 路径.'excelparser.php'; * import为ThinkPHP自带导入类方法 */ require("excelparser.php"); $this->_excel_handle=new ExcelFileParser(); //错误获取 $this->checkErrors($filename); } /** * 错误校验 */ private function checkErrors($filename) { /** * 方法一 */ $error_code=$this->_excel_handle->ParseFromFile($filename); /** * 方法二 * $file_handle = fopen($this->_filename,'rb'); * $content = fread($file_handle,filesize($this->_filename)); * fclose($file_handle); * $error_code = $this->_excel->ParseFromString($content); * unset($content,$file_handle); */ switch($error_code) { case 0: //无错误不处理 break; case 1: $this->_data=array(1,'文件读取错误(Linux注意读写权限)'); break; case 2: $this->_data=array(1,'文件太小'); break; case 3: $this->_data=array(1,'读取Excel表头失败'); break; case 4: $this->_data=array(1,'文件读取错误'); break; case 5: $this->_data=array(1,'文件可能为空'); break; case 6: $this->_data=array(1,'文件不完整'); break; case 7: $this->_data=array(1,'读取数据错误'); break; case 8: $this->_data=array(1,'版本错误'); break; } unset($error_code); } /** * Excel信息获取 */ private function getExcelInfo() { if(1==$this->_data[0])return; /** * 获得sheet数量 * 获得sheet单元对应的行和列 */ $this->_excel['sheet_number']=count($this->_excel_handle->worksheet['name']); for($i=0;$i<$this->_excel['sheet_number'];$i++) { /** * 行于列 * 注意:从0开始计数 */ $row=$this->_excel_handle->worksheet['data'][$i]['max_row']; $col=$this->_excel_handle->worksheet['data'][$i]['max_col']; $this->_excel['row_number'][$i]=($row==NULL)?0:++$row; $this->_excel['col_number'][$i]=($col==NULL)?0:++$col; unset($row,$col); } } /** * 中文处理函数 * @return <string> */ private function uc2html($str) { $ret = ''; for( $i=0; $i<strlen($str)/2; $i++ ) { $charcode = ord($str[$i*2])+256*ord($str[$i*2+1]); $ret .= '&#'.$charcode.';'; } return mb_convert_encoding($ret,'UTF-8','HTML-ENTITIES'); } /** * Excel数据获取 */ private function getExcelData() { if(1==$this->_data[0])return; //修改标记 $this->_data[0]=1; //获取数据 for($i=0;$i<$this->_excel['sheet_number'];$i++) { /** * 对行循环 */ for($j=0;$j<$this->_excel['row_number'][$i];$j++) { /** * 对列循环 */ for($k=0;$k<$this->_excel['col_number'][$i];$k++) { /** * array(4) { * ["type"] => 类型 [0字符类型1整数2浮点数3日期] * ["font"] => 字体 * ["data"] => 数据 * ... * } */ $data=$this->_excel_handle->worksheet['data'][$i]['cell'][$j][$k]; switch($data['type']) { case 0: //字符类型 if($this->_excel_handle->sst['unicode'][$data['data']]) { //中文处理 $data['data'] = $this->uc2html($this->_excel_handle->sst['data'][$data['data']]); } else { $data['data'] = $this->_excel_handle->sst['data'][$data['data']]; } break; case 1: //整数 //TODO break; case 2: //浮点数 //TODO break; case 3: //日期 //TODO break; } $this->_data[1][$i][$j][$k]=$data['data']; unset($data); } } } } /** * 主函数 * @return <array> array(标识符,内容s) */ public function main() { //Excel信息获取 $this->getExcelInfo(); //Excel数据获取 $this->getExcelData(); return $this->_data; }}
- phpmailer发邮件常见的一些问题总结
- phpmailer发邮件常见的一些问题总结
- phpmailer发邮件常见的一些问题总结
- phpmailer发邮件常见的一些问题总结
- phpmailer发邮件常见的一些问题总结及使用案例
- phpmailer发邮件常见的一些问题总结及使用案例
- 用PHPMailer发邮件的例子
- phpMailer类发邮件
- 发邮件技术PhpMailer
- PHPMailer发邮件
- phpmailer在linux下邮件发不出去的问题——给自己加精!!!
- php发邮件phpmailer示例
- Thinkphp结合PHPMailer发邮件
- 利用phpmailer类 发邮件
- thinkphp5和phpmailer发邮件
- php的ci框架 配合phpmailer 发邮件
- PHPMailer发匿名邮件及Extension missing: openssl的解决
- PHPMailer 发邮件时 Extension missing: openssl 的解决方案
- Flex BlazeDS 推送不成功的问题
- MFC ACTIVEX 全屏
- 比尔盖茨在哈佛大学的演讲(中英版)
- 失败应聘的五大原因
- sql server中如何将日期转成其他格式
- phpmailer发邮件常见的一些问题总结
- win7 telnet 无法使用
- 求质数的筛选算法
- 枚举Android系统的进程、任务和服务的信息
- perl: warning: Setting locale failed
- tbb学习笔记(一): tbb容器及Mutex
- 改革春风吹满地
- 进程地址空间与虚拟存储空间的理解
- 学习 Linux,101: 引导程序