phplist及phpmailer(组合使用)通过gmail发送邮件的配置方法


Posted in PHP onMarch 30, 2016

本文实例讲述了phplist及phpmailer通过gmail发送邮件的配置方法。分享给大家供大家参考,具体如下:

一般来说,只要你使用的不是gmail邮箱,那么利用phplist发送邮件只要按照前面《PHP的邮件群发系统phplist配置方法详细总结》配置就够了。但若你如同我一样不幸,必须使用gmail这种有ssl验证的邮箱,那么恭喜你,我的不幸现在已然成为你的幸运,经过数天的尝试,我终于成功将gmail与phplist组合在了一起。现将经验分享于此,希望对各位同我一般境遇的同志有用。另外,phplist的核心是phpmailer,我提出的解决方案也主要是围绕phpmailer的,所以需要使用phpmailer通过gmail发送邮件而不能成功者也可以参考我的方法。

首先按照《PHP的邮件群发系统phplist配置方法详细总结》中的配置方法通过gmail发送邮件,在发送测试邮件时phplist会报告发送邮件失败,在事件日志(eventlog)里会有错误提示“Mailer Error: The following From address failed:...”,说是发件人地址存在问题。难道是已经连上smtp服务器,但是发送邮件过程中存在问题吗?可以用一个方法试验一下到底连没连上smtp服务器:我把config.php文件中的邮箱帐户密码故意填错,结果发送测试邮件时仍然报同样的错误,看来是根本就没连上smtp服务器,这phplist的错误报告也太……

知道是没连上smtp服务器那就说明问题出现在phplist发送邮件的核心——另一款著名开源软件phpmailer。

上网查了一下phpmailer发送gmail邮件的资料,发现人们说旧版本的phpmailer不支持ssl验证,不能连接gmail的smtp服务器,而此问题已在新版的phpmailer中解决了。

打开lists/admin/phpmailer/ChangeLog.txt,发现最新版的phplist自带的phpmailer的版本是1.73,是2005年出的,确实不算新。于是上phpmailer的官网下了个最新的5.1的。

我想先研究一下新版的phpmailer是如何解决ssl验证的问题的,于是看了一下其自带的一些说明文档,碰巧发现在PHPMailer_v5.1/docs下有一个use_gmail.txt,看来是官方比较重视gmail问题,专门出了一个demo供人参考。打开一看也确实是一个完整的php页面文件,基本上修改了文件扩展名、邮箱用户名和密码就能使用,但如果仅仅如此修改,在访问该测试页面时会报错,也不知官方出的demo怎么会有这样的错误,居然会调用一个未定义的函数,而且有一些没有必要的成分。我们只不过想先测试一下能否正常发送邮件,所以我将其修改为:

<?php
    // example on using PHPMailer with GMAIL
    include("class.phpmailer.php");
    include("class.smtp.php"); // note, this is optional - gets called from main class if not already loaded
    $mail       = new PHPMailer();
    $body       = "test";
    $mail->IsSMTP();
    $mail->SMTPAuth  = true;         // enable SMTP authentication
    $mail->SMTPSecure = "ssl";         // sets the prefix to the servier
    $mail->Host    = "smtp.gmail.com";   // sets GMAIL as the SMTP server
    $mail->Port    = 465;          // set the SMTP port
    $mail->Username  = "myname@gmail.com"; // GMAIL username
    $mail->Password  = "mypassword";      // GMAIL password
    $mail->From    = "myname@gmail.com";
    $mail->FromName  = "Webmaster";
    $mail->Subject  = "This is the subject";
    $mail->AltBody  = "This is the body when user views in plain text format"; //Text Body
    $mail->WordWrap  = 50; // set word wrap
    $mail->MsgHTML($body);
    $mail->AddReplyTo("myname@gmail.com","Webmaster");
    $mail->AddAddress("myname@gmail.com","First Last");
    $mail->IsHTML(true); // send as HTML
    if(!$mail->Send()) {
     echo "Mailer Error: " . $mail->ErrorInfo;
    } else {
     echo "Message has been sent";
    }
?>

结果发现访问此页面时仍然报错,真是令人无奈,官方给的demo怎么会无法运行?

这时我忽然想起PHPMailer_v5.1/docs下有一个名为Note_for_SMTP_debugging.txt的文件,现在我不正是在为连不上smtp服务器而烦恼吗,不妨看一下里面提供的调试方法。

打开文件看完第一行就眼前一亮,这正是我所需要的!其实使用方法也很简单,只要在

$mail->IsSMTP();

前插入

$mail->SMTPDebug = 1;

便可在报错同时得到更见详细的错误信息。真是好东西^_^

按照这样修改完后,我在访问页面时得到了更加详细的说明——“SMTP -> ERROR: Failed to connect to server: Unable to find the socket transport "ssl" - did you forget to enable it when you configured PHP? (28593608)”。

