通过 python 发送邮件提醒网站的新评论

这篇文章是当时在新浪云上搭建博客的时候写的,后来因为新浪云收费了,把网站迁移到了github上。这里还是把文章贴出来,做个记录。

最近在写本站的评论提醒功能的时候,需要通过 python 发送邮件提醒具体哪些文章有了新评论,采用邮件的方式便于在特定时间处理所有的评论,比如说在第二天早上7点检查网站昨天是否有新的评论,假如有就会发送邮件显示那些有新评论的文章。

实现思路如下:先检查数据库中是否有新的评论,假如有新的评论就发送邮件,否则不发送。

如何检查新评论?在存储评论的表中有一个字段表示添加该评论的时间(datetime类型),利用这个字段能够在今天判断昨天是否有新的评论,现假设评论表为comment,表示评论添加时间的字段为created_date,采用的SQL语句如下:

1
select * from comment  where date(created_date) =( select date_sub(curdate(),interval 1 day)

假如查询的语句不为空,那么说明有了新的评论,可以将关于评论的具体内容以邮件形式发送给管理员。下面是python发送邮件的实现方法之一:

PS:虽然新浪云提供了用于发送邮件的Mail服务,当时对于普通用户每天好像会限定发送的次数,而且最严重的问题是邮件的延迟非常严重,建议还是使用smtplib模块。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#encoding:utf-8
import smtplib #用于发送邮件
import string #用于将要发送的内容格式化成邮件标准格式
from email.mime.text import MIMEText

def send_email(content): #content为发送邮件的正文内容,这里只涉及到文本
HOST="smtp.XXX.com"#发送邮件smtp服务器
FROM="XXX@XXX.com" #发送邮件的邮箱
PASSWORD="" #发送邮件的邮箱的密码
TO="XXX@XXX.com" #接收邮件的邮箱
SUBJECT="New Comments on your Website" #邮件主题

msg=MIMEText(content,'plain','utf-8') #邮件内容及编码方式
msg['Subject']=SUBJECT
msg['From']=FROM
msg['To']=TO

try:
s=smtplib.SMTP()
s.connect(HOST)
s.login(FROM,PASSWORD)
s.sendmail(FROM,[TO],msg.as_string())
s.quit()
return True
except EXception,e:
return False

下面提到的几点有助于更好地理解上面的代码

  1. 通过免费提供的邮箱(如163邮箱,新浪邮箱)发送邮件的过程是先将邮件发送到对应邮箱的smtp服务器,然后由smtp服务器将邮件帮你发送到你要发送的邮箱。一般来说,邮箱对应的服务器都跟其名称有关,如163邮箱对应的是smtp服务器是smtp.163.com,新浪邮箱对应的smtp服务器是smtp.sina.com;其他的邮箱相应可以从设置中找到。

  2. smtplibMIMEText是python自带的库,不用另外安装,比较方便,其中smtplib负责发送邮件,MIMEText则负责将要发送的文本内容统一成邮件的标准模式,加入要加入一些附件,需要MIMEMultipart这个模块。

需要注意的是发送邮件的邮箱需要开启smtp服务,一般能够在邮箱的设置中开启。因为有些有些邮箱是不开启这个功能的,比如说新浪邮箱。

发送邮件的效果图如下所示:

能够发送邮件后,要考虑的问题就是如何自动化执行了,总不能每天手动执行一遍脚本吧,在Linux下可通过crontab来设置计划任务,同样新浪云也提供了类似的cron的服务,这样便可在每天的早上检查昨天是否有新评论在决定是否要发送邮件了。