python办公自动化(三) | 借助服务器定时爬数据发邮件

网友投稿 725 2022-05-30

如果,每天清晨洗漱完毕,都会收到朋友的温柔来信,告诉你今天的天气,并将你喜爱的内容发过来,这一天是不是会特别的劲儿呢?

今天,数据猿就想做一个自动邮件程序,可以将每天的天气、优美诗句,还有带给朋友的祝福,在每天的清晨准时带给他!

当然,也可以作为社畜的工具,比如每天/周给老板汇报工作进度~

本文目录如下:

分析需求

步骤

模块搭建

获取天气数据

提取诗句

合成html

发送邮件

获取授权码

登录smtp并发送

定时发送

小结

分析需求

背景:每天8点左右,给朋友的邮箱发送天气情况、拜伦诗句和祝福语~

一般的项目需求可以细分为目标-输入&输出-步骤三个部分。

经过思考,本项目需要以下内容——

目标:定时发邮件

输入:str【邮箱号、天气、诗句、祝福】

输出:html【天气、诗句、祝福合成的html】

python办公自动化(三) | 借助服务器定时爬数据发邮件

为什么是html?因为自动发邮件需要调用smtplib库,内容需为html语言格式

步骤:

爬取今日天气信息

提取今日诗句

合成html

发送邮件

步骤

首先,搭建项目的基本框架

def get_weather(): ''' 爬取中国天气网,获取天气信息 ''' pass def get_poem(): ''' 获取拜伦诗句 ''' pass def sentemail(): ''' 合成内容,并发送邮件 ''' pass if __name__ == '__main__': ''' 主函数,调用函数以上函数 ''' pass

这里推荐使用中国天气网的免费API,面向个人用户免费单日可调用300次,非常良心。

详见开发指南:

https://www.tianqiapi.com/index/doc?version=v6

请求的API示例:

https://www.tianqiapi.com/api?version=v6&appid=95561987&appsecret=Wb6VbSzq&city=北京

注意需要申请注册开发者账号,获得appid和appsecret字段,否则获取不到内容,注册过程非常简单。

以上示例可以得到如下内容:

可以发现,是json格式储存的天气信息,文档提供了详细的字段说明,可获取api内容后,自由选择想要的内容。

数据猿根据需要,挑选了date、week、tem2、tem1、city、wea、win_speed、air_level、air_tips字段。

在使用requests.get()获取了之后,使用.json()解析,选择以上字段组成内容,返回给主函数。

获取天气数据代码如下:

