文档章节

将PHPMailer整合到ThinkPHP 3.2 中实现SMTP发送邮件

BearCatYN
 BearCatYN
发布于 2014/08/08 10:31
字数 1197
阅读 1W
收藏 11

将PHPMailer整合到ThinkPHP 3.2 中实现SMTP发送邮件

ThinkPHP没有邮件发送的功能,于是,我就想了想,就将PHPMailer整合到ThinkPHP中吧。

PHPMailer是不符合ThinkPHP规范的插件程序,所以,我们需要先将PHPMailer程序放到ThinkPHP的 Library/Vendor目录下,我这里是最新版的ThinkPHP 3.2,如果是是ThinkPHP 3.2之前的版本,可能就是Lib目录了。Vendor目录专门用于存放非标准ThinkPHP插件的目录,如下:

PHPMailer整合到ThinkPHP中的存放目录

PHPMailer整合到ThinkPHP中的存放目录

接下来为了方便发送邮件,我们可以定义一个专门发送邮件的函数sendMail(),这个函数可以只接受邮件发送的最基本的参数,发送到哪个邮 箱$id,邮件的主题$subject,邮件的内容$content。不过为了方便我们修改SMTP邮件发送服务器,我们先在config.php文件中 定义好邮件发送服务器,内容如下:

config.php

<?php
return array(   
    // 配置邮件发送服务器
    'MAIL_SMTP'                     =>TRUE,
    'MAIL_HOST'                     =>'邮件发送SMTP服务器',
    'MAIL_SMTPAUTH'                 =>TRUE,
    'MAIL_USERNAME'                 =>'SMTP服务器登陆用户名',
    'MAIL_PASSWORD'                 =>'SMTP服务器登陆密码',
    'MAIL_SECURE'                   =>'tls',
    'MAIL_CHARSET'                  =>'utf-8',
    'MAIL_ISHTML'                   =>TRUE,
);
?>

具体的配置可以根据自己的需要添加。根据PHPMailer的规则自己定义就可以了,然后再在定义函数中使用大C(‘CONF_NAME’)方法来调用就可以了。

再接下来就需要在common文件夹下的function.php文件中定义邮件发送函数sendMail(),如果function.php文件 不存在的话新建一个就可以了。而且这个function.php文件中的方法可以在全局使用,不需要先引入function.php文件。

在方法中需要引入PHPMailer时,不是通过import关键字来实现的,而是通过公共方法vendor()方法来实现的。具体内容如下:

view source

<?php
/**
 * 邮件发送函数
 */
function sendMail($to, $subject, $content) {
    vendor('PHPMailer.class#PHPMailer');
    $mail = new PHPMailer();
    // 装配邮件服务器
    if (C('MAIL_SMTP')) {
        $mail->IsSMTP();
    }
    $mail->Host = C('MAIL_HOST');
    $mail->SMTPAuth = C('MAIL_SMTPAUTH');
    $mail->Username = C('MAIL_USERNAME');
    $mail->Password = C('MAIL_PASSWORD');
    $mail->SMTPSecure = C('MAIL_SECURE');
    $mail->CharSet = C('MAIL_CHARSET');
    // 装配邮件头信息
    $mail->From = C('MAIL_USERNAME');
    $mail->AddAddress($to);
    $mail->FromName = '憨豆儿笑园';
    $mail->IsHTML(C('MAIL_ISHTML'));
    // 装配邮件正文信息
    $mail->Subject = $subject;
    $mail->Body = $content;
    // 发送邮件
    if (!$mail->Send()) {
        return FALSE;
    } else {
        return TRUE;
    }
}
?>

到这一步,我们已经将PHPMailer整合到了ThinkPHP中了,现在可以在程序中任何地方使用sendMail()方法就行了,不需要引入function.php文件,因为ThinkPHP会自动到这个文件中寻找。



ThinkPHP 3.2中vendor()方法的深入研究及PHPMailer的正确扩展


当我们想在ThinkPHP中引入第三方扩展,而第三方扩展又没有按照ThinkPHP的规范在编写的时候时,就需要将第三方扩展放置到Library/Vendor目录下,当然,这是针对ThinkPHP 3.2而言,低版本则根据情况来看了。

然后需要在Controller或function中使用第三方扩展时,就可以直接使用vendor()方法来进行引用了。

