CommentToMail更新1.2.2版,改用异步方式发送邮件

费了半天劲终于把CommentToMail的邮件发送方式改为异步,不用在前台等待邮件发送完毕才结束评论。PHP的异步很麻烦,google了不少时间才找到解决的办法,就是fsockopen()加自写header模仿post把发邮件的任务提交到另外一个页面。参考《PHP异步工作,提升用户体验》。

跨页面参数本来选取session传递,在本地测试没问题,但是一上服务器就出问题,后来就改为临时文件保存,发送成功后删除,作为小博客来讲应该没有多大影响。

插件下载:http://dl.dbank.com/c02z6im55x#

异步函数

    public static function SendMail($filename,$siteUrl) {

        $dmpt=parse_url($siteUrl);

        $host = $dmpt['host'];

        $url=substr($dmpt['path'], 0,-1).__TYPECHO_PLUGIN_DIR__."/CommentToMail/send_mail.php";

        file_put_contents('./usr/url.txt', $host.$url);

        $post="filename=".$filename;

        $header = "POST $url HTTP/1.0\r\n";

        $header .= "Host: ".$host."\r\n";

        $header .= "Referer: http://".$siteUrl."\r\n";

        $header .= "Content-Type: application/x-www-form-urlencoded\r\n";

        $header .= "Content-Length: " . strlen($post) . "\r\n\r\n";        

        if(ini_get('allow_url_fopen')){            

            if($fp = @fsockopen ($host, 80, $errno, $errstr, 30)){                

                fputs ($fp, $header.$post);                

                fclose($fp);               

            }else{

                 file_put_contents('./usr/mail_log.txt', "fsockopen错误");

            }

        }else{

            file_put_contents('./usr/mail_log.txt', "'allow_url_fopen'未开启\n");

        }

    }

 

Published by 阿飞 on
Tags: php, typecho, 插件, 邮件, 异步

13 条评论

  1. 沙发,已经更新了。

  2. 换上了,开始没注意更新的内容。。
    异步的确实好一些。。

  3. 灰哥 灰哥

    我换回 1.2.1 也不能发送邮件 该怎么解决

    1. 你自己测试的时候要换个邮箱评论,否则自己给自己评论是不发邮件的。
      再则要求fsockopen()支持,也许你的主机禁用了“allow_url_fopen”。

      1. 灰哥 灰哥

        怎么测试我的空间支不支持上面这些功能

      2. 灰哥 灰哥

        cache 目录下有文本 好像是没发出去的邮件

        1. 你看下你的/usr/mail_log.txt文件里面的内容

  4. 一瞬间,一个测试的评论就不见了。

    1. 在改邮件的样式,回了你就能看到了。

      1. 难得啊,你也准备弄弄主题了?

        1. 不会做主题,就是瞎改改,原来的邮件格式太原始了,看久了影响心情。

  5. 漫慢弄,洗洗睡了。呵呵