这几天做mail群发,碰到不少问题。一些常见的错误网上很多但没有答案,靠自己不断的尝试终于OK了~这里把几个常见的问题列出来做为工作笔记!
要做发送邮件功能,首先要明白邮件收发的原理,引用网友一段话比较容易懂:
在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
$mail->Password = "******";
2.Could not execute: /usr/sbin/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)."?=";}
再改下使用这个函数的一段:
if($this->Mailer != 'mail') {
$result .= $this->HeaderLine('Subject', $this->EncodeHeader($this->SecureHeader($this->Subject),'text',1));
}
当然编码设置也不能少了:
$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');
}
下面贴段测试代码:
<?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
<?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 5.1为PHP开发者提供了一个强大而灵活的邮件发送解决方案,通过SMTP协议确保了邮件发送的安全性和可靠性。通过熟悉其核心概念和使用方法,开发者可以轻松地集成邮件功能到他们的应用程序中。无论是...
《PHPMailer邮件发送详解》 在Web开发中,发送邮件是一项常见的需求,PHPMailer作为一个强大的PHP邮件发送类库,能够帮助开发者轻松实现这一功能。本文将深入探讨PHPMailer的使用方法,以及它如何通过`Email.php`和...
在PHP开发中,发送邮件是一项常见...总结来说,PHPMailer是PHP开发中发送邮件的强大工具,通过简单易用的API,可以实现各种复杂的邮件发送需求。只要正确配置SMTP服务器和邮件内容,就能轻松地发送出高质量的电子邮件。
PHPMailer的核心在于创建一个`PHPMailer`对象,然后配置必要的属性,如邮件的发件人、收件人、主题和正文。以下是一个简单的使用示例: ```php require 'PHPMailer/PHPMailer.php'; require 'PHPMailer/SMTP.php'; ...
**PHP邮件发送与接收类——PhpMailer详解** 在PHP开发中,发送和接收电子邮件是一项常见的需求,例如用户注册验证、密码重置提醒等。而PhpMailer是一个强大的PHP邮件处理类库,它允许开发者通过SMTP协议发送邮件,...
总结来说,PHPMailer为PHP开发者提供了一种强大且灵活的方式来发送邮件,尤其在处理SMTP验证和复杂邮件格式时,它能确保邮件成功发送,避免了`mail()`函数的局限性。对于济宁网站制作或其他PHP项目,PHPMailer是一个...
在PHP编程中,发送电子邮件是一项常见的任务,而PHPMailer是一个广泛使用的PHP库,专为处理这个任务设计。这个名为"PHPMailer.zip"的压缩包文件包含了用于学习PHP邮箱开发的核心代码示例,如`email.php`和`...
总结,PHPMailer2-OK为PHP开发者提供了强大的邮件发送功能,通过其丰富的API,我们可以轻松实现各种复杂的邮件需求。在实际使用中,结合良好的错误处理机制和适当优化,可以极大地提升邮件发送的效率和可靠性。
在PHP中发送电子邮件是一项常见的任务,特别是在开发Web应用程序时,我们可能需要向用户发送确认邮件、通知或密码重置链接。...结合其错误处理和调试选项,PHPMailer使得在开发过程中处理邮件问题变得更加简单。
在使用PHPmailer库进行邮件群发时,尤其是通过Gmail进行SMTP发送,会遇到一些典型问题。这些问题的解决办法通常涉及配置SMTP服务器、处理认证错误、加密连接设置等方面。以下将详细讨论这些问题的解决方案以及如何...
总结来说,这个项目展示了如何在MVC框架下利用PHPMailer发送邮件。通过这种结构,我们可以更好地组织代码,提高可读性和可维护性。同时,使用PHPMailer可以确保邮件发送功能的可靠性和灵活性,支持各种SMTP服务器...
标题“PHPMAILER实现PHP发邮件功能”主要讲述的是如何使用PHPMAILER类库来在PHP环境中实现发送电子邮件的功能。PHPMAILER是一个功能强大的用于发送电子邮件的PHP代码库,它允许开发者通过简单的几行代码即可实现邮件...
总结起来,`PHPMailer`是一个强大的PHP邮件发送库,通过`class.phpmailer.php`和`class.smtp.php`这两个核心文件,为开发者提供了便捷且灵活的方式来处理电子邮件的发送,无论是简单的需求还是复杂的企业级应用,都...
### PHPMailer发送邮件功能详解 #### 一、引言 在Web开发中,电子邮件功能是一项基本但非常重要的功能。PHPMailer作为一个成熟的邮件处理类库,提供了丰富的API来满足各种邮件发送需求,包括纯文本邮件、HTML邮件...
总结来说,PHP邮件发送涉及SMTP协议和PHP的相关函数或第三方库,如PHPMailer。通过理解这些概念和实践,你可以创建一个可靠的邮件发送系统,满足各种项目需求。在实际操作中,还要注意防止密码明文存储,确保用户...
总结起来,PHPMailer类是PHP进行邮件群发的强大工具,它支持SMTP验证、HTML邮件、附件和丰富的邮件头设置。通过理解和掌握这些知识点,你可以构建出高效且专业的邮件群发系统,满足各种业务需求。在实际开发中,结合...
总结,PHP发送邮件涉及的主要知识点包括:PHPMailer库的使用、`mail()`函数的理解、SMTP配置和验证、邮件内容的安全处理以及调试技巧。通过案例学习,你可以更好地理解和应用这些概念,实现在实际项目中的邮件功能。
在PHP开发中,发送邮件是一项常见的需求,ThinkPHP框架提供了集成第三方库的能力,使得我们可以方便地利用PHPMailer这个强大的邮件发送插件。PHPMailer支持多种SMTP服务器,具有丰富的功能,如HTML邮件、附件发送等...
总结一下,PHP发送邮件可以通过内置的`mail()`函数或使用像PHPMailer这样的库。在实际项目中,推荐使用后者,因为它们提供了更丰富的功能和更好的错误处理机制。确保在服务器环境中正确配置邮件服务,并遵循良好的...
php mailer类是PHP开发中用于发送电子邮件的一个实用类库,其核心功能是通过SMTP协议将邮件发送到指定的服务器上。SMTP即简单邮件传输协议,是互联网上用于电子邮件传输的一种传输协议。在标题“php mailer类调用...