WordPress 添加邮件回复自动提醒功能

2019-06-1613:38:05 11 395 人看过

对于玩博客的人来说,交流互动是一件特别简单的事情。你可以不注册任何账号,可以互相不认识对方,可以不加 QQ、微信。就凭借一个邮箱账号,就可以毫无束缚的在博客评论区里畅所欲言。它又可以像其他互联网应用一样,给自己取一个好听的名字,上传一个个性化的头像(Gravatar 头像),做整条街最靓的仔。所以邮箱在博客圈子里的地位,其实是比手机、微信更加重要的存在。

WordPress 添加邮件回复自动提醒功能

这和邮件自动回复提醒功能的广泛应用有很大的关系,可以应用评论审核通过提醒、评论回复提醒、登录失败提醒、账户资料修改提醒、账户被管理员删除提醒、文章更新提醒等方面。它可以提高读者的活跃度、参与感,也可以让博客管理者获取更多外界的反馈。百利而无一害!

一、准备工作

1、服务器开启 25 或 465 端口

实现邮箱自动提醒功能,需要通过专门的 25 端口或 465 端口,这两个端口都可以发送邮件,区别是 25 端口是普通端口,465 端口是加密端口。正常情况下优先使用 465 端口,理论上会更加安全。如果你使用的是云服务器,是可以自己选择放行相关端口的。如果是虚拟主机,可以咨询自己的服务商,放行相关端口。(据悉,阿里云和腾讯云默认是禁用了 25 端口的。)

2、准备邮箱 SMTP 地址

由于每个人使用的邮箱有所区别,下面提供一些常用的邮箱 SMTP 地址供大家参考。更多邮箱 SMTP 地址可以自行百度。

QQ 邮箱:smtp.qq.com
Foxmail 邮箱:smtp.foxmail.com
网易 163 邮箱:smtp.163.net
新浪免费邮箱:smtp.sina.com
腾讯企业邮箱:smtp.exmail.qq.com
雅虎免费邮箱:smtp.mail.yahoo.cn
网易 126 邮箱:smtp.126.com
搜狐免费邮箱:smtp.sohu.com
Gmail 邮箱:smtp.gmail.com

3、获取邮箱授权码

邮箱授权码可以笼统的理解为“加密的邮箱登录密码”。当然有很多邮箱的授权码就是登录密码,但是 QQ 邮箱和 163 邮箱是个例外,在使用第三方客户端登录时,都需要专门的授权码才可以登录。那么,如何获取邮箱的授权码呢?这里以 QQ 邮箱为例。登录 QQ 邮箱,在设置-账户中开启图示两项服务,然后点击生成授权码。

WordPress 添加邮件回复自动提醒功能

然后按照页面提示,发送短信内容进行验证。就可以得到一串字母和数字组成的授权码。复制出来,后面会用到。
开始之前,先预览一下实现效果:

WordPress 添加邮件回复自动提醒功能

二、具体实施

1、配置 SMTP,添加邮箱提醒功能

准备工作完成后,就可以为 WordPress 配置 SMTP 了。将下面提供的代码复制到主题根目录的 functions.phpwe 文件中。记得将代码中的发件人名称、邮箱账户等修改为自己的,填写前面获取到的 SMTP 服务器地址、SMTP 端口、邮箱授权码等信息。

//邮件自动回复提醒
add_action('phpmailer_init', 'mail_smtp');
function mail_smtp( $phpmailer ) {
$phpmailer->FromName = 'Action'; //发件人名称
$phpmailer->Host = 'smtp.qq.com'; //SMTP 服务器地址
$phpmailer->Port = 465; //SMTP 端口
$phpmailer->Username = '1226831122@qq.com'; //邮箱账户
$phpmailer->Password = '**********'; //邮箱授权码
$phpmailer->From = '1226831122@qq.com'; //邮箱账户
$phpmailer->SMTPAuth = true;
$phpmailer->SMTPSecure = 'ssl'; //tls or ssl (port=25 时->留空,465 时->ssl)
$phpmailer->IsSMTP();
}

2、添加邮箱提醒模板

