本内容转载出处: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()方法来实现的。具体内容如下:

view source

 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发送邮件的更多相关文章

  1. 使用System.Net.Mail中的SMTP发送邮件(带附件)

    System.Net.Mail 使用简单邮件传输协议SMTP异步发送邮件 想要实现SMTP发送邮件,你需要了解这些类 SmtpClient :使用配置文件设置来初始化 SmtpClient类的新实例. ...

  2. 如何在 Laravel 中使用 SMTP 发送邮件(适用于 163、QQ、Gmail 等)

    Laravel  和 Laravel  的邮件发送使用方式完全一致.Laravel  的邮件发送中文文档在:http: 邮箱为例,展示如何用 Laravel 内置的邮件发送类来发送邮件. 配置 修改邮 ...

  3. Python中使用SMTP发送邮件以及POP收取邮件

    假设我们自己的电子邮件地址是from@163.com,对方的电子邮件地址是to@sina.com(这里的地址虚拟的),现在我们用Outlook或者Foxmail之类的软件写好邮件,填上对方的Email ...

  4. python中的SMTP发送邮件

    一. 介绍 python3中自带了smtplib模块和email模块 smtplib模块:负责与邮件服务器的交互 email模块:负责组织邮件内容 二. smtplib模块 smtplib模块:主要是 ...

  5. 在CI中集成phpmailer,方便使用SMTP发送邮件

    直接使用phpmailer的话,有时候不是很方便,特别你的很多功能都是基于CI完成的时候,要相互依赖就不方便了,所以在想,那是否可以将phpmailer集成到CI中呢,像使用email类这样使用他,功 ...

  6. 东正王增涛浅析OA信息化整合平台系统在企业中的应用价值

    王增涛说OA信息化整合平台系统作为企业管理中最基础的管理软件,已在企业成长道路上存在多年,它的应用开启了智能移动办公的先河,也让企业的办公流程管理更加的便捷.高效.流畅.省时.省力,它的使用不但让企业 ...

  7. thinkphp <volist>标签中 <if> 判断的写法

    thinkphp <volist>标签中 <if> 判断的写法 <volist name="data" id="vo"> & ...

  8. hibernate4整合spring3.1的过程中的异常问题

    (1)hibernate4整合spring3.1的过程中,发现了java.lang.NoClassDefFoundError: Lorg/hibernate/cache/CacheProvider异常 ...

  9. thinkphp在模板中使用php的函数

    thinkphp在模板中使用php的函数 使用 {:函数名} 的形式 例如: // 获取 session 中存的值 {:session('admin.loginname')} // 输出当前日期 {: ...

随机推荐

  1. 4月8日 python学习总结 模块与包

    一.包 #官网解释 Packages are a way of structuring Python's module namespace by using "dotted module n ...

  2. 领域驱动模型DDD(一)——服务拆分策略

    前言 领域驱动模型设计在业界也喊了几年口号了,但是对于很多"务实"的程序员来说,纸上谈"术"远比敲代码难得太多太多.本人能力有限,在拜读相关作品时既要隐忍书中晦 ...

  3. xss平台搭建

    1. xss平台搭建 l 将xss平台源码放置在网站目录下 l 进入MySQL管理界面中的phpMyAdmin界面,新建一个XSS平台的数据库 l 修改XSS源码文件目录下的config.php中的数 ...

  4. Visual Studio 2022 预览版下载来了(x64位)

    Visual Studio 2022 预览版下载:https://visualstudio.microsoft.com/zh-hans/vs/preview/vs2022/

  5. Java线程通信

    Java线程通信 螣蛇乘雾,终为土灰. 多个线程协同工作完成某个任务时就会涉及到线程间通信问题.如何使各个线程之间同时执行,顺序执行.交叉执行等. 一.线程同时执行 创建两个线程a和b,两个线程内调用 ...

  6. JavaScript 02 运算符,分支结构

    一元换算符 字符串类型 对于字符串,来说自增或自减会自动进行类型转换 1.var str = '10' 自动转换 从string转为number 2.str++ NaN 对于转化不成功的string类 ...

  7. error C4996: 'std::_Copy_impl'

    以下代码段在VS2008编译可以通过,只是会提示不安全: std::vector<unsigned char> fileData ="asdfsfsfsfsdf";// ...

  8. Java代码规范总结,更新持续中

    1. 实例的开启与关闭 var zkClient: ZooKeeper = null try { zkClient = new ZooKeeper(getZkUrl(), 2000, new Watc ...

  9. Kafka学习(二)

    作者:程序员cxuan链接:https://www.zhihu.com/question/53331259/answer/1262483551来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非 ...

  10. The Http request is not acceptable for the requested resource.

    一.问题来源 最近给第三方做了一个我们系统的免密登陆,开发完成本地测试没有问题,但是第三方调用免密登陆接口并跳转之后报如下错误: The Http request is not acceptable ...