修复Typecho评论邮件通知插件在https下无法发送邮件的BUG

早在刚入驻Typecho的时候,什么地方都满意,唯一让我不爽的就是CommentToMail这个插件了,因为这个让我捣鼓了好长时间,当时PHP并不是那么在行,甚至我是排斥二次开发别人的插件的....

如今在几次开发几个呕心沥血的项目后,对PHP又有了另一个新的认知,同时我也收获了不少,现在有能力了,在一个无聊的夜晚...

进入正题

首先看原二次开发者的帖子:https://9sb.org/58

帖子里提到:

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

插件提供了这三种请求方式发送邮件
我的测试流程:
1 .关闭SSL 在Typecho后台把站点域名修改成http,并把Typecho的常量 TYPECHO_SECURE 改为false(关闭https)
测试结果:发送没毛病,回复和被回复均可收到通知邮件

2 .开启SSL 后台测试发送邮件没毛病,但是评论回复帖子的时候,就问题来了,日志记录为:SOCKET错误,0
根据以上错误定位到了文件 Plugin.php,如下图:
img

然后在上面的if判断里打桩,发现错误发生在第一个if里
img

fsockopen 在请求中发生错误,并且返回的错误信息是0...我始终没明白是怎么回事(可能是我服务器环境的问题吧),
这个不是重点,因为我正在疑惑作者为什么不使用Curl的时候,发现了下面有封装好的Curl函数:
img

再看请求的函数里:
img
图中可以看到 发送邮件优先使用Socket请求,也就是说,如果Socket请求失败了,并没有继续往下使用Curl函数请求(至于为什么失败还有待研究)。

于是我在这里:
img

因为curl对于https协议还需要经过证书检查,于是:
img

完工!测试一切正常。
现在的邮件发送流程就是
依次按顺序判断fsockopen,pfsockopen,stream_socket_client是否支持,如果这三种方式都请求失败则使用curl的方式请求。

下载地址:CommentToMail

7 条评论

  1. Uniartisan

    嘿嘿,我也自己修改了另一个分支的邮件插件!
    可以戳这里!https://blog.zhiyuanyun.cc/archives/CommentToMail.html
    基于3.0版本,完全使用网址监控,避免有的主机不支持curl或者https配置出现错误qwq
    另外,博主和我使用的是一样的主题呢!

    1. Wisp X
      @Uniartisan

      博客不错哦!

    2. Wisp X
      @Uniartisan

      厉害啦!支持一下!

      1. Uniartisan
        @Wisp X

        谢谢!你邮件通知的模板很不错!能不能分享一下呢

        1. Wisp X
          @Uniartisan

          没问题,下午邮箱发给你

  2. Devoted

    还是测试能收到评论,回复收不到评论提醒

    1. WispX
      @Devoted

      贴一下日志看看

Leave a Comment