flask实战-个人博客-电子邮件支持

电子邮件支持

因为博客要支持评论,所以我们需要在文章有了新评论后发邮件通知管理员。而且,当管理员回复了读者的评论后,也需要发送邮件提醒读者。

为了方便读者使用示例程序,personalBlog中仍然使用Flask-Mail来发送邮件。读者在运行程序前需要在项目根目录内创建.env文件写入对应的环境变量,以便让发信功能正常工作。

因为邮件的内容很简单,我们将直接在发信函数中写出正文内容,这里只提供了HTML正文。我们有两个需要使用电子邮件的场景:

1、当文章有新评论时,发送邮件给管理员;

2、当某个评论被回复时,发送邮件给被回复用户。

为了方便使用,我们在emails.py中分别为这两个使用场景创建了特定的发信函数,可以直接在视图函数中调用 。这些函数内部则通过我们创建的通用发信函数send_email()来发送邮件,如下所示 :

personalBlog/emails.py: 提醒邮件函数

from flask import url_for

def send_mail(subject, to, html):
    pass

def send_new_comment_email(post):
# blog.show_post是blog蓝本下的show_post视图函数
    post_url = url_for(‘blog.show_post‘, post_id = post.id, _external = True) + ‘#comments‘
    send_mail(subject = ‘New comment‘, to = current_app.config[‘BLUEBLOG_ADMIN_EMAIL‘],
              html = ‘<p>New comment in post <i>%s</i>, click the link below to check:</p>‘
                     ‘<p><a href="%s">%s</a></p>‘
                     ‘<p><small style = "color:#868e96">Do not reply this email.</small></p>‘
                     % (post.title, post_url, post_url))

def send_new_reply_email(comment):
    post_url = url_for(‘blog.show_post‘, post_id = comment.post_id, _external = True) + ‘#comments‘
    send_mail(subject = ‘New reply‘, to = comment.email,
              html = ‘<p>New reply for the comment you left in post <i>%s</i>, click the link below to check: </p>‘
                     ‘<p><a href="%s">%s</a></p>‘
                     ‘<p><small style="color: #868e96">Do not reply this email.</small></p>‘
                     % (comment.post.title, post_url, post_url))

send_new_comment_email()函数用来发送新评论提醒邮件。 我们通过将url_for()函数的_external参数设为True来构建外部链接。链接尾部的#comments是用来跳转到页面评论部分的URL片段(URL fragment),comments是评论部分div元素的id值。这个函数接收表示文章的post对象作为参数,从而生成文章正文的标题和链接。

URL片段又称片段标识符(fragment identifier),是URL中用来表示页面中资源位置的短字符,以#开头,对于HTML页面来说,一个典型的示例是文章页面的评论区。假设评论区的div元素id为comment,如果我们访问http://example.com/post/7#comment,页面加载完成后将会直接跳到评论部分。

send_new_reply_email()函数则用来发送新回复提醒邮件。这个发信函数接收comment对象作为参数,用来构建邮件正文,所属文章的主键值通过comment.post_id属性获取,标题则通过comment.post.titlle属性获取。

在personalBlog源码中,我们没有使用异步的方式发送邮件,如果你希望编写一个异步发送邮件的通用发信函数send_mail(),和之前介绍的基本相同,如下所示

from threading import Thread
from flask import current_app
from flask_mail import Message

from personalBlog.extensions import mail

def _send_async_mail(app, message):
    with app.app_context():
        mail.send(message)

def send_async_mail(subjecct, to, html):
    app = current_app._get_current_object() # 获取被代理的真实对象
    message = Message(subjecct, recipients=[to], html = html)
    thr = Thread(target = _send_async_mail, args = [app, message])
    thr.start()
    return thr

需要注意,因为我们的程序是通过工厂函数创建的,所以实例化Thread类时,我们使用代理对象current_app作为args参数列表中app的值。另外,因为在新建线程时需要真正的程序对象来创建上下文,所以不能直接传入current_app,而是传入current_app调用_get_current_app()方法获取的被代理的程序实例。

原文地址:https://www.cnblogs.com/xiaxiaoxu/p/10847070.html

时间: 2024-08-30 05:00:26

flask实战-个人博客-电子邮件支持的相关文章

flask实战-个人博客-程序骨架、创建数据库模型、临接列表关系

