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

举报
文科数据员 发表于 2021/03/10 22:23:23 2021/03/10
【摘要】 当然,也可以作为社畜的工具,比如每天/周给老板汇报工作进度~

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

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

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

本文目录如下:

分析需求

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

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

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

  1. 目标:定时发邮件

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

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

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

  3. 步骤:

    1. 爬取今日天气信息
    2. 提取今日诗句
    3. 合成html
    4. 发送邮件

步骤

模块搭建

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

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=北京

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

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

image-20210310095153955

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

image-20210310095252629

数据猿根据需要,挑选了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格式的下载资源,介绍如下:

image-20210310105345529

从古登堡项目里下载拜伦勋爵的诗集,存在本地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

合成html

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

body = '<h1>The poetry of Lord Byron</h1><p>{0}</p>\n下面是您今天的拜伦小诗,请查收~\n<p></p><p>{1}</p><p>数据猿Rigggle祝你度过愉快的一天</p>'.format(wea,text)#img
    # 设置邮件正文,这里是支持HTML的
msg = MIMEText(body, 'html') 

发送邮件

获取授权码

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

image-20210310110608114

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

image-20210310110810523

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

image-20210310111049587

如下变量值可以写出:

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

设置邮件主题和收件人,收件人邮箱号赋值给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 = '<h1>The poetry of Lord Byron</h1><p>{0}</p>\n下面是您今天的拜伦小诗,请查收~\n<p></p><p>{1}</p><p>数据猿Rigggle祝你度过愉快的一天</p>'.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('发送失败!请检查配置!')

整体效果如下:

image-20210310110317846

定时发送

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

要实现每天发送,数据猿使用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

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

image-20210310112612488

小结

  1. 本片内容是将自动发邮件、利用API获取数据、文件读写都杂糅一起了,项目难度较大,有兴趣的可多多尝试,欢迎私聊数据猿交流。
  2. 网络上可免费使用的API有很多,还是比较适合我们这些个人用户玩耍的,走正规途径获取内容更可靠,避免维护爬虫。
  3. 诗句的呈现目前做的还不好,不能像诗歌那样隔行呈现;获取天气部分目前没有深入使用city字段,现在只能手动调整天气的城市。
  4. 如需要本文代码和文件,请移步公众号后台回复 自动邮件

往期精品:

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

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

参考资料:

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

文字编辑:数据猿Riggle

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

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。