WordPress集成SendCloud邮件代发,规避SMTP泄漏网站主机真实IP的风险 | 张戈博客

  • 时间:
  • 浏览:14
  • 来源:小高技术网_提供QQ资源网技术_QQ技术网资讯

还是几只月前,中国博客联盟的晓风依然博主QQ联系我,说发现WordPress评论回复邮件占据 一有一一二个巨大的风险:WordPress评论回复邮件,不管是使用SMTP代发还是用Sendmail发送,总要暴露网站主机的真实IP!

经过我亲自验证,发现的确占据 例如 令人担忧的什么的问题!随后,一时之间并都没法最少的正确处理方案,什么都有我和他都一致认为在都没法找到替代方案以前,例如 东西可不都还能否曝光!就算有每段人由于 知道了,但还是可不都还能否明晃晃的摆到台面上来宣告于众!

接下来的几只月,张戈老是在新公司持续高传输强度的工作,根本都没法闲暇时间来研究替代方案!可惜我可不都还能否 担忧的事情最终还是占据 了:幻杀博客的博主小幻在博客宣告了例如 会泄漏IP的“BUG”,却都没法分享正确处理方案!我除了感叹出身牛犊不怕虎之外,就说 能无奈加紧步伐,尽快找到替代方案。

一、如保泄漏

看一遍幻杀博客的文章的大伙儿应该由于 知道是如保会一回事了。就说 当大伙儿的网站通过SMTP代发由于 php调用SendMail来发邮件通知评论者时,大伙儿发送过去的邮件原文中将含有大伙儿主机的真实IP!!由于 被人恶意利用,大伙儿的CDN防护都将变得毫无意义(点此查看被委托人网站暴漏真实IP的危害)!

最新补充:大伙儿说,在乌云上早全是大伙儿发过例如 漏洞了,感兴趣的童鞋可不都还能否前往看看:《某法律法律法律依据可不都还能否无视CDN查找真实IP由于 真实站点遭受DDOS或入侵》

二、正确处理方案

①、自建API

既然可不都还能否使用SMTP代发,又可不都还能否使用 SendMail,那就只一有一一二个法律法律法律依据了:用第三方API代发邮件即可,就算暴露IP也是暴露了邮件服务器的IP,和大伙儿的小站都没法任何关系。

那我 我是想在 SAE 搭建一有一一二个邮件代发API,随后想到了中国博客联盟都没法多的邮件模板,而被委托人空闲时间人太好不要 ,只好先放弃了。

A. 小幻版本

小幻被我吐槽以前,说去研究下自建邮件API服务,目前已在他博客分享了一有一一二个自建的邮件代发API,感兴趣的大伙儿可不都还能否前往查看:《使用邮件代发API发送回复邮件提醒》

不得不说这家伙人太好是一有一一二个很赞的高中技术宅(再次汗颜下被委托人高中时还只会玩QQ)。

B. SAE版本

小武例如 技术宅,为了正确处理评论显示代发,由于 变成垃圾邮件什么的问题,在SAE搭建了一有一一二个邮件API,随后是专门给WordPress 评论回复用的,感兴趣的大伙儿可不都还能否去了解一下:《通过新浪SAE发送wordpress评论提醒邮件》

②、SendCloud

写到这,本文主角终于姗姗来迟。

SendCloud由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的API接口来调用服务,让邮件准确好快到达用户收件箱并获得强大的追踪数据[1] 。主要提供例如 类型的邮件发送服务,一类是事务性邮件,一类是商务性邮件。 ——摘自百度百科

SendCloud我目前的公司也在使用,随后我也曾写过关于SendCloud的堵塞监控脚本:SendCloud邮件队列情况和已使用额度的Python监控脚本

感兴趣的可不都还能否前往一探究竟。这玩意如保牛逼,如保高大上让你 不说了。简单的说就说 一有一一二个邮件代发服务,比后边介绍的自建API更加完善,当然使用也更加比较复杂,希望看一遍本文的大伙儿可不都还能否成功集成到WordPress当中。