def getWeather(city): url = 'https://www.tianqiapi.com/api?version=v6&appid=213751&appsecret=fv5E&city='+city kv={'user-agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/500.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/500.36"} r = requests.get(url, headers=kv, timeout=5).json() value = '亲爱的朋友,早上好!' + '\n'+ \ '今天是' + r['date'] + ' ' + r['week'] + ',\n'+ \ '气温' + r['tem2'] + '到' + r['tem1']+ ',\n'+ \ r['city'] + '今天' + r['wea'] + ', 风力' + r['win_speed'] + ',\n'+ \ '空气质量' + r['air_level'] + ', ' + r['air_tips'] + '\n' return value

要读取拜伦的诗,首先需要搞到拜伦的诗集文本数据

前不久发现了一个宝藏网站,古登堡项目,网址如下:

http://www.gutenberg.org/

包含了许多电子书资源,而且很多还有txt格式的下载资源,介绍如下:

从古登堡项目里下载拜伦勋爵的诗集,存在本地Byron Poetry Collection.txt,然后部分读取其中诗句的位置,确保每天都是一段诗句。

获取诗句部分代码如下:

def get_poem(): with open('Byron Poetry Collection.txt','r',encoding='utf-8') as f: alltext = f.read() start = alltext.find("Bob Southey! You're a poet, poet laureate,") final = alltext.find('End of the Project Gutenberg EBook of Don Juan, by Lord Byron.') # 经测试,start的几个字母会被包含,但是final的几个字母不会,所以可如下使用 alltext1 = alltext[start:final] alltext_list = alltext1.replace(' ','').replace(' ','').split('\n\n') while '' in alltext_list:alltext_list.remove('') return alltext_list

smtplib库支持html语言传入内容,这里结合html语言的组合我们的天气、诗句和祝福!

body = '

The poetry of Lord Byron

{0}

\n下面是您今天的拜伦小诗,请查收~\n

{1}

数据猿Rigggle祝你度过愉快的一天

'.format(wea,text)#img # 设置邮件正文,这里是支持HTML的 msg = MIMEText(body, 'html')

首先,需要去往邮箱,进入设置-POP3/SMTP/IMAP设置,这里需要确保开启smtp功能。

如果已经开启,则继续向下,找到授权密码管理-新增授权密码,然后记住授权码。

将授权码赋值给本文pwd变量,host变量是服务器地址,一般163邮箱是 smtp.163.com,qq邮箱是smtp.qq.com,也可从POP3/SMTP/IMAP设置中找到。port是发邮箱的端口,一般选择465。

如下变量值可以写出:

host = 'smtp.163.com' # 注意如果是 port = 465 sender = 'mjc_data@163.com' #这里是数据猿邮箱,请替换 pwd = 'PDSUNTQVERPZCEAC'#这里是数据猿邮箱的授权码,请替换

设置邮件主题和收件人,收件人邮箱号赋值给receiver变量:

msg['subject'] = '拜伦小诗来了,今天元气满满!' msg['from'] = sender # 设置发送人 msg['to'] = receiver

然后,使用smtplib库登录邮箱,并发送内容到收件人。将发件人邮箱号、收件人邮箱号、发件内容一同传入sendmail()函数,即可完成邮件发送。

s = smtplib.SMTP_SSL(host, port) s.login(sender, pwd) s.sendmail(sender, receiver, msg.as_string())

本节代码如下:

def sentemail(receiver,city,text_n): host = 'smtp.163.com' # 注意如果是 port = 465 sender = 'mjc_data@163.com' #替换为自己的邮箱号 pwd = 'PDSUNTQVERPZCEAC' # 替换为自己邮箱的授权码 wea = getWeather(city) text = get_poem()[text_n] print('文本正常,内容为:'+ text ) body = '

The poetry of Lord Byron

{0}

\n下面是您今天的拜伦小诗,请查收~\n

{1}

数据猿Rigggle祝你度过愉快的一天

'.format(wea,text)#img # 设置邮件正文,这里是支持HTML的 msg = MIMEText(body, 'html') # 设置正文为符合邮件格式的HTML内容 msg['subject'] = '拜伦小诗来了,今天元气满满!' # 设置邮件标题 msg['from'] = sender # 设置发送人 msg['to'] = receiver # 设置接收人 try: s = smtplib.SMTP_SSL(host, port) # 注意!如果是使用SSL端口,这里就要改为SMTP_SSL s.login(sender, pwd) # 登陆邮箱 s.sendmail(sender, receiver, msg.as_string()) # 发送邮件! print ('邮件发送顺利') except smtplib.SMTPException: print('发送失败!请检查配置!')

整体效果如下:

定时有两种方式,一种是到固定时间执行代码,一种是间隔一段时间执行代码。

要实现每天发送,数据猿使用time.sleep(86400)来间隔一天,86400是一天的秒数。

同时,根据拜伦诗集的内容长度,每天只获取其中一段。

if __name__ == '__main__': receiver = ['mjc_data@163.com','myreceiver@qq.com']# 请替换为自己的收件人邮箱 for i,v in enumerate(get_poem()): for j in receiver: sentemail(j,'广州',i) sleep(86400) #休息一天86400

因为需要定时、联网发送,所以最好放在服务器内,比较稳定可靠。

小结

本片内容是将自动发邮件、利用API获取数据、文件读写都杂糅一起了,项目难度较大,有兴趣的可多多尝试,欢迎私聊数据猿交流。

网络上可免费使用的API有很多,还是比较适合我们这些个人用户玩耍的,走正规途径获取内容更可靠,避免维护爬虫。

诗句的呈现目前做的还不好,不能像诗歌那样隔行呈现;获取天气部分目前没有深入使用city字段,现在只能手动调整天气的城市。

如需要本文代码和文件,请移步公众号后台回复 自动邮件

往期精品:

Python办公自动化(一) | chardet库自动读写多编码格式的文件

python办公自动化(二) | 读取.txt、.data、.doc和.docx文档的部分内容

参考资料:

中国天气网开发指南:https://www.tianqiapi.com/index/doc?version=v6

文字编辑:数据猿Riggle

在读新闻与传播专业硕士研究生,正在毕业论文、找工作ing…

首发平台:文科数据员(ID: HSS_data)

API HTML Python 云速邮箱 自动化测试

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:《网络攻防技术(第2版)》 —2.3.3 系统类型扫描
下一篇:Terraform 语法简介
相关文章