编写程序骨架 personalBlog的功能主要分为三部分:博客前台.用户认证.博客后台,其中包含的功能点如下图所示: 数据库 personalBlog一共需要使用四张表,分别存储管理员(Admin).分类(Category),文章(Post)和评论(Comment). 1.创建数据库模型 1)管理员 如果是编写一个固定的个人博客,那么事情就要简单得多,博客的大部分固定信息(比如博客标题,页脚信息等)都可以直接写死在模板中,或是使用自定义的配置存储在配置文件中.但是我们希望编写的是一个通用的博客

flask实战-个人博客-模板

模板 personalBlog采用典型的博客布局,左侧三分之二为主体,显示文章列表.正文:右侧三分之一为边栏,显示分为类列表.社交链接等.现在的工作是将HTML文件加工为模板,并创建对应的表单类,在模板中渲染. 并非所有的页面都需要添加边栏,所以我们不能把它放到基模板中.为了避免重复和易于维护,我们把边栏部分的代码放到了局部模板_sidebar.html中.除了基模板base.html和存储宏的macros.html模板,personalBlog程序的博客前台使用的模板如下所示: index.h

flask实战-个人博客-编写博客前台

编写博客前台 博客前台需要开放给所有用户,这里包括显示文章列表.博客信息.文章内容和评论等功能功能. 分页显示文章列表 为了在主页显示文章列表,我们要先在渲染主页模板的index视图的数据库中获取所有文章记录并传入模板: blueprints\blog.py: from personalBlog.models import Post @blog_bp.route('/') def index(): posts = Post.query.order_by(Post, timestamp.desc(

flask实战-个人博客-使用类组织配置

使用类组织配置 在实际需求中,我们往往需要不同的配置组合.例如,开发用的配置,测试用的配置,生产环境用的配置.为了能方便地在这些配置中切换,你可以把配置文件升级为包,然后为这些使用场景分别创建不同的配置文件,但是最方便的做法是在单个配置文件中使用python类来组织多个不同类别的配置. 下面的代码是personalBlog的配置文件,现在它包含一个基本配置类(BaseConfig),还有其他特定的配置类,即测试配置类(TestingConfig).开发配置类(DevelopmentConfig)

[转]CSDN博客频道支持Windows Live Writer离线写博客啦

今天下载了最新的windows live writer 但是不能配置csdn模块发布了,找到了这个信息后才知道完成了如下修改配置. 各位尊敬的CSDN用户: 你们好!  为了更好的服务于用户,CSDN博客频道已经支持Windows Live Writer离线写博客啦.Windows Live Writer于2014年5月29日正式上线啦!欢迎大家抢先体验! 有了WLW ,现在您可以随时随地撰写博客,不用登录即可编辑和发表博客啦.WLW 可以直接打开任何之前已经发布的日志,修改并重新发布,确保您在

公告:CSDN博客频道支持Windows Live Writer离线写博客啦

各位尊敬的CSDN用户: 你们好! 为了更好的服务于用户,CSDN博客频道已经支持Windows Live Writer离线写博客啦.Windows Live Writer于2014年5月29日正式上线啦!欢迎大家抢先体验! 有了WLW ,现在您可以随时随地撰写博客,不用登录即可编辑和发表博客啦.WLW 可以直接打开任何之前已经发布的日志,修改并重新发布,确保您在脱机时所作的修改与您发布的内容同步. 以下是安装WLW 和相关设置: 1. 下载安装WLW (步骤略,可自行下载),添加日志账户,如图

告示:CSDN博客通道支持Windows Live Writer写blog离线好友

尊敬的各位CSDN用户: 您好! 为了更好的服务客户.CSDN已经支持Windows Live Writer离线写博客啦.Windows Live Writer于2014年5月29日正式上线啦!欢迎大家抢先体验! 有了WLW .如今您能够随时随地撰写博客.不用登录就可以编辑和发表博客啦.WLW 能够直接打开不论什么之前已经公布的日志.改动并又一次公布.确保您在脱机时所作的改动与您公布的内容同步. 下面是安装WLW 和相关设置: 1. 下载安装WLW (步骤略,可自行下载.官方下载地址:id=86

用flask开发个人博客(4)—— flask中4种全局变量

https://blog.csdn.net/hyman_c/article/details/53512109 一  current_app current_app代表当前的flask程序实例,使用时需要flask的程序上下文激活,我们以本专栏第一篇文章中写的test.py为例介绍下它的用法: 1.1 激活程序上下文 [python] view plain copy >>> from test import app >>> from flask import curren

博客园支持Mardown编辑了

开心 听说博客园支持Markdown了,作为程序员专业本能来做个测试. 图片 文章没图片怎么行呢 开始 接下来准备发一些文章,都会用Markdown来写的. 原文地址:https://www.cnblogs.com/BillySir/p/9690710.html