欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

PHP_thinkphp框架使用PHPMailer实现发送邮件的功能,以及各种问题解析

shiping1 的头像

 

PHP_thinkphp框架使用PHPMailer实现发送邮件的功能,以及各种问题解析

(2012-08-03 10:36:36)
标签:

it

分类: PHP
 

 

最近在公司实习,需要使用php编程,而公司使用的都是thinkphp的框架,现在又要我实现发送邮件的功能,所以对该问题有了一个较为深入的研究。

Thinkphp不是这里的重点,但是还是说下,thinkphp是一个轻量级的php开发开发框架,千万不要将thinkphp与php就等同了,他们就像是面粉和面包之间的关系,用面粉可以做汉堡,用面包也可以,但是用面包就很容易,因为面包里面集成了很多东西,就是这样,这里的php代表的就是面粉,面包指的就是thinkphp框架。ThinkPHP是一个开源的PHP框架, 是为了简化企业级应用开发和敏捷WEB应用开发而诞生的。本人并不喜欢什么框架,因为限制了自己的思维。

言归正传,PHP是自带可以发送邮件的Mail()函数的,但需要在php.ini配置。本文将介绍一种简单的通过PHPMailer发送邮件的方法。

而PHPMailer是一个用于发送电子邮件的PHP函数包,它可以使用SMTP的方法通过163、QQ邮箱等第三方服务器发送邮件。这样还有一个好处,就是这些大型邮箱发出的邮件一般不会被屏蔽。

如果只是寻找PHP中发送邮件的方法而误入此地的同学请继续Google百度!

本文所使用的是ThinkPHP 2.1版和 PHPMailer 5.1版。(后者建议您直接从本博下载,因为我们不能保证下面的代码在所有版本的PHPMailer中都能正常运行);

下面是具体步骤:

第一步、添加PHPMailer类库

  将下载后的文件解压,将PHPMail目录移动至ThinkPHP目录中的Vendor内。(请确保class.phpmailer.php文件就在ThinkPHP\Vendor\PHPMailer\class.phpmailer.php)

第二步、添加发送邮件函数

  在项目目录中的Common文件夹中的common.php文件(如果没有请创建)添加如下代码:

<?php

 

function SendMail($address,$title,$message)

{

    vendor('PHPMailer.class#PHPMailer');

 

    $mail=new PHPMailer();

    // 设置PHPMailer使用SMTP服务器发送Email

    $mail->IsSMTP();

 

    // 设置邮件的字符编码,若不指定,则为'UTF-8'

    $mail->CharSet='UTF-8';

 

    // 添加收件人地址,可以多次使用来添加多个收件人

    $mail->AddAddress($address);

 

    // 设置邮件正文

    $mail->Body=$message;

 

    // 设置邮件头的From字段。

    $mail->From=C('MAIL_ADDRESS');

 

    // 设置发件人名字

    $mail->FromName='LilyRecruit';

 

    // 设置邮件标题

    $mail->Subject=$title;

 

    // 设置SMTP服务器。

    $mail->Host=C('MAIL_SMTP');

 

    // 设置为"需要验证"

    $mail->SMTPAuth=true;

 

    // 设置用户名和密码。

    $mail->Username=C('MAIL_LOGINNAME');

    $mail->Password=C('MAIL_PASSWORD');

 

    // 发送邮件。

    return($mail->Send());

}

 

?>

 

第三步、配置邮箱信息

编辑Conf目录下的config.php,在return array添加如下内容

'MAIL_ADDRESS'=>'xxx@126.com', // 邮箱地址

'MAIL_SMTP'=>'smtp.126.com', // 邮箱SMTP服务器

'MAIL_LOGINNAME'=>'xxx', // 邮箱登录帐号

'MAIL_PASSWORD'=>'xxx', // 邮箱密码

第四步、在Action中发送邮件

  由于ThinkPHP会自动加载common.php中的函数,所以在需要发送邮件的时候,只需要使用如下代码即可。

SendMail("xxx@xxx.com","邮件标题","邮件正文");

  至此,发送邮件的功能已经实现。撒花!欢迎成功配置的同学SendMail("yuanmouren1hao@sina.cn","我看了教程会发邮件了~~","谢啦,谢啦~~");

QQ邮箱(含foxmail)和网易的126、163都测试成功。

 

最重要的在下面:

在配置的过程中可能会遇到很多的问题,我也是这样,首先第一点也是最重要的一点就是在修改之后一定要把缓存文件给删除,不然总是提醒错误。

在调试的时候可以将错误信息输出来,查看错误类型:

代码:echo($mail->ErrorInfo);

是在不行也可先不安上边的来,先把上面的代码完全写到一个action的方法中,等调试完成后再按标准的写,我就是按照这样来的,刚开始错的根本没有头绪。

下面是一些错误的信息以及解决方案:

一,没有定义发送邮箱$mail->From或格式不正确,错误提示:Language string failed to load: recipients_failed test@test.com,注意,这个配置一定要正确,而且是正确的邮箱

 

二,没有定义邮件服务主机$mail->Host或连接失败,错误提示:Language string failed to load: connect_host

 

三,没有定义发送邮箱$mail->AddAddress或邮箱格式不正确,错误提示:Language string failed to load: provide_address

 

四,没有定义邮箱发送用户名$mail->Username,错误提示:Language string failed to load: connect_host

 

五,没有定义邮箱发送密码$mail->Password,错误提示:Language string failed to load: connect_host,这类错误非常明显,一般都是邮箱服务器配置不正确不能边接。

 

六,邮件正文编码,如果发送HTML邮件,需要定义正确的编码格式和字符,发送GBK邮件如下:

$mail->IsHTML ( true ); 是否支持HTML邮件

$mail->CharSet = “GB2312″; 字符设置

$mail->Encoding = “base64″; 编码方式

七,学会正确使用错误提示$mail->ErrorInfo查看邮件错误,可直接查找问题。

 

使用PHPMailer邮件类发送邮件使用非常简单,基本配置如上所示,在使用过程中正确了解错误提示,并及时了解错误原因,对于正确使用PHPMailer邮件类来说非常重要。

  有关phpmailer的介绍可以参考官网:http://phpmailer.codeworxtech.com/

  常见异常:

  1.SMTP Error: Could not authenticate.

   这个是因为smtp验证没通过,就是smtp server 的用户名和密码不正确了

  

 

Php代码

$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

    这是因为

  

 

Java代码

$mail->IsSendmail();  // tell the class to use Sendmail    

      $mail->IsSendmail();  // tell the class to use Sendmail

   

   去掉上面的代码就ok了!

 

3.关于phpmailer发送邮件产生中文乱码问题

  环境一:在普通环境,即标题内容等含中文的内容是在脚本中加上去的,或从文本中获取的,只需要进行如下操作(网上有很多):

   修改class.phpmailer.php中的EncodeHeader函数,改为:

 

Php代码

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).”?=”;}

 

再改下使用这个函数的一段:

 

Php代码

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));

    }

   当然编码设置也不能少了:

 

Php代码

$mail->CharSet=”utf-8″;    

       $mail->Encoding = “base64″;  

 $mail->CharSet=”utf-8″;

        $mail->Encoding = “base64″;

 

 

来自 http://blog.sina.com.cn/s/blog_68b4ec9b01014238.html

普通分类: