20200119更新
官方开发人员对最新开发版适配了异步回调
https://joyqi.com/typecho/typecho-async-service.html
下载地址
https://joyqi.com/usr/uploads/2017/11/3224167191.gz
CommentToMail v4.1 现已发布
详情查看作者博客
https://blog.uniartisan.com/archives/CommentToMail.html
下载地址
https://blog.uniartisan.com/app/CommentToMail.tar.gz
早期版本中邮件发送失败一个很重要的原因是,异步触发失败导致邮件不能发送,而CommentToMail v4.1另辟蹊径,采用网站监控程序触发的方式发送邮件,实在是高明
使用方法
正常设置插件后,设置key
完整地址写入网站监控(此处使用360网站监控)
默认每10分钟触发一次,每10分钟将之前的右键发送一次
监控的同时正常接受邮件
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");
}
Typecho 上使用最广泛的插件是 CommentToMail,最早由 DEFE 开发,后来由 Byends Upd 接手。该插件通过常用的 PHP Mail,SendMail 或者 SMTP 来发送邮件
同时lan tian 制作了基于 Mailgun 云邮API 的 Typecho评论插件分支
下载地址
百度云 已更新
为什么不用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端口
QQ邮箱需要使用授权码而非QQ登录密码
环境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即可
细节
我想知道博主你改了什么,我不放心你的插件,我自己改改可以吗
讨论过程
此次插件修改是lan tian全权指挥,简称云修改???(没毛病)
在Action.php
的sendMail()
函数中,在
$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无法访问到网站本身,或者执行到一半关闭连接时发送邮件的程序被关了。这些问题涉及到具体环境配置
完毕
评论