新建一个名为notify.php的 PHP 文件,复制粘贴下面代码。然后上传到你用主题的根目录下即可。这里提供两个版本的模板代码,一个是只有评论自动回复提醒的精简版本。另一个是涵盖评论审核通过提醒、评论回复提醒、登录失败提醒、账户资料修改提醒、账户被管理员删除提醒、文章更新提醒等功能在内的多功能版本。
两个版本外观样式完全一致,只是功能上的多寡,大家根据自己的需求进行选择即可。

精简版

<?php
// 定义界面顶部区域内容
$email_headertop = '
    <div class="emailpaged">
        <div class="emailcontent" style="width:100%;max-width:720px;text-align:left;margin:0 auto;padding-top:10px;padding-bottom: 10px">
            <div class="emailtitle">
                <h1 style="color:#fff;background:#00cff8;line-height:40px;border-top-left-radius:8px;border-top-right-radius:8px;border-bottom-right-radius:0px;border-bottom-left-radius:0px;font-size:18px;font-weight:4px 4px 4px 4px;padding-left:18px;margin:0">
';
define ('emailheadertop', $email_headertop );

 $email_headerbot = '
                </h1>
                <div class="emailtext" style="background:#f8f8f8;padding:20px 32px 40px;border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-right-radius:8px;border-bottom-left-radius:8px;">
';
define ('emailheaderbot', $email_headerbot );

// 定义界面底部区域内容
$email_footer = '
                <p style="color: #6e6e6e;font-size:13px;line-height:24px;">(此邮件由系统自动发出, 请勿回复。)</p>
                </div>
                <div class="emailad" style="margin-top: 24px;">
                </div>
                <p style="color: #6e6e6e;font-size:13px;line-height:24px;text-align:right;padding:0 32px">邮件来自:<a href="' . get_bloginfo('url') . '" style="color:#51a0e3;text-decoration:none">' . get_option("blogname") . '</a></p>
            </div>
        </div>
    </div>
';
define ('emailfooter', $email_footer );

// 修改网站默认发信人以及邮箱
function new_from_name($email){
    $wp_from_name = get_option('blogname');
    return $wp_from_name;
}
function new_from_email($email) {
    $wp_from_email = get_option('admin_email');
    return $wp_from_email;
}
add_filter('wp_mail_from_name', 'new_from_name');
add_filter('wp_mail_from', 'new_from_email');

