将PHPMailer整合到ThinkPHP 3.2 中实现SMTP发送邮件
本内容转载出处:http://my.oschina.net/BearCatYN/blog/299192 并对以下内容做了一处说明。
ThinkPHP没有邮件发送的功能,于是,我就想了想,就将PHPMailer整合到ThinkPHP中吧。
PHPMailer是不符合ThinkPHP规范的插件程序,所以,我们需要先将PHPMailer程序放到ThinkPHP的 Library/Vendor目录下,我这里是最新版的ThinkPHP 3.2,如果是是ThinkPHP 3.2之前的版本,可能就是Lib目录了。Vendor目录专门用于存放非标准ThinkPHP插件的目录,如下:
PHPMailer整合到ThinkPHP中的存放目录
接下来为了方便发送邮件,我们可以定义一个专门发送邮件的函数sendMail(),这个函数可以只接受邮件发送的最基本的参数,发送到哪个邮 箱$id,邮件的主题$subject,邮件的内容$content。不过为了方便我们修改SMTP邮件发送服务器,我们先在config.php文件中 定义好邮件发送服务器,内容如下:
config.php
1 <?php
2 return array(
3 // 配置邮件发送服务器
4 'MAIL_SMTP' =>TRUE,
5 'MAIL_HOST' =>'邮件发送SMTP服务器',
6 'MAIL_SMTPAUTH' =>TRUE,
7 'MAIL_USERNAME' =>'SMTP服务器登陆用户名',
8 'MAIL_PASSWORD' =>'SMTP服务器登陆密码',
9 'MAIL_SECURE' =>'tls', //注此功能需要在php.ini文件中开启extension=php_openssl.dll功能支持(本人在这里吃了一个亏)
10 'MAIL_CHARSET' =>'utf-8',
11 'MAIL_ISHTML' =>TRUE,
12 );
13 ?>
具体的配置可以根据自己的需要添加。根据PHPMailer的规则自己定义就可以了,然后再在定义函数中使用大C(‘CONF_NAME’)方法来调用就可以了。
再接下来就需要在common文件夹下的function.php文件中定义邮件发送函数sendMail(),如果function.php文件 不存在的话新建一个就可以了。而且这个function.php文件中的方法可以在全局使用,不需要先引入function.php文件。
在方法中需要引入PHPMailer时,不是通过import关键字来实现的,而是通过公共方法vendor()方法来实现的。具体内容如下:
1 <?php
2 /**
3 * 邮件发送函数
4 */
5 function sendMail($to, $subject, $content) {
6 vendor('PHPMailer.class#PHPMailer');
7 $mail = new PHPMailer();
8 // 装配邮件服务器
9 if (C('MAIL_SMTP')) {
10 $mail->IsSMTP();
11 }
12 $mail->Host = C('MAIL_HOST');
13 $mail->SMTPAuth = C('MAIL_SMTPAUTH');
14 $mail->Username = C('MAIL_USERNAME');
15 $mail->Password = C('MAIL_PASSWORD');
16 $mail->SMTPSecure = C('MAIL_SECURE');
17 $mail->CharSet = C('MAIL_CHARSET');
18 // 装配邮件头信息
19 $mail->From = C('MAIL_USERNAME');
20 $mail->AddAddress($to);
21 $mail->FromName = '憨豆儿笑园';
22 $mail->IsHTML(C('MAIL_ISHTML'));
23 // 装配邮件正文信息
24 $mail->Subject = $subject;
25 $mail->Body = $content;
26 // 发送邮件
27 if (!$mail->Send()) {
28 return FALSE;
29 } else {
30 return TRUE;
31 }
32 }
33 ?>
到这一步,我们已经将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属性可以获取到!
将PHPMailer整合到ThinkPHP 3.2 中实现SMTP发送邮件的更多相关文章
- 使用System.Net.Mail中的SMTP发送邮件(带附件)
System.Net.Mail 使用简单邮件传输协议SMTP异步发送邮件 想要实现SMTP发送邮件,你需要了解这些类 SmtpClient :使用配置文件设置来初始化 SmtpClient类的新实例. ...
- 如何在 Laravel 中使用 SMTP 发送邮件(适用于 163、QQ、Gmail 等)
Laravel 和 Laravel 的邮件发送使用方式完全一致.Laravel 的邮件发送中文文档在:http: 邮箱为例,展示如何用 Laravel 内置的邮件发送类来发送邮件. 配置 修改邮 ...
- Python中使用SMTP发送邮件以及POP收取邮件
假设我们自己的电子邮件地址是from@163.com,对方的电子邮件地址是to@sina.com(这里的地址虚拟的),现在我们用Outlook或者Foxmail之类的软件写好邮件,填上对方的Email ...
- python中的SMTP发送邮件
一. 介绍 python3中自带了smtplib模块和email模块 smtplib模块:负责与邮件服务器的交互 email模块:负责组织邮件内容 二. smtplib模块 smtplib模块:主要是 ...
- 在CI中集成phpmailer,方便使用SMTP发送邮件
直接使用phpmailer的话,有时候不是很方便,特别你的很多功能都是基于CI完成的时候,要相互依赖就不方便了,所以在想,那是否可以将phpmailer集成到CI中呢,像使用email类这样使用他,功 ...
- 东正王增涛浅析OA信息化整合平台系统在企业中的应用价值
王增涛说OA信息化整合平台系统作为企业管理中最基础的管理软件,已在企业成长道路上存在多年,它的应用开启了智能移动办公的先河,也让企业的办公流程管理更加的便捷.高效.流畅.省时.省力,它的使用不但让企业 ...
- thinkphp <volist>标签中 <if> 判断的写法
thinkphp <volist>标签中 <if> 判断的写法 <volist name="data" id="vo"> & ...
- hibernate4整合spring3.1的过程中的异常问题
(1)hibernate4整合spring3.1的过程中,发现了java.lang.NoClassDefFoundError: Lorg/hibernate/cache/CacheProvider异常 ...
- thinkphp在模板中使用php的函数
thinkphp在模板中使用php的函数 使用 {:函数名} 的形式 例如: // 获取 session 中存的值 {:session('admin.loginname')} // 输出当前日期 {: ...
随机推荐
- linux 系统 解决php -v查看到版本于phpinfo()打印的版本不一致问题
发现问题的原因: 安装zip扩展后,配置成功,但是使用gitlab合并的时候发生错误,经检查,使用phpinfo打印出来的php版本为7.1,而使用linux度服务器 运行 php -v的版本却是5. ...
- sql面试 case /union all
1.sum(case when results='胜' then 1 else 0 end) as '胜' 要求查询出结果: sql语句实现: select date, sum(case when r ...
- centos7 安装 nginx-1.18.0 并设置开机自启动
一.到官网下载nginx Mainline version: nginx主力版本,为开发版 Stable version: 稳定版,在生产环境中选择此版本进行安装 Legacy versions: ...
- ArcMap问题及解决方案
1.导出的矢量文件dbf格式用Excel打开后全是乱码怎么解决? 该类问题的部分解决方案是将数据用[表转Execl ] 工具转出来 能根本解决的方法是修改注册表 详细解决方案是: 乱码解决办法:①快捷 ...
- ArcMap操作随记(13)
1.为地图册创建定位器地图 创建数据框→标注字段(PageName)→格网索引图层[导出数据]→图层右键,[属性]|[定义查询] 2.为地图册创建动态文本 导出→[文件]|[导出地图]→PDF 3.关 ...
- Prism 框架解读之一系列
名词解释 1.什么是IOC IOC是 Inversion of Control的缩写,多数书籍翻译成"控制反转". IOC 和依赖注入(DI) 所谓依赖注入,就是由IOC容器在运行 ...
- 用 Java 写一个线程安全的单例模式(Singleton)?
请参考答案中的示例代码,这里面一步一步教你创建一个线程安全的 Java 单例类.当我们说线程安全时,意思是即使初始化是在多线程环境中,仍然能保证单个实例.Java 中,使用枚举作为单例类是最简单的方式 ...
- SpringSecurity集成启动报 In the composition of all global method configuration, no annotation support was actually activated 异常
异常内容: Caused by: java.lang.IllegalStateException: In the composition of all global method configurat ...
- 五、关于mycat踩过的坑
1.ER分表的从表无法批量插入,例如:insert into tab_a(c1,c2) values(v1,v2),(v11,v21)或者使用jdbctemplate进行batchUpdate操作会报 ...
- Spring框架中的单例bean是线程安全的吗?
不,Spring框架中的单例bean不是线程安全的.