将PHPMailer整合到ThinkPHP 3.2 中实现SMTP发送邮件
ThinkPHP没有邮件发送的功能,因而,我就想了想,就将PHPMailer整合到ThinkPHP中吧。php
PHPMailer是不符合ThinkPHP规范的插件程序,因此,咱们须要先将PHPMailer程序放到ThinkPHP的 Library/Vendor目录下,我这里是最新版的ThinkPHP 3.2,若是是是ThinkPHP 3.2以前的版本,可能就是Lib目录了。Vendor目录专门用于存放非标准ThinkPHP插件的目录,以下:thinkphp

PHPMailer整合到ThinkPHP中的存放目录数组
接下来为了方便发送邮件,咱们能够定义一个专门发送邮件的函数sendMail(),这个函数能够只接受邮件发送的最基本的参数,发送到哪一个邮 箱$id,邮件的主题$subject,邮件的内容$content。不过为了方便咱们修改SMTP邮件发送服务器,咱们先在config.php文件中 定义好邮件发送服务器,内容以下:xcode
config.php服务器
'MAIL_HOST' => '邮件发送SMTP服务器' , |
'MAIL_USERNAME' => 'SMTP服务器登录用户名' , |
'MAIL_PASSWORD' => 'SMTP服务器登录密码' , |
'MAIL_CHARSET' => 'utf-8' , |
具体的配置能够根据本身的须要添加。根据PHPMailer的规则本身定义就能够了,而后再在定义函数中使用大C(‘CONF_NAME’)方法来调用就能够了。函数
再接下来就须要在common文件夹下的function.php文件中定义邮件发送函数sendMail(),若是function.php文件 不存在的话新建一个就能够了。并且这个function.php文件中的方法能够在全局使用,不须要先引入function.php文件。url
在方法中须要引入PHPMailer时,不是经过import关键字来实现的,而是经过公共方法vendor()方法来实现的。具体内容以下:spa
view source插件
function sendMail( $to , $subject , $content ) { |
vendor( 'PHPMailer.class#PHPMailer' ); |
$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 ->FromName = '憨豆儿笑园' ; |
$mail ->IsHTML(C( 'MAIL_ISHTML' )); |
$mail ->Subject = $subject ; |
到这一步,咱们已经将PHPMailer整合到了ThinkPHP中了,如今能够在程序中任何地方使用sendMail()方法就好了,不须要引入function.php文件,由于ThinkPHP会自动到这个文件中寻找。code
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属性能够获取到!