// 邮件评论回复美化版
function comment_mail_notify($comment_id) {
    $admin_email = get_bloginfo ('admin_email'); 
    $comment = get_comment($comment_id);
    $comment_author_email = trim($comment->comment_author_email);
    $parent_id = $comment->comment_parent ? $comment->comment_parent : '';
    $to = $parent_id ? trim(get_comment($parent_id)->comment_author_email) : '';
    $spam_confirmed = $comment->comment_approved;
    if (($parent_id != '') && ($spam_confirmed != 'spam') && ($to != $admin_email)) {
    $wp_email = 'no-reply@' . preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME']));
    $subject = '您在 [' . get_option("blogname") . '] 的留言有了新回复';
    $message = emailheadertop.'您在' . get_option("blogname") . '上的留言有回复啦!'.emailheaderbot.'
      <p style="color: #6e6e6e;font-size:14px;line-height:24px;">' . trim(get_comment($parent_id)->comment_author) . ', 您好!</p>
      <p style="color: #6e6e6e;font-size:14px;line-height:24px;">您在《' . get_the_title($comment->comment_post_ID) . '》的留言:<br />
      <p style="color: #333333;font-size:14px;line-height:24px;padding:10px 20px;background:#eeeeee;margin:0px">'. trim(get_comment($parent_id)->comment_content) . '</p>
      <p style="color: #6e6e6e;font-size:14px;line-height:24px;">' . trim($comment->comment_author) . ' 给你的回复:<br />
      <p style="color: #333333;font-size:14px;line-height:24px;padding:10px 20px;background:#eeeeee;margin:0px">'. trim($comment->comment_content) . '</p>
      <p style="color: #6e6e6e;font-size:14px;line-height:24px;">你可以点击<a href="' . htmlspecialchars(get_comment_link($parent_id, array('type' => 'comment'))) . '">查看完整内容</a></p>
      <p style="color: #6e6e6e;font-size:14px;line-height:24px;">欢迎再度光临<a href="' . get_option('home') . '">' . get_option('blogname') . '</a></p>
            '.emailfooter;
    $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');
?>

多功能版

<?php
// 定义界面顶部区域内容
$email_headertop = '
    <div class="emailpaged">
        <div class="emailcontent" style="width:100%;max-width:720px;text-align:left;margin:0 auto;padding-top:10px;padding-bottom: 10px">
            <div class="emailtitle">
                <h1 style="color:#fff;background:#00cff8;line-height:40px;border-top-left-radius:8px;border-top-right-radius:8px;border-bottom-right-radius:0px;border-bottom-left-radius:0px;font-size:18px;font-weight:4px 4px 4px 4px;padding-left:18px;margin:0">
';
define ('emailheadertop', $email_headertop );

 $email_headerbot = '
                </h1>
                <div class="emailtext" style="background:#f8f8f8;padding:20px 32px 40px;border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-right-radius:8px;border-bottom-left-radius:8px;">
';
define ('emailheaderbot', $email_headerbot );

// 定义界面底部区域内容
$email_footer = '
                <p style="color: #6e6e6e;font-size:13px;line-height:24px;">(此邮件由系统自动发出, 请勿回复。)</p>
                </div>
                <div class="emailad" style="margin-top: 24px;">
                </div>
                <p style="color: #6e6e6e;font-size:13px;line-height:24px;text-align:right;padding:0 32px">邮件来自:<a href="' . get_bloginfo('url') . '" style="color:#51a0e3;text-decoration:none">' . get_option("blogname") . '</a></p>
            </div>
        </div>
    </div>
';
define ('emailfooter', $email_footer );

// 修改网站默认发信人以及邮箱
function new_from_name($email){
    $wp_from_name = get_option('blogname');
    return $wp_from_name;
}
function new_from_email($email) {
    $wp_from_email = get_option('admin_email');
    return $wp_from_email;
}
add_filter('wp_mail_from_name', 'new_from_name');
add_filter('wp_mail_from', 'new_from_email');

// 评论通过通知评论者
add_action('comment_unapproved_to_approved', 'iwill_comment_approved');
function iwill_comment_approved($comment) {
  if(is_email($comment->comment_author_email)) {
    $post_link = get_permalink($comment->comment_post_ID);
    // 邮件标题,可自行更改
    $title = '您在 [' . get_option('blogname') . '] 的评论已通过审核';
    // 邮件内容,按需更改
    $body = emailheadertop.'留言审核通过通知'.emailheaderbot.'<p style="color: #6e6e6e;font-size:13px;line-height:24px;">您在' . get_option('blogname') . '《<a href="'.$post_link.'">'.get_the_title($comment->comment_post_ID).'</a>》发表的评论:</p>
            <p style="color: #6e6e6e;font-size:13px;line-height:24px;padding:10px 20px;background:#f8f8f8;margin:0px">'.$comment->comment_content.'</p>
            <p style="color: #6e6e6e;font-size:13px;line-height:24px;">已通过管理员审核并显示。<br />
            您可在此查看您的评论:<a href="'.get_comment_link( $comment->comment_ID ).'">前往查看</a></p>'.emailfooter;

    @wp_mail($comment->comment_author_email, $title, $body, "Content-Type: text/html; charset=UTF-8");        
  }
}

// 邮件评论回复美化版
function comment_mail_notify($comment_id) {
    $admin_email = get_bloginfo ('admin_email'); 
    $comment = get_comment($comment_id);
    $comment_author_email = trim($comment->comment_author_email);
    $parent_id = $comment->comment_parent ? $comment->comment_parent : '';
    $to = $parent_id ? trim(get_comment($parent_id)->comment_author_email) : '';
    $spam_confirmed = $comment->comment_approved;
    if (($parent_id != '') && ($spam_confirmed != 'spam') && ($to != $admin_email)) {
    $wp_email = 'no-reply@' . preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME']));
    $subject = '您在 [' . get_option("blogname") . '] 的留言有了新回复';
    $message = emailheadertop.'您在' . get_option("blogname") . '上的留言有回复啦!'.emailheaderbot.'
      <p style="color: #6e6e6e;font-size:14px;line-height:24px;">' . trim(get_comment($parent_id)->comment_author) . ', 您好!</p>
      <p style="color: #6e6e6e;font-size:14px;line-height:24px;">您在《' . get_the_title($comment->comment_post_ID) . '》的留言:<br />
      <p style="color: #333333;font-size:14px;line-height:24px;padding:10px 20px;background:#eeeeee;margin:0px">'. trim(get_comment($parent_id)->comment_content) . '</p>
      <p style="color: #6e6e6e;font-size:14px;line-height:24px;">' . trim($comment->comment_author) . ' 给你的回复:<br />
      <p style="color: #333333;font-size:14px;line-height:24px;padding:10px 20px;background:#eeeeee;margin:0px">'. trim($comment->comment_content) . '</p>
      <p style="color: #6e6e6e;font-size:14px;line-height:24px;">你可以点击<a href="' . htmlspecialchars(get_comment_link($parent_id, array('type' => 'comment'))) . '">查看完整内容</a></p>
      <p style="color: #6e6e6e;font-size:14px;line-height:24px;">欢迎再度光临<a href="' . get_option('home') . '">' . get_option('blogname') . '</a></p>
            '.emailfooter;
    $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 wp_login_failed_notify(){
    date_default_timezone_set('PRC');
    $admin_email = get_bloginfo('admin_email');
    $to = $admin_email;
    $subject = '【登录失败】有人使用了错误的用户名或密码登录' . get_bloginfo('name') . '!';
    $message =  emailheadertop . get_bloginfo('name') . '账户登录失败通知!'.emailheaderbot.'
            <div style="padding:0;font-weight:bold;color:#6e6e6e;font-size:16px">尊敬的管理员您好!</div>
            <p style="color: red;font-size:13px;line-height:24px;">' . get_bloginfo('name') . '有一条登录失败的记录产生,若登录操作不是您产生的,请及时注意网站安全!</p>
            <table cellpadding="0" cellspacing="0" border="0" style="width:100%;border-top:1px solid #eee;border-left:1px solid #eee;color:#6e6e6e;font-size:16px;font-weight:normal">
                <thead><tr><th colspan="2" style="padding:10px 0;border-right:1px solid #eee;border-bottom:1px solid #eee;text-align:center;background:#f8f8f8;">失败信息如下</th></tr></thead>
                <tbody>
                    <tr>
                        <td style="padding:10px 0;border-right:1px solid #eee;border-bottom:1px solid #eee;text-align:center;width:100px">登录名</td>
                        <td style="padding:10px 20px 10px 30px;border-right:1px solid #eee;border-bottom:1px solid #eee;line-height:30px">' . $_POST['log'] . '</td>
                    </tr>
                    <tr>
                        <td style="padding:10px 0;border-right:1px solid #eee;border-bottom:1px solid #eee;text-align:center">尝试的密码</td>
                        <td style="padding:10px 20px 10px 30px;border-right:1px solid #eee;border-bottom:1px solid #eee;line-height:30px">' . $_POST['pwd'] . '</td>
                    </tr>
                    <tr>
                        <td style="padding:10px 0;border-right:1px solid #eee;border-bottom:1px solid #eee;text-align:center;">登录时间</td>
                        <td style="padding:10px 20px 10px 30px;border-right:1px solid #eee;border-bottom:1px solid #eee;line-height:30px">' . date("Y-m-d H:i:s") . '</td>
                    </tr>  
                    <tr>
                        <td style="padding:10px 0;border-right:1px solid #eee;border-bottom:1px solid #eee;text-align:center;">登录 IP</td>
                        <td style="padding:10px 20px 10px 30px;border-right:1px solid #eee;border-bottom:1px solid #eee;line-height:30px">' . $_SERVER['REMOTE_ADDR'] . '</td>
                    </tr>               
                </tbody>
            </table>
            '.emailfooter;
    wp_mail( $to, $subject, $message, "Content-Type: text/html; charset=UTF-8" );
}
add_action('wp_login_failed', 'wp_login_failed_notify');
add_filter('logout_url', 'mk_logout_redirect_home', 10, 2);
function mk_logout_redirect_home($logouturl, $redir){
    $redir = home_url();
    return $logouturl . '&redirect_to=' . urlencode($redir);
}

//账户资料修改提醒
function user_profile_update( $user_id ) {
        $site_url = get_bloginfo('wpurl');
        $site_name = get_bloginfo('wpname');
        $user_info = get_userdata( $user_id );
        $to = $user_info->user_email;
        $subject = "".$site_name."账户更新";
        $message = emailheadertop.'您在' .$site_name. '账户资料修改成功!'.emailheaderbot.'<p style="color: #6e6e6e;font-size:13px;line-height:24px;">亲爱的 ' .$user_info->display_name . '<br/>您的资料修改成功!<br/>谢谢您的光临</p>'.emailfooter;
        wp_mail( $to, $subject, $message, "Content-Type: text/html; charset=UTF-8");
}
add_action( 'profile_update', 'user_profile_update', 10, 2);

//账户被管理员删除提醒
function iwilling_delete_user( $user_id ) {
    global $wpdb;
    $site_name = get_bloginfo('name');
    $user_obj = get_userdata( $user_id );
    $email = $user_obj->user_email;
    $subject = "帐号删除提示:".$site_name."";
    $message = emailheadertop.'您在' .$site_name. '的账户已被管理员删除!'.emailheaderbot.'<p style="color: #6e6e6e;font-size:13px;line-height:24px;">如果您对本次操作有什么异议,请联系管理员反馈!<br/>我们会在第一时间处理您反馈的问题.</p>'.emailfooter;
    wp_mail( $email, $subject, $message, "Content-Type: text/html; charset=UTF-8");
}
add_action( 'delete_user', 'iwilling_delete_user' );

//文章更新提醒
function newPostNotify($post_ID) {
    if( wp_is_post_revision($post_ID) ) return;
    global $wpdb;
    $site_name = get_bloginfo('name');
    $post_contents = get_post($post_ID)->post_content;
    $get_post_info = get_post($post_ID);
    if ( $get_post_info->post_status == 'publish' && $_POST['original_post_status'] != 'publish' ) {
        $wp_user_email = $wpdb->get_col("SELECT DISTINCT user_email FROM $wpdb->users");
        $subject = 'Hi!'.$site_name.'发布新文章啦!';
        $message = emailheadertop.$site_name. '发布新文章啦!'.emailheaderbot.'
        <div style="padding:0;font-weight:bold;color:#6e6e6e;font-size:16px">文章标题:' . get_the_title($post_ID) . '</div>
        <p style="color: #6e6e6e;font-size:13px;line-height:24px;">' . mb_strimwidth($post_contents, 0, 320,"...") . '</p>
        <p style="color: #6e6e6e;font-size:13px;line-height:24px;text-align:right"><a href="' . get_permalink($post_ID) . '">查看全文</a><br /></p>
        '.emailfooter;
        $message_headers = "Content-Type: text/html; charset=\"utf-8\"\n";
        wp_mail($wp_user_email, $subject, $message, $message_headers); 
    }
}
add_action('publish_post', 'newPostNotify');
?>

3、引用邮件回复提醒模板

notify.php模板文件放到主题目录下后,在 functions.php 文件中引用该模板。引用代码如下所示:

include_once('notify.php');

至此,邮件自动回复提醒的功能的就配置完成了,文章有点长,但是步骤还是很简单的,祝好!

weinxin
博客小程序【一起行动派】
欢迎访问行动派博客小程序,小程序和博客同步更新,查看内容更加方便!
Action

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:11   其中:访客  6   博主  5

    • avatar wordpress建站吧 4

      用一个插件 比较简单点

      • avatar Jane博客 3

        用授权码好麻烦,不过更加安全

          • avatar Action Admin

            @Jane博客 使用授权码比使用登录密码安全。

          • avatar 锋言锋语 2

            很多虚拟主机没有邮箱服务,比如说我的,不过也可以用插件实现的,不过我一直没有弄这个东西。

              • avatar Action Admin

                @锋言锋语 弄个邮箱提醒还是很有必要的,可以及时了解博客动态。

              • avatar 心灵博客 3

                现在好多不提供smtp了,折腾难度又增加

                  • avatar Action Admin

                    @心灵博客 不怕,上有政策,下有对策!总有办法。

                  • avatar 杂烩网 2

                    我是用插件 欢迎测试

                    • avatar MAY的SEO博客 3

                      这个建议你检查一下邮件源代码,是否有泄露网站真实IP