当前博客邮件发送功能修复CommentToMail折腾
缘起
先是看到了一篇博文上写到了使用LoveKKComment实现了评论回复邮件提醒才一敲脑袋,哦豁,好像还真忘了这个功能,遂又是一个不休的夜晚。
LoveKKComment
LoveKKComment是一款Typecho邮件通知类插件,支持SMTP、Send Cloud、阿里云邮件推送三种邮件通知方式。然而我这里安装配置之后,一点儿反应都没有,转而投向CommentToMail,然而却又是个大坑。
- 安装,配置邮件服务器,测试邮件发送成功后,便到了模拟测试评论回复的环节。
- 然而不幸的是,尽管每次都没有返回邮件发送失败的消息,但只有博主能够收到评论的邮件,评论者并不能收到被回复的邮件提醒!!!
开启邮件发送日志,发现插件设置为不发送此类邮件或被评论访客拒收邮件!,一路追根溯源,逼着我阅读PHP源码才发现了在Plugin.php这块:
//是否接收邮件 if (isset($_POST['receiveMail']) && 'yes' == $_POST['receiveMail']) { $cfg['banMail'] = 0; } else { $cfg['banMail'] = 1; }
然而主题中不接收回复邮件通知按钮的元素名为banmail,所以应改为
//是否接收邮件 if (isset($_POST['banmail']) && 'stop' == $_POST['banmail']) { $cfg['banMail'] = 1; } else { $cfg['banMail'] = 0; }
- 其实到之后才发现在早期CommentToMail 2.0.1里便是如此= =,这才是原来的逻辑。
环境BUG
如果使用这个插件依然不能发送邮件,那么恭喜,我把坑都踩完了。。
两种情况
测试邮件不能发送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); }
- 测试邮件能发送,但是回复不能触发,同上,检查函数是否被禁用,更大的可能性,这是环境配置问题,如果你是用的是宝塔面板,那么宝塔面板的PHP7.0或者7.3由于编译问题,函数是无效的。请换用PHP7.1或5.6即可。
- 以上都不能解决问题,那就使用CommentToMail4.1版本
注:CommentToMail 用了异步触发,就是访客回复时,插件会自己去访问自己的一个页面,然后被访问的那个页面发信。
异步触发中很多步骤都可能出问题,比如php无法访问到网站本身,或者执行到一半关闭连接时发送邮件的程序被关了。这些问题涉及到具体环境配置。
本文共 628 个字数,平均阅读时长 ≈ 2分钟