wordpress中,阿里云服务器实现自动邮件回复评论

转载自:http://www.xgezhang.com/wp_aliyun_host_sendmail.html

最近想给网站搞一个自动回复邮件评论的功能,最初的时候以为wordpress回自动默认集成,但后面才发现并没有,但却提供了一些类似于wp-mail的函数可以供管理者调用。

    于是便去网上搜索,很容易的找到如下一段代码,非常经典,很多wp网站都在使用:

/* 开始*/
function comment_mail_notify($comment_id) {
  $admin_notify = '1'; // admin 要不要收回复通知 ( '1'=要 ; '0'=不要 )
  $admin_email = get_bloginfo ('admin_email'); // $admin_email 可改为你指定的 e-mail.
  $comment = get_comment($comment_id);
  $comment_author_email = trim($comment->comment_author_email);
  $parent_id = $comment->comment_parent ? $comment->comment_parent : '';
  global $wpdb;
  if ($wpdb->query("Describe {$wpdb->comments} comment_mail_notify") == '')
    $wpdb->query("ALTER TABLE {$wpdb->comments} ADD COLUMN comment_mail_notify TINYINT NOT NULL DEFAULT 0;");
  if (($comment_author_email != $admin_email && isset($_POST['comment_mail_notify'])) || ($comment_author_email == $admin_email && $admin_notify == '1'))
    $wpdb->query("UPDATE {$wpdb->comments} SET comment_mail_notify='1' WHERE comment_ID='$comment_id'");
  $notify = $parent_id ? get_comment($parent_id)->comment_mail_notify : '0';
  $spam_confirmed = $comment->comment_approved;
  if ($parent_id != '' && $spam_confirmed != 'spam' && $notify == '1') {
    $wp_email = 'no-reply@' . preg_replace('#^www.#', '', strtolower($_SERVER['SERVER_NAME'])); // e-mail 发出点, no-reply 可改为可用的 e-mail.
    $to = trim(get_comment($parent_id)->comment_author_email);
    $subject = '您在 [' . get_option("blogname") . '] 的留言有了回复';
    $message = '
    <div style="background-color:#eef2fa; border:1px solid #d8e3e8; color:#111; padding:0 15px; -moz-border-radius:5px; -webkit-border-radius:5px; -khtml-border-radius:5px;">
      <p>' . trim(get_comment($parent_id)->comment_author) . ', 您好!</p>
      <p>您曾在《' . get_the_title($comment->comment_post_ID) . '》的留言:<br />'
       . trim(get_comment($parent_id)->comment_content) . '</p>
      <p>' . trim($comment->comment_author) . ' 给您的回复:<br />'
       . trim($comment->comment_content) . '<br /></p>
      <p>您可以点击查看回复的完整內容</p>
      <p>还要再度光临 ' . get_option('blogname') . '</p>
      <p>(此邮件由系统自动发送,请勿回复.)</p>
    </div>';
         $from = "From: \"" . get_option('blogname') . "\" <$wp_email>";
         $headers = "$from\nContent-Type: text/html; charset=" . get_option('blog_charset') . "\n";
         wp_mail( $to, $subject, $message, $headers );
  }
}
add_action('comment_post', 'comment_mail_notify');
  
/* 自动加勾选栏 */
function add_checkbox() {
  echo '<input type="checkbox" name="comment_mail_notify" id="comment_mail_notify" value="comment_mail_notify" checked="checked" style="margin-left:20px;" /><label for="comment_mail_notify">有人回复时邮件通知我</label>';
}
add_action('comment_form', 'add_checkbox');


    更改完里面的一些配置参数之后,本来以为能够开始使用了,结果发现事情没有想象的那么简单,测试了很多次都没法收到邮件。

    又检查了很多遍看是不是代码出现了问题,发现也不是,无奈之下只能求助与插件,尝试了好多款插件比如wp SMTP等,在发送测试邮件的时候都会出现类似于”无法访问SMTP服务器“等错误信息,这个问题也就暂时搁浅了。

    直到几天之后我猛然反应过来,会不会是服务器主机提供商本身的问题,在网上查阅了相关资料之后,确实是不同的主机上提供SMTP服务的渠道不一样,有的需要打开某些接口才能使用。由于我使用的是阿里云x3型服务器,想实现SMTP服务器必须调用它内置的一些函数。于是我开始求助于万能的阿里云人工服务(不得不赞一下,工单回复神速,而且一针见血,已经帮助我解决好多问题了)经过一番交流之后,客服回复了我这么一段话:

    链接如下:http://www.net.cn/service/faq/xuni/zujian/200811/3572.html?spm=0.0.0.0.TRX6rw

    于是我按照它所说的在控制面板上打开了fsockopen,参照链接里给的函数,进行简单修改后放到了网站服务器中,结果竟然出奇的好用,于是乎问题终于解决了。

    以下是我结合上面的提取文字的代码以及阿里云服务器内部接口代码综合修改之后一段程序,放到网站functions.php里就可以直接使用了:

function send_mail($comment_id) {
//获取评论者邮箱内容等
  $comment = get_comment($comment_id);  //获取评论的编号
  $parent_id = $comment->comment_parent ? $comment->comment_parent : ''; //找到回复的父节点,及原评论者
  $spam_confirmed = $comment->comment_approved;
  if (($parent_id != '') && ($spam_confirmed != 'spam')) {
    $to = trim(get_comment($parent_id)->comment_author_email);
    $subject = '您在 [' . get_option("blogname") . '] 的留言有了回复';
    $message = '
      ' . trim(get_comment($parent_id)->comment_author) . ', 您好!
      您曾在《' . get_the_title($comment->comment_post_ID) . '》的留言:'
       . trim(get_comment($parent_id)->comment_content) . '
      ' . trim($comment->comment_author) . ' 给您的回复:'
      .'
          '
      .'    '.trim($comment->comment_content).      
      '
      您可以点击 '.'http://www.xgezhang.com/?p='.trim($comment->comment_post_ID).' 查看回复完整內容'.
      '
      欢迎再度光临 ' .get_option('blogname') . '  www.xgezhang.com'.'
 
      (此邮件由系统自动发送,请勿回复.)
    ';
   #   $from = "From: \"" . get_option('blogname') . "\" <$wp_email>";
   
//阿里主机服务器函数
        $loc_host = "XXX";            //发信计算机名,可随意
        $smtp_acc = "xxx@xxx.com"; //Smtp认证的用户名,类似fuweng@im286.com,或者fuweng
        $smtp_pass="填写邮箱的的密码";          //Smtp认证的密码,一般等同pop3密码
        $smtp_host="填写smtp的地址";    //SMTP服务器地址,类似 smtp.tom.com
        $from="填写你的邮箱地址";       //发信人Email地址,你的发信信箱地址
        $headers = "Content-Type: text/plain; charset=\"utf-8\"\r\nContent-Transfer-Encoding: base64";
    $lb="\r\n";                    //linebreak
            
        $hdr = explode($lb,$headers);     //解析后的hdr
        if($message) {$bdy = preg_replace("/^\./","..",explode($lb,$message));}//解析后的message
 
        $smtp = array(
                //1、EHLO,期待返回220或者250
                array("EHLO ".$loc_host.$lb,"220,250","HELO error: "),
                //2、发送Auth Login,期待返回334
                array("AUTH LOGIN".$lb,"334","AUTH error:"),
                //3、发送经过Base64编码的用户名,期待返回334
                array(base64_encode($smtp_acc).$lb,"334","AUTHENTIFICATION error : "),
                //4、发送经过Base64编码的密码,期待返回235
                array(base64_encode($smtp_pass).$lb,"235","AUTHENTIFICATION error : "));
            //5、发送Mail From,期待返回250
            $smtp[] = array("MAIL FROM: <".$from.">".$lb,"250","MAIL FROM error: ");
         //6、发送Rcpt To。期待返回250
         $smtp[] = array("RCPT TO: <".$to.">".$lb,"250","RCPT TO error: ");
         //7、发送DATA,期待返回354
         $smtp[] = array("DATA".$lb,"354","DATA error: ");
         //8.0、发送From
         $smtp[] = array("From: ".$from.$lb,"","");
         //8.2、发送To
         $smtp[] = array("To: ".$to.$lb,"","");
             //8.1、发送标题
         $smtp[] = array("Subject: ".$subject.$lb,"","");
         //8.3、发送其他Header内容
        foreach($hdr as $h) {$smtp[] = array($h.$lb,"","");}
        //8.4、发送一个空行,结束Header发送
        $smtp[] = array($lb,"","");
        //8.5、发送信件主体
        if($bdy) {foreach($bdy as $b) {$smtp[] = array(base64_encode($b.$lb).$lb,"","");}}
        //9、发送“.”表示信件结束,期待返回250
        $smtp[] = array(".".$lb,"250","DATA(end)error: ");
        //10、发送Quit,退出,期待返回221
        $smtp[] = array("QUIT".$lb,"221","QUIT error: ");
 
        //打开smtp服务器端口
        $fp = @fsockopen($smtp_host, 25);
        if (!$fp) echo "Error: Cannot conect to ".$smtp_host."
";
        while($result = @fgets($fp, 1024)){if(substr($result,3,1) == " ") { break; }}
        
        $result_str="";
        //发送smtp数组中的命令/数据
        foreach($smtp as $req){
                //发送信息
                @fputs($fp, $req[0]);
                //如果需要接收服务器返回信息,则
                if($req[1]){
                        //接收信息
                        while($result = @fgets($fp, 1024)){
                                if(substr($result,3,1) == " ") { break; }
                        };
                        if (!strstr($req[1],substr($result,0,3))){
                                $result_str.=$req[2].$result."
";
                        }
                }
        }
        //关闭连接
        @fclose($fp);
        return $result_str;
  }
}
add_action('comment_post', 'send_mail');

   

最后效果如图:

 

     欢迎转载,请注明出处

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值