原来如此,于是我打开了我的php配置文件(C://Windows/php.ini)搜索ssl,果然搜到一个关于ssl的扩展

;extension=php_openssl.dll

它没有被打开。去掉其前面用于注释的“;”,然后重启服务器,再次访问测试页面use_gmail.php,仍然是同样的错误提示。

没办法了,我上网查了一下关于php以及apache的ssl配置的文章,发现仅仅是将ssl扩展模块开启是不够的,还要对openssl进行配置,在Windows环境下配置方法倒是很简单——找到php安装目录下的ssleay32.dll和libeay32.dll,将这二者复制到windows下的system32目录中即可(在php.ini中开启extension=php_openssl.dll还是必要的)。当然,不想“污染”system32目录的同志们可以用修改环境变量的方法,只要让ssleay32.dll和libeay32.dll在系统路径下就可以了。(如果你使用的不是winidows操作系统,请上网查找针对你的操作系统的配置ssl的方法,应该不难找到)

这回再访问use_gmail.php发现可以成功发送了!

在此基础上,我们的phplist的问题也可以解决了:用新版phpmailer中的class.phpmailer.php和class.smtp.php覆盖lists/admin/phpmailer中的对应文件,然后修改lists/admin/class.phplistmailer.php中36行左右处的

$this->SMTPAuth = true;
$this->Helo = getConfig("website");
$this->Host = PHPMAILERHOST;

为:

$this->IsSMTP();            # Add
$this->SMTPAuth = true;
$this->SMTPSecure = "ssl";       # Add
$this->Helo = getConfig("website");
$this->Host = PHPMAILERHOST;
$this->Port = 465            # Add

其中phpmailer默认端口号为25,是大多数smtp服务器的端口号,但是gmail使用的端口号是465,所以要重新设置。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP 文件类型判断代码
Mar 13 PHP
php若干单维数组遍历方法的比较
Sep 20 PHP
关于更改Zend Studio/Eclipse代码风格主题的介绍
Jun 23 PHP
php版淘宝网查询商品接口代码示例
Jun 17 PHP
PHP中使用strpos函数实现屏蔽敏感关键字功能
Aug 21 PHP
Linux系统递归生成目录中文件的md5的方法
Jun 29 PHP
php比较两个字符串长度的方法
Jul 13 PHP
php获取网站百度快照日期的方法
Jul 29 PHP
php 文件下载 出现下载文件内容乱码损坏的解决方法(推荐)
Nov 16 PHP
PHP计算近1年的所有月份
Mar 13 PHP
详细解读php的命名空间(一)
Feb 21 PHP
PHP7使用ODBC连接SQL Server2008 R2数据库示例【基于thinkPHP5.1框架】
May 06 PHP
PHP的邮件群发系统phplist配置方法详细总结
Mar 30 #PHP
Laravel路由设定和子路由设定实例分析
Mar 30 #PHP
PHP的Yii框架中过滤器相关的使用总结
Mar 29 #PHP
简介PHP的Yii框架中缓存的一些高级用法
Mar 29 #PHP
深入解析PHP的Yii框架中的缓存功能
Mar 29 #PHP
PHP实现可自定义样式的分页类
Mar 29 #PHP
PHP的Yii框架中View视图的使用进阶
Mar 29 #PHP
You might like
PHP图片裁剪函数(保持图像不变形)
2014/05/04 PHP
php中strlen和mb_strlen用法实例分析
2016/11/12 PHP
PHP实现批量修改文件名的方法示例
2019/09/18 PHP
php面试实现反射注入的详细方法
2019/09/30 PHP
50个优秀经典PHP算法大集合 附源码
2020/08/26 PHP
javascript[js]获取url参数的代码
2007/10/17 Javascript
js 对小数加法精度处理示例说明
2013/12/27 Javascript
JavaScript框架(iframe)操作总结
2014/04/16 Javascript
jQuery的观察者模式详解
2014/12/22 Javascript
js实现类似jquery里animate动画效果的方法
2015/04/10 Javascript
jquery中map函数遍历数组用法实例
2015/05/18 Javascript
jQuery实现图片左右滚动特效
2020/04/20 Javascript
JavaScript编程中window的location与history对象详解
2015/10/26 Javascript
简单对比分析JavaScript中的apply,call与this的使用
2015/12/04 Javascript
完美实现八种js焦点轮播图(下篇)
2020/04/20 Javascript
JavaScript队列函数和异步执行详解
2017/06/19 Javascript
vue使用axios跨域请求数据问题详解
2017/10/18 Javascript
ES6下子组件调用父组件的方法(推荐)
2018/02/23 Javascript
vue-cli3.0 特性解读
2018/04/22 Javascript
微信小程序实现录音时的麦克风动画效果实例
2019/05/18 Javascript
使用Vue 实现滑动验证码功能
2019/06/27 Javascript
vue 使用v-for进行循环的实例代码详解
2020/02/19 Javascript
VUE前端从后台请求过来的数据进行转换数据结构操作
2020/11/11 Javascript
[14:00]DOTA2国际邀请赛史上最长大战 赛后专访B神
2013/08/10 DOTA
[01:04]DOTA2:伟大的Roshan雕塑震撼来临
2015/01/30 DOTA
[44:09]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第二局
2016/02/25 DOTA
[06:43]2018DOTA2国际邀请赛寻真——VGJ.Thunder
2018/08/11 DOTA
[03:12]完美世界DOTA2联赛PWL DAY6集锦
2020/11/05 DOTA
Python可跨平台实现获取按键的方法
2015/03/05 Python
使用python进行拆分大文件的方法
2018/12/10 Python
flask应用部署到服务器的方法
2019/07/12 Python
Michael Kors加拿大官网:购买设计师手袋、手表、鞋子、服装等
2019/03/16 全球购物
24岁生日感言
2014/01/13 职场文书
小学生考试获奖感言
2014/01/30 职场文书
django上传文件的三种方式
2021/04/29 Python
Vue实现tab导航栏并支持左右滑动功能
2021/06/28 Vue.js