三、动手集成

①、注册帐号

如保注册就不赘述了,官网地址:http://sendcloud.sohu.com/

②、域名设置

邮件设置==>域名==>新增发信域名

完成后,进入域名设置,按照提示到你的DNS解析控制台新增可不都还能否 的几只记录:

下面还一有一一二个收信配置,也是一有一一二个必配项:

Ps:不过这里一有一一二个技巧,上图可不都还能否很明显的看一遍,我现有的记录值是一有一一二个,一有一一二个sendcloud,一有一一二个是QQ的域名邮箱。由于 ,我全是很想用Sendloud的转发功能,就说 想继续用以前就配好的QQ域名邮箱。这里该如保实现呢?很简单,在DNS解析那新建一有一一二个MX记录,随后将QQ域名的MX优先级设置更小即可!

下面是张戈博客的相关DNS设置,不需要的可不都还能否参考下:

设置好了以前,可不都还能否点击右上角的【检测配置】来探测与否生效。例如 生效时间长短不一,咱们先继续做后边的设置。

最新补充:人太好由于 你的网站要用一点域名邮箱或企业邮箱,都没法倘若在Sencloud域名验证后将MX记录改为相应的域名邮箱或企业邮箱记录即可!比如张戈博客要用QQ的域名邮箱,都没法就将上图中的sendcloud的MX记录删除,只保留QQ邮箱的MX记录就好了。不须影响 sendcloud 发信,由于 例如 MX记录就说 用于收信,而最爽的是QQ邮箱那边依然可不都还能否用域名邮箱发信!

③、获取api_user和api_key

登录后,就会获得帐号专属的API_KEY,当然由于 你忘记了就说 能使用会员首页的重置功能。

接着点击后边的【邮件设置】==>【Api_user】,来创建新的API_KEY备用:

④、邮件样本

Sendloud 为了正确处理其他同学恶意发送垃圾邮件,就推出了例如 审核机制,所有邮件代发都可不都还能否 先通过样本校验。貌似是要达到500%以上的匹配率才会让你 发出去,随后就返回不匹配错误。

官方给出的注意事项:

注意事项:

1、为正确处理不良信息传播,用户在发送邮件前,需提交样本审核,真实发送的邮件内容会和样本进行匹配。

2、邮件样本可不都还能与否具体的某一封邮件,就说 能是含有变量的邮件模板。

3、审核时间:工作日(周一至周五9:00-18:00)一小时以内审核;非工作日上午和下午定时审核一次。

这与否整个流程中比较麻烦的一步,不过大伙儿删剪不需要担心,由于 张戈都由于 写好了模板:

Ps:和下面的邮件模板代码一样,就不重复粘贴了!

点击【发送相关】==>【邮件样本】==>【创建样本】==>参考下图填写好后边栏位==>切换到【源码模式】==>粘贴后边的代码==>提交审核即可

当然, 大伙儿可不都还能否根据需求提交多个模板,不过一般WP就评论回复通知用的最多,一点被委托人研究吧!

⑤、邮件模板

看一遍这,估计大伙儿要骂娘了。。。刚弄了一有一一二个邮件样本,又要弄邮件模板!当然,大伙儿是可不都还能否直接post整个邮件内容到Sendloud,随后并全是强迫症所向往的,大伙儿追求的是极致,由于 使用模板发送倘若post模板中的几只变量即可。

废话不说,点击【发送相关】==>【邮件模板】===>【创建模板】

和后边的邮件样本一样,将以下代码粘放进去源码模式保存即可:

<style type="text/css">blockquote{
width: 94%;
color: #8b8b8b;
margin: 0 auto;
padding: 10px;
clear: both;
border: 1px solid #ebebeb;
}
</style>
<table cellpadding="0" cellspacing="0" >
 <tbody>
 <tr>
 <td ><strong>  您在%blogname%的留言有了新的回复:</strong></td>
 </tr>
 <tr>
 <td ><span >%comment_author1%</span>, 您好!
 <p>您曾在<span >《%conent_title%》</span>的留言:</p>
                <blockquote>
 <p>%comment_content1%</p>
 </blockquote>
                <p><span >%comment_author2%</span> 让你

