王忘杰

【更新】CommentToMail typecho2017&v4.1& Mailer三版本,支持php5.6/7,插件详解
20171121更新官方开发人员对最新开发版适配了异步回调https://joyqi.com/typecho/ty...
扫描右侧二维码阅读全文
26
2017/12

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

20171121更新

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

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.zhiyuanyun.cc/archives/CommentToMail.html

下载地址
https://blog.zhiyuanyun.cc/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无法访问到网站本身,或者执行到一半关闭连接时发送邮件的程序被关了。这些问题涉及到具体环境配置

完毕

Last modification:May 1st, 2018 at 10:54 am

71 comments

  1. 浅夏

    想问下 【该网页无法正常运作, 目前无法处理此请求,HTTP ERROR 502】 发送测试邮箱出现的这种情况属于什么问题呢?

  2. Uniartisan

    哈哈,趁着有时间更新插件到4.1.1
    下载地址 https://blog.zhiyuanyun.cc/app/CommentToMail.tar.gz
    更新日志
    https://blog.zhiyuanyun.cc/

  3. Loekman

    虽然老版本回复时邮件通知多加载了两秒,但我还是懒得换了。

  4. Noisky

    最新的开发板已经支持异步回调,可以考虑接入官方的异步回调
    https://joyqi.com/typecho/typecho-async-service.html

    1. 王忘杰
      @Noisky

      可是我不会

  5. 小姐姐

    哇……整了好久4.0版本一直失败 换了2.版本可以了…………难受(╯﹏╰)

    1. Uniartisan
      @小姐姐

      https://blog.zhiyuanyun.cc/archives/CommentToMail.html
      你可以看看这个

    2. Uniartisan
      @小姐姐

      怎么可能!哇啊啊啊啊啊!
      我自己用没问题的呀,你是卡在哪一步?可以回复我,我在博客中修正....

    3. 王忘杰
      @小姐姐

      并 不难

  6. Uniaritsan

    https://blog.zhiyuanyun.cc/archives/CommentToMail.html
    这是我在另一个分支上进行修改的....
    版权信息在插件文件中保留。这个是网址监控运行,不存在兼容性问题

    1. 王忘杰
      @Uniaritsan

      我觉得OK 已更新

  7. 红叶

    邮件发送失败:SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

    1. 梁兴健
      @红叶

      遇到同样问题

  8. WispX

    https://www.xlogs.cn/archives/49/
    修复https下评论无法通知的问题

    1. 王忘杰
      @WispX

      感谢大佬,文章已更新

  9. StupidPz

    哇,竟然把阿里云的企业邮箱的坑修复了,终于不再提示stmp connect error了

  10. bowen

    我试了一下,同样是http://www.bowen-blog.com/index.php/action/comment-to-mail?send=xxxxx访问这个网址,邮件能正常发出去,但是评论时就发不了。看了日志,发现能正常触发(因为我在socket函数里打印出一些东西来,说明是执行了这个函数的)。就不知道为什么发不了邮件

    1. Uniartisan
      @bowen

      https://blog.zhiyuanyun.cc/archives/CommentToMail.html
      你可以看看这个!

      1. bowen
        @Uniartisan

        其实我之前自己搞成功了,改成同步触发就行。

    2. 王忘杰
      @bowen

      只能解释环境问题,不能异步触发

      1. bowen
        @王忘杰

        不能异步触发是啥意思呢?有没有其他解决方法?

        1. 王忘杰
          @bowen

          使用原版程序,原版主题,能够发送即为正常。
          直接访问这个链接或者后台测试,是同步触发,评论后发送邮件是异步触发,邮件和评论不是用一时间完成的

          1. bowen
            @王忘杰

            楼主你的空间和域名是在哪里买的?

            1. 王忘杰
              @bowen

              https://9sb.org/38 域名是爱名网收的短域名

              1. bowen
                @王忘杰

                那主机呢?自己搭的?

                1. 王忘杰
                  @bowen

                  看本博客的其他文章

  11. yufan

    插件一用cdn就不行,大佬知道是什么原因吗

  12. ZxSco

    邮件发送失败:SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
    博主这个问题怎么解决?

    1. ZxSco
      @ZxSco

      = = 是服务商禁用了fsockopen()函数

  13. fate

    谢谢分享 2017年8月2日16:28:01 测试可用 ^_^

  14. shunzi

    你好,我用的是企鹅的企业 邮箱,启用了SSL,测试邮件可以发送,评论后不自动发邮件。我去看了下日志,显示如需哦啊:2017-07-31 17:44:14 开始发送请求:https://zhengshun.wang/action/comment-to-mail?send=Q3bqNUK
    SOCKET错误,0: 但是我手动在地址栏访问这段url就可以发送邮件,不知道哪出问题了,望抽时间回复一下!谢谢

    1. 清雨
      @shunzi

      这个问题是因为在服务器本地无法用这个域名直接访问你的博客(域名绑定设置有问题),而你手动在远程访问这个UEL链接当然就能触发邮件发送了。

      1. shunzi
        @清雨

        问题原因是,网站启用了https ,服务器直接curl 调用https会报错。改成http就好使了。这个问题不知道怎么解决,网址又不想去掉https。。。

        1. 清雨
          @shunzi

          SSL证书绑定正确了?如果是HTTPS站点需要在CommentToMail 开启 SSL加密。

          1. shunzi
            @清雨

            已经开启ssl了,最终问题是我网站ssl证书弄错了,导致curl识别报错。nginx版的我给写成apache的了。晕死

    2. 王忘杰
      @shunzi

      环境问题,无法解决

      1. shunzi
        @王忘杰

        会不会 SSL的问题?我自己的VPS,环境问题我可以自己调,麻烦帮看一下!

        1. 王忘杰
          @shunzi

          测试邮件可以发送后,邮箱和程序就不存在问题了。这是异步触发的问题,这个问题解决不了

  15. 保罗

    为啥我这里提示“对不起,插件目录不可写,无法正常使用此功能”,我给插件目录设置的是755权限(我用的是 ispconfig 面板)

    1. 靳闯博客
      @保罗

      好使,装完稍微调试了下ok了,

    2. 靳闯博客
      @保罗

      没有权限写,你要确认下你上传的插件目录 属主和属组 的权限是否正确,再者就是目录的权限,要递归下权限

      1. 保罗
        @靳闯博客

        给777都不行好不

        1. 靳闯博客
          @保罗

          我的刚放进去启用也提示插件目录不可写,我只改了文件夹的属主和属组就完事了,就没改读写权限

          1. Black
            @靳闯博客

            请问你是怎么改的?请具体点,我是新手,万分感谢

          2. 保罗
            @靳闯博客

            用户和组全都是面板默认的了,不可能是没权限啊,已经 chown -R 和 chgrp -R 一遍了

    3. 王忘杰
      @保罗

      程序不会判断失误,没有权限就是没有权限

  16. 姬长信

    成功一次然后就不行了,腾讯企业邮箱SMTP Error: data not accepted.SMTP server error: DATA END command failed Detail: Connection frequency limited

    SMTP code: 550

    1. 王忘杰
      @姬长信

      官方 http://service.mail.qq.com/cgi-bin/help?subtype=1&id=20022&no=1000722

  17. 欧尼酱

    发送失败阿。。
    2017-07-10 18:59:46 开始发送请求:http://www.nothamor.cn/index.php/action/comment-to-mail?send=JJ0QCN8
    Socket 方式发送
    请求结束

    1. 王忘杰
      @欧尼酱

      参考环境bug 以及使用cdn的情况

      1. 欧尼酱
        @王忘杰

        emmm,已经参考了环境BUG,都没有问题,至于CDN,我用了百度云,应该是不会有什么影响的吧,到socket方式发送这里就请求结束了是正常就是这样还是socket错误的原因?是kangle的环境

        1. 王忘杰
          @欧尼酱

          我用宝塔而你用kangle,那就可以认为是kangle有问题;我没有cdn而你又,那就可以认为CDN有问题,这就叫环境bug。不是都没有问题,而且都可能有问题

          1. uniartisna
            @王忘杰

            请问如何解决呢?手动访问也是可以的……ssl我用的是宝塔一件申请的,PHP7.1……

          2. uniartisna
            @王忘杰

            我也是宝塔,PHP7.1,但是还是有问题,您能远程看一下吗?
            QQ 1297867985 李小虾

            1. 王忘杰
              @uniartisna

              不能

  18. 熊二哈

    后台测试发送邮件没问题,回复就不能发送。
    日志提示SOCKET错误,网站使用了魔门云SSL,亲测不开启ssl回复就能发送成功

    1. 王忘杰
      @熊二哈

      用CDN ssl的情况没有考虑过,但是用httpCDN如果发不出去可以考虑在VPS上绑定域名hosts 域名/ip

      1. 熊二哈
        @王忘杰

        ok,晚上看看

  19. 青珏Raingo

    感谢已发信成功

  20. 年糕团子猫

    邮件发送失败:SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
    怎么破

    1. 年糕团子猫
      @年糕团子猫

      解决了

      1. ZxSco
        @年糕团子猫

        邮件发送失败:SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

        这个问题

  21. 漏网小鱼

    sendmail无法发送嘛,提示Could not execute: /usr/sbin/sendmail -t -i

    1. 王忘杰
      @漏网小鱼

      这很正常啊,sendmail是个运行在linux上邮件程序,你需要自己装

      1. 漏网小鱼
        @王忘杰

        sendmail应该装的,探针里测试能发信的。用的oneinstock一键包

        1. 王忘杰
          @漏网小鱼

          本文仅解决smtp发信相关问题,其他问题请自行搜索解决

  22. 采觅博主

    测试能发送,评论不能发送,日志:“开始发送请求:https://www.*.*/action/comment-to-mail?send=***
    Socket 方式发送
    请求结束”
    用的是oneinstack环境配置包,我的天typecho发送邮件为什么比wordpress难...

    1. 后宫学长
      @采觅博主

      我也是这个BUG,真是受够了...

      我是Nginx+Apache,难道是这个原因?

    2. 王忘杰
      @采觅博主

      参考“环境bug" 这实际上是环境的问题 而且这个插件是异步加载,对于评论没有等待时间

  23. 菜菜子

    为毛我测试的时候可以收到消息,但是实际到文章评论的时候就不能用了,有点蛋疼啊,用的163的域名邮箱服务

    1. 王忘杰
      @菜菜子

      参考环境bug2 插件开启日志记录,在log能看到日志,如果提示sock错误,那是php组件的问题,换个版本编译试试

Leave a Comment