不过当我将PHPMailer放在Vendor目录下后(具体可以参考前面的一篇博客:http://www.xcoder.cn/index.php/archives/889),在本机运行得好好得,最近将程序上传到服务器上时,直接提示

Class ‘PHPMailer’ not found

然后又在本机运行,还是正确!通过前面这片博客可以知道,我是通过

vendor('PHPMailer.class#PHPMailer');

这行代码将PHPMailer引入的。既然提示找不到PHPMailer类,说明没有被正确引入。这是为什么呢?就粗略看了一下vendor()方 法的源码,这才发现其实vendor()方法也就是对import()方法进行了一次参数组装,然后还是交给了import()方法处理。

查看import()方法的源码又发现,在import()方法中,对于上面传入参数的解析其实就是将’.’替换成’/’,将’#’替换成 了’.’,baseurl则由vendor()方法自动补充上了,指向Vendor目录。所以上面vendor()方法中的参数最终还是被解析成了如下目 录:

Library/Vendor/PHPMailer/class.PHPMailer.php

而PHPMailer的入口文件的实际目录地址为:

Library/Vendor/phpmailer/class.phpmailer.php

内容都一样的嘛!不过我用的是Linux的服务器,所以对大小写是严格区分的,这样当然不能成功导入这个类。而解决办法就是将vendor()引入改为:

vendor(‘phpmailer.class#phpmailer’)

另外对于PHPMailer使用时还要注意一点,PHPMailer如果使用SMTP方式发送邮件,需要PHP对fsockopen的支持,所以我们需要修改php.ini中disable_functions中将fscokopen删除,否则会出现运行错误:

fsockopen() has been disabled

通过PHPMailer的ErrorInfo属性可以获取到!


© 著作权归作者所有

BearCatYN
粉丝 26
博文 158
码字总数 11947
作品 0
朝阳
程序员
私信 提问
ThinkPHP 中使用 PHPMailer 发送邮件 支持163和QQ邮箱等

PHP是自带可以发送邮件的Mail()函数的,但需要在php.ini配置。本文将介绍一种简单的通过PHPMailer发送邮件的方法。   而PHPMailer是一个用于发送电子邮件的PHP函数包,它可以使用SMTP的方法...

freedonn
2014/04/25
881
1
ThinkPHP结合PHPMailer自动发送邮件功能

在最近的一个case中,是一个类OA的项目,客户需要有邮件提醒。整个的程序架构考虑敏捷开发,使用了ThinkPHP,因为在之前做JSP的时候用过PHPMailer,所以就考虑将PHPMailer引入进来。 具体的方...

张志浩
2012/10/08
224
0
《PHP发送邮件PHPMailer》系列分享专栏

《PHP发送邮件PHPMailer》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201726.html 文章 PHPMailer邮件类利用smtp.163.com发送邮件方法 PHPMailer安装方法及简...

开元中国2015
2018/11/05
113
0
Thinkphp3.2 PHPMailer 发送邮件

Thinkphp3.2 PHPMailer 发送邮件结合QQ企业邮箱发送邮件 下载附件PHPMailer解压到ThinkPHPLibraryVendor 在Common文件夹新建function.php /** * 邮件发送函数 */ function sendMail($to, $t...

张悟空
2015/01/30
731
0
phpmailer在IIS服务器出现SSL错误。。

在thinkphp的项目中使用phpmailer, 使用thinkphp自带的服务器没问题,但在IIS上部署出现 stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages: error......

孔繁波
2017/04/08
104
0

没有更多内容

加载失败,请刷新页面

加载更多

How to Round a Number to N Decimal Places in Java

1. Overview In this short article, we're going to look at how to round a number to n decimal places in Java. 2. Decimal Numbers in Java Java provides two primitive types that ca......

Ciet
36分钟前
36
0
SpringCloud 基础教程(六)-负载均衡Ribbon

 我的博客:兰陵笑笑生,欢迎浏览博客!  上一章 SpringCloud基础教程(五)-配置中心热生效和高可用当中,我们对配置中心进行进行了深入的了解,本章将继续微服务架构的深入学习,了解在微服务...

_兰陵笑笑生
51分钟前
49
0
java面向对象(3)匿名对象与构造方法详解

一.匿名对象 1. 说明 有名字的对象:普通对象 没有名字的对象:匿名对象 匿名对象,用到链式编程,简单方便快捷。 如果,追求速度:匿名对象 如果,追求效率,内存占用低:普通对象 2.小案例...

煌sir
58分钟前
51
0
【自用】 Flutter Stack & Align 布局

Dart: Stack( children: <Widget>[ Align( child: Icon(Icons.home), alignment: Alignment(0,0), ), Align( child: Icon(Icons.se......

Tensor丨思悟
58分钟前
33
0
计算机实现原理专题--自动化(七)

在目前电路中,假设需要在原来的结果中再加两个数,较好的做法是从0020h处存放新的指令,并从0030h处存放新的数据: 现在两部分的指令起始地址分别为:0000h和0020h,两部分数据的起始地址分...

FAT_mt
今天
50
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部