的回复:</p>
                <blockquote>
 <p>%comment_content2%</p>
 </blockquote>
 <p >您可不都还能否点此 <a href="%comment_link%">查看一遍整回复內容</a></p>
 <p >欢迎您再度光临 <a href="%home_url%" target="_blank" title="%description%">%blogname%</a>!</p>
 </td>
 </tr>
 <tr>
 <td >请注意:此邮件由 <a href="%home_url%" target="_blank" title="%description%">%blogname%</a> 自动发送,请勿直接回复。<br />由于

此邮件全是您请求的,请忽略并删除!</td>
          </tr>
 </tbody>
</table>
<p><a href="%%user_defined_unsubscribe_link%%" >让你

再收到此类邮件</a></p>

调用名称推荐使用字母:

这里就不需要审核了,随后注意例如 模板在邮件样本中可不都还能否 占据 匹配的样本,随后无法发出去。

⑥、PHP函数

唉,张戈折腾一上午,分享出来几分钟!代码如下:

/**
** WordPress集成Sendloud邮件代发函数
** 原创地址:https://zhang.ge/50045.html
** Ps:转载不保留出处 and 篡改版权的都木有小JJ。
**/
function SendCloud_mail($from,$fromname,$to,$subject,$message,$template) {
    $api_user = "这里填写sendcloud的app_user"; //注意保留英文双引号!
    $api_key = "这里填写Sendloud的api_key";
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
    curl_setopt($ch, CURLOPT_URL, 'http://sendcloud.sohu.com/webapi/mail.send_template.json');
    $substitution_vars  = json_encode(array('to' => array($to),'sub' => $message));
    $data = array(
        'api_user' => $api_user,
        'api_key' => $api_key,
        'from' => $from,
        'fromname' => $fromname,
        'template_invoke_name'=> $template,
        'subject' => $subject,
        'substitution_vars'=> $substitution_vars
        );
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    $result = curl_exec($ch);
    if($result === false) {
        echo curl_error($ch);
    }
    curl_close($ch);
    return $result;
}
//下面是修改版的WordPress发邮件代码(支持嵌套评论邮件)
//适用于Sendloud,大伙儿看张戈多厚道,任何以前都保留出处,不像一点小人!

/* 邮件通知 by Qiqiboy */
function comment_SendCloudMail_notify($comment_id) {
     $comment = get_comment($comment_id);//根据id获取这条评论相关数据
     $comment_approved=$comment->comment_approved;
     if ($comment_approved != 1) { return; }  
     $content=$comment->comment_content;
     //对评论内容进行匹配
     $match_count=preg_match_all('/<a href="#comment-([0-9]+)?" rel="nofollow">/si',$content,$matchs);
     if($match_count>0){ //由于

匹配到了
         foreach($matchs[1] as $parent_id){//对每个子匹配都进行邮件发送操作
             SimPaled_send_email($parent_id,$comment);
         }
     } elseif ($comment->comment_parent!='0'){//以防万一,其他同学故意删了@回复,还可不都还能否通过查找父级评论id来选用邮件发送对象
         $parent_id=$comment->comment_parent;
         SimPaled_send_email($parent_id,$comment);
     } else return;
 }
add_action('comment_post', 'comment_SendCloudMail_notify');

