【更新】CommentToMail typecho2017&v4.1& Mailer三版本,支持php5.6/7,插件详解

【更新】CommentToMail typecho2017&v4.1& Mailer三版本,支持php5.6/7,插件详解

王忘杰
2017-12-26 / 96 评论 / 157,965 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2020年01月19日,已超过1731天没有更新,若内容或图片失效,请留言反馈。

20200119更新

官方开发人员对最新开发版适配了异步回调

https://joyqi.com/typecho/typecho-async-service.html

下载地址
https://joyqi.com/usr/uploads/2017/11/3224167191.gz

CommentToMail v4.1 现已发布

QQ截图20171005232940.png

详情查看作者博客
https://blog.uniartisan.com/archives/CommentToMail.html

下载地址
https://blog.uniartisan.com/app/CommentToMail.tar.gz

早期版本中邮件发送失败一个很重要的原因是,异步触发失败导致邮件不能发送,而CommentToMail v4.1另辟蹊径,采用网站监控程序触发的方式发送邮件,实在是高明

使用方法
正常设置插件后,设置key
QQ截图20171005233042.png

完整地址写入网站监控(此处使用360网站监控)
QQ截图20171005233015.png

默认每10分钟触发一次,每10分钟将之前的右键发送一次
QQ截图20171005233004.png

监控的同时正常接受邮件
QQ截图20171005232940.png

CommentToMail typecho 2017版

bug修复&下载地址 https://www.xlogs.cn/archives/49/

SOCKET请求错误后转入CURL方式

if ($fp === false) {
            //self::saveLog("SOCKET错误," . $errno . ':' . $errstr);
            // Socket请求失败,使用Curl
            self::curl($url);
            return false;
        }

CURL方式关闭证书验证以兼容QQ邮箱等安全级别不够的邮箱

public static function curl($url)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HTTPGET, 1);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);       // 将curl_exec()获取的信息以文件流的形式返回,不直接输出。  
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1);       // 连接等待时间
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);   // 跳过证书检查
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true);    // 从证书中检查SSL加密算法是否存在
    curl_setopt($ch, CURLOPT_TIMEOUT, 1);              // curl允许执行时间
    
    self::saveLog("Curl 方式发送\r\n");
    
    curl_exec($ch);
    curl_close($ch);
    self::saveLog("请求结束\r\n");
}


TIM截图20170610234519.png
Typecho 上使用最广泛的插件是 CommentToMail,最早由 DEFE 开发,后来由 Byends Upd 接手。该插件通过常用的 PHP Mail,SendMail 或者 SMTP 来发送邮件
同时lan tian 制作了基于 Mailgun 云邮API 的 Typecho评论插件分支

TIM图片20170610233406.png

下载地址
百度云 已更新
为什么不用github?因为我不是作者,我会通知作者更新到他的github

更新了什么?
博主我的插件用着明明没问题,你更新了啥?
详情可以点击这里 邮件发送失败:SMTP connect() failed. PHP>=5.6
当我们使用QQ邮箱(非企业邮箱)的时候会发现邮件发不出去,修复了此bug

更新了PHP Mailer版本
关闭了使用SMTP发信的证书认证(QQ邮箱证书加密级别太低)
修改了插件说明(如果这也算的话。。)

支持的版本范围

typecho 0.9 1.0 1.1 开发版(2017-6-11)
php5.4 5.5 5.6 7.0 7.1

为什么要用加密邮箱发送邮件通知?
正常SMTP协议使用的是25端口,但是由于垃圾邮件泛滥,25端口普遍被拦截,因此才使用465的加密SMTP端口

设置图
465端口
TIM截图20170611000740.png
QQ邮箱需要使用授权码而非QQ登录密码

TIM截图20170611000856.png

环境BUG
如果你使用这个插件依然不能发送邮件,那么恭喜你,我把坑都踩完了。。
两种情况
1.测试邮件不能发送
smtp端口465 用户名 授权码 ssl加密勾选

邮件是否进入垃圾桶(使用QQ邮箱好处就是不用进垃圾桶,例如100@qq.com这种)

上源码,插件使用fsockopen,pfsockopen,stream_socket_client三种方式发送邮件,检查对应函数是否被禁止

   if (function_exists('fsockopen')) {
            $fp = @fsockopen ($scheme . $host, $port, $errno, $errstr, 30);
        } elseif (function_exists('pfsockopen')) {
            $fp = @pfsockopen ($scheme . $host, $port, $errno, $errstr, 30);
        } else {
            $fp = stream_socket_client($scheme . $host . ":$port", $errno, $errstr, 30);
        }

2.测试邮件能发送,但是回复不能触发
同上,检查函数是否被禁用

更大的可能性,这是环境配置问题
如果你是用的是宝塔面板,那么宝塔面板的PHP7.0由于编译问题,函数是无效的。。
请换用PHP7.1或5.6即可

细节
我想知道博主你改了什么,我不放心你的插件,我自己改改可以吗

讨论过程
TIM截图20170611001755.png

此次插件修改是lan tian全权指挥,简称云修改???(没毛病)

Action.phpsendMail()函数中,在

$mailer->SetFrom($this->_email->from, $this->_email->fromName);
$mailer->AddReplyTo($this->_email->to, $this->_email->toName);
$mailer->Subject = $this->_email->subject;
$mailer->AltBody = $this->_email->altBody;
$mailer->MsgHTML($this->_email->msgHtml);
$mailer->AddAddress($this->_email->to, $this->_email->toName);

这么一大段后插入:

$mailer->SMTPOptions = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
)
);

CommentToMail 自带的 PHPMailer 太老了,所以加上参数没用。
CommentToMail 的 lib 文件夹里有三个php文件,把它们用 https://github.com/PHPMailer/PHPMailer 上的对应的三个php

class.phpmailer.php开头加上:

require_once 'class.smtp.php';
require_once 'class.pop3.php';

CommentToMail 用了异步触发,就是访客回复时,插件会自己去访问自己的一个页面,然后被访问的那个页面发信。
异步触发中很多步骤都可能出问题,比如php无法访问到网站本身,或者执行到一半关闭连接时发送邮件的程序被关了。这些问题涉及到具体环境配置

完毕

0

评论

博主关闭了所有页面的评论