我的网站搭建(第18天) 评论或回复发送邮件通知

  • 发布时间:2016年5月19日 10:10
  • 作者:杨仕航
* 该文是基于Python2.7开发的,最新Python3.x和Django2.x视频教程可以前往 >> Django2.0视频教程

之前我查看有没有人评论我的博文都是登录后台去查看。这样会导致查看不及时,而且我回复了其他人的评论,其他人也不知道我回复了。因为他们没法登录我的后台去查看。

由于注册用户我设置的用户是邮箱,所以考虑只要有评论或者回复,就发送一个邮件给对应的用户。

那么,又要对Comments库“开刀”了。


评论处理的方法在comments库中,这个也限制了评论或回复之后的动作要在comments库中完成。

我用的是WebFaction服务器,comments评论库的具体路径是"~/lib/python2.7/django_contrib_comments-1.6.2-py2.7.egg/django_comments/"。comments库的结构在前面博文也有介绍,这里就不多说了。


要写代码的地方确定之后,可以进一步开发了。发送邮件的类型大致可以分为两种:简单文本邮件和复杂的Html邮件。为了更好的显示内容,一般都是采用html邮件。既然涉及到html,我们可以采用模版的形式加载html内容,不用每次都用代码去构造html页面。


在Comments库的views目录,添加发送邮件的Python脚本(文件名命名为email.py)代码如下:

#coding:utf-8
"""
    Author: Haddy Yang
    Date: 2016-05-12
    Descript: Send Email
"""
from django.core.mail import send_mail
from django.core.mail import EmailMessage
from django.template import loader
from django.conf import settings

class SendEmail():
    """send email"""
    def ___init__(self):
        pass

    def send_html_email(self, subject, html_content, to_list):
        """发送html邮件"""
        send_from = settings.DEFAULT_FROM_EMAIL
        msg = EmailMessage(subject, html_content, send_from, to_list)
        msg.content_subtype = "html" #设置类型为html
        msg.send()

    def send_text_email(self, subject, body, to_list, is_fail_silently=False):
        """发送简单的文本邮件"""
        send_from = settings.DEFAULT_FROM_EMAIL
        send_mail(subject, body, send_from, to_list, fail_silently = is_fail_silently)

    def send_email_by_template(self, subject, module, data, to_list):
        """
        使用模版发送邮件
            subject: string, 主题
            module:  string, 模版名称
            data:    dict,   数据
            to_list: list,   收件人
        """
        html_content = loader.render_to_string(module, data)
        self.send_html_email(subject, html_content, to_list)

这个脚本封装了3个发送邮件的方法。

这样就可以发送邮件了?假如没有在settings.py配置相关的邮箱设置,就发送不了。可以参考《我的网站搭建(第12天) 关闭调试》和《Django在WebFaction服务器的邮箱设置


打开Comments库的templates目录,创建文件夹email,添加两个模版文件,分别是评论和回复发送邮件使用的模版。

评论邮件模版:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <style type="text/css">
        body{
            font-family:'Microsoft YaHei', 宋体, Tahoma, Helvetica, Arial, 宋体, sans-serif;
        }
    </style>
</head>

<body>
    <div style="
        margin-left: 1em;
    ">
        <p>有人评论了你的博文 <a href="{{ comment_url }}">点击查看</a></p>
        <p style="
            background-color: #E0E0E0;
            padding: 1em 0.5em;
            /*width: 35em;*/
            border-radius: 6px;
            font-size: small;
        ">{{ comment_name }}:“{{ comment_content }}”</p>
    </div>
    <div style="
        margin-top:1.5em;
        margin-right:3em;
        font-size:small;
        text-align:right;
    ">
        <a href="http://yshblog.com/" style="
            text-decoration: none;
            color:#517CAF;
            margin-left:1em;
        ">
            杨仕航的博客
        </a>
        <span>(一个原创高质量的技术博客)</span>
    </div>
</body>
</html>