function SimPaled_send_email($parent_id,$comment){//发送邮件的函数 by Qiqiboy.com
     $admin_email = get_bloginfo ('admin_email');//管理员邮箱
     $parent_comment=get_comment($parent_id);//获取被回复人(或叫父级评论)相关信息
     $author_email=$comment->comment_author_email;//评论人邮箱
     $to = trim($parent_comment->comment_author_email);//被回复人邮箱
     $spam_confirmed = $comment->comment_approved;
     if ($spam_confirmed != 'spam' && $to != $admin_email && $to != $author_email) {
         $wp_email = '[email protected]' . preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME'])); // e-mail 發出點, no-reply 可改為可用的 e-mail.
         $subject = '您在 [' . get_option("blogname") . '] 的留言有了新的回复!';
         $fromname = get_option('blogname');
         $message = array(
                "%conent_title%"=>array(get_the_title($comment->comment_post_ID)),
                "%comment_content1%"=>array(trim(get_comment($parent_id)->comment_content)),
                "%comment_content2%"=>array(trim($comment->comment_content)),
                "%comment_author1%"=>array(trim(get_comment($parent_id)->comment_author)),
                "%comment_author2%"=>array(trim($comment->comment_author)),
                "%comment_link%"=>array(htmlspecialchars(get_comment_link($parent_id,array("type" => "all")))),
                "%blogname%"=>array(get_option('blogname')),
                "%description%"=>array(get_bloginfo('description')),
                "%home_url%"=>array(get_option('home'))
                );
        if( $to != '' && is_email($to)){
           SendCloud_mail( $wp_email, $fromname, $to, $subject, $message, '此处请修改为模板调用名称');
        }
     }
 }

将以上代码添加到主题目录的functions.php当中即可,放哪个位置让你 不再阐述了,这都搞不清估计也玩不转例如 折腾活了。

⑦、系统邮件(可选)

哪此叫系统邮件?就说 其他同学在你博客留言了,由于 有评论可不都还能否 审核,WordPress是可不都还能否设置邮件提醒的,这可不都还能否不能 用到wp_mail函数。随后我懒得将例如 功能也用Sendloud来代发,一是麻烦,二是发给管理员的,泄漏IP又如保?

什么都有,以前由于 由于 弄过SMTP,可不都还能否保留如下代码,让系统继续使用SMTP发邮件给管理员:

//使用smtp发送邮件,代码中使用的是QQ邮箱,让你

参照你使用的邮箱具体设置SMTP   
add_action('phpmailer_init', 'mail_smtp');   
function mail_smtp( $phpmailer ) {   
    $phpmailer->FromName = 'XX博客'; //发件人   
    $phpmailer->Host = 'smtp.qq.com'; //修改为你使用的SMTP服务器   
    $phpmailer->Port = 25; //SMTP端口   
    $phpmailer->Username = '[email protected]'; //邮箱账户      
    $phpmailer->Password = 'password'; //邮箱密码   
    $phpmailer->From = '[email protected]'; //你的邮箱      
    $phpmailer->SMTPAuth = true;      
    $phpmailer->SMTPSecure = ''; //tls or ssl (port=25留空,465为ssl)   
    $phpmailer->IsSMTP();   
}

随后由于 以前由于 添加过评论回复邮件通知代码的的,请注意注释掉,随后以前的代码由于 总要继续工作,泄漏IP,一般在functions.php后边添加如下代码即可:

//移除原有的邮件通知动作钩子(一般全是用的comment_mail_notify例如

函数,被委托人注意辨别)
remove_action('comment_post', 'comment_mail_notify');

四、效果预览

目前张戈由于 使用了一有一一二个月了,非常稳定。免费用户每天可不都还能否发送500封邮件,这由于 足够应付绝大每段被委托人博客了!

Ps:如图,最看不起哪此乱填邮件的人!要么就灌水,要么就说 找茬的。随后老是对SendCloud请求一点无效邮件,由于 降低帐号的信誉度,影响以前的发送成功率。

什么都其他同学看一遍本文肯定会望而却步,由于 人太好弄起来比较比较复杂,也比较麻烦!随后,张戈作为吃螃蟹的都由于 分享出来了,你还嫌麻烦?

这篇文章又花了我一有有一一二个小时!未经允许,谢绝转载,谢谢相互媒体合作!