回复邮件模版:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <style type="text/css">
        body{
            font-family:'Microsoft YaHei', 宋体, Tahoma, Helvetica, Arial, 宋体, sans-serif;
        }
    </style>
</head>

<body>
    <div style="
        margin-left: 1em;
    ">
        <p>有人回复了你的评论 <a href="{{ comment_url }}">点击查看</a></p>
        <p style="
            background-color: #E0E0E0;
            padding: 1em 0.5em;
            /*width: 35em;*/
            border-radius: 6px;
            font-size: small;
        ">{{ comment_name }}:“{{ comment_content }}”</p>
    </div>
    <div style="
        margin-top:1.5em;
        margin-right:3em;
        font-size:small;
        text-align:right;
    ">
        <a href="http://yshblog.com/" style="
            text-decoration: none;
            color:#517CAF;
            margin-left:1em;
        ">
            杨仕航的博客
        </a>
        <span>(一个原创高质量的技术博客)</span>
    </div>
</body>
</html>


这两个模版基本一样,就是文字略不同,而且都有共同的参数:

1、comment_url:评论或回复的链接

2、comment_name:评论或回复的人

3、comment_content:评论或回复的内容


再打开Comments库的view文件夹,修改comments.py文件,加上发送邮件的处理代码。

这个文件代码有点多,我只把添加的代码写出来。

导入相关内容:

#coding:utf-8
from . import email  #导入当前文件夹的email.py

post_comment方法,最后返回提交成功前,写发送邮件代码:

try:
    #判断评论对象是否为博文
    if str(comment.content_type) == 'blog':
        send_email = email.SendEmail()
        #设置模版对应的参数
        email_data = {
            'comment_name' : data["name"], 
            'comment_content' : comment.comment,
            'comment_url' : u'http://yshblog.com/blog/%s#F%s' % (comment.object_pk, comment.id)}
        subject = ''    #邮件主题
        template = ''   #使用的模版
        to_list = []        #收件人

        if int(comment.root_id) == 0:
            subject = u'[杨仕航的博客]博文评论'
            template = 'email/comment.html'
            #发送给自己(可以写其他邮箱)
            to_list.append(settings.DEFAULT_FROM_EMAIL)
        else:
            subject = u'[杨仕航的博客]评论回复'
            template = 'email/reply.html'
            #获取评论对象,找到回复对应的评论
            comment_model = django_comments.get_model()
            cams = comment_model.objects.filter(id = comment.reply_to)
            if cams:
                to_list.append(cams[0].user_email)
            else:
                #没有找到评论,就发给自己(可以修改其他邮箱)
                to_list.append(settings.DEFAULT_FROM_EMAIL)

        #根据模版发送邮件
        send_email.send_email_by_template(subject, template, email_data, to_list)
    else:
        #其他类型的评论暂不处理
        pass
except Exception as e:
    #ResponseJson方法是我前面自己加的,可以参考上一篇博文
    return ResponseJson(200, True, e.message)


最后,还需要修改一下前端页面。点击打开邮件里面的链接需要跳转到对应的评论或回复上面。

大致链接是这样的:http://yshblog.com/blog/41#F39

#F39是评论或回复的id,需要在博文显示评论的模版给评论或回复加上name属性。

<div class="blog_comment" name="F{{comment.id}}">...</div>

打开页面的时候,用js代码获取这个参数调整。js代码如下(引用了jQuery库):

//定位到评论位置
if(window.location.hash!=""){
    //根据名称获取元素
    obj = document.getElementsByName(window.location.hash.split("#")[1])[0];
    //DOM对象转为jQuery对象
    var $obj = $(obj);
    //定位到评论或回复的位置
    $("body,html").animate({
      scrollTop: $obj.offset().top - 70
    }, 0);
}


这样就为评论和回复添加了发送邮件功能,可以及时知道评论和绑定用户更加紧密。

上一篇:Access文本框value属性和text属性的区别

下一篇:我的网站搭建(第17天) 评论库添加回复功能

相关专题: Django评论库开发   

评论列表

智慧如你,不想发表一下意见吗?

新的评论

清空