邮箱发送天气提醒

这个在网上还算是比较多的,主要功能就是调用和风天气api或者爬取天气,定时发送邮件到指定的邮箱,起到一个报告的作用

但是,这个也被诟病没有用—-打开手机就能看到天气还需要这样的邮件嘛。但是从另一个角度来说也不是完全没用,比如先设置好,定时发送服务器中的报告来提防服务器出事或者说找个语料包,定时给女朋友发个问候之类的,最次,也是一个学习的过程啊(笑哭)

我就大概描述一下发送天气提醒的过程及关键代码

配置天气的api接口

这里常用的免费api就是和风天气了,虽然免费有一些限制使用,但是比专门爬取是要好上很多了。

*注:由于图片麻烦,我会尽量使我的描述清楚不用配图,除了要做开箱:-),那就没办法了
  1. 首先登陆和风天气,按照提示注册,这个不需要多说

  2. 回到首页,找到天气api(右上角),进入登陆进入控制台

  3. 在左边的控制台找到应用管理,新建一个应用,即新建一个自己的接口

  4. 新建完成后找到新建的应用,点击编辑,输入Key的名称与类型,类型用web api就好

到这里算是把接口配置好了

调用已配置的接口

对于网站的接口就web请求获取json值就好,和风天气有提供文档说明,这里可以自己选择配置。

完事具备,现在只差调用了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import requests
import json

url = 'https://free-api.heweather.net/s6/weather/forecast?location=衡阳&key=45a7ae9c8ebd4660a0e1a9c93e2f5b2a'
res = requests.get(url)
res = json.loads(res.text)
a = res['HeWeather6'][0]['basic']
#print(result)
result = res['HeWeather6'][0]['daily_forecast']
#print(result)
city = a['admin_area']+a['location']
print(city)

names = ['城市','时间','天气状况','最高温','最低温','日出','日落']
for data in result:
date = data['date']
cond = data['cond_txt_d']
max = data['tmp_max']
min = data['tmp_min']
sr = data['sr']
ss = data['ss']
print(city,date,cond,max,min,sr,ss)

我这里调用的衡阳的天气,得到的print为

1
2
3
4
湖南衡阳
湖南衡阳 2020-02-09 阴 10 6 07:09 18:17
湖南衡阳 2020-02-10 小雨 11 8 07:09 18:18
湖南衡阳 2020-02-11 阵雨 17 9 07:08 18:19

显然,调用成功了(假装没有调试过)

用邮件发送天气到目标邮箱

自动发邮件的话一般来说需要一个域名服务器,不过这个可以用开启qq邮箱的stmp服务来实现。

登陆qq邮箱,在设置中找到账户,找到POP3/SMTP服务,根据提示打开服务并记录下授权码(或者说是密码),这就是申请自动发邮件的关键。

下面就是代码环节

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# -*- coding: utf-8 -*-
import csv
import time
import json
import requests
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

url = 'https://free-api.heweather.net/s6/weather/forecast?location=衡阳&key=45a7ae9c8ebd4660a0e1a9c93e2f5b2a'
today_time = time.strftime('%Y-%m-%d', time.localtime(time.time()))

def get_weather_data():
res = requests.get(url)
res.encoding = 'utf-8'
res = json.loads(res.text)
result = res['HeWeather6'][0]['daily_forecast']
location = res['HeWeather6'][0]['basic']
city = location['parent_city'] + location['location']
names = ['城市', '时间', '天气状况', '最高温', '最低温', '日出', '日落']
with open('today_weather.csv', 'w', newline='')as f:
writer = csv.writer(f)
writer.writerow(names)
for data in result:
date = data['date']
cond = data['cond_txt_d']
max = data['tmp_max']
min = data['tmp_min']
sr = data['sr']
ss = data['ss']
writer.writerows([(city, date, cond, max, min, sr, ss)])
send_email()

def send_email():
# 设置邮箱的域名
HOST = 'smtp.qq.com'
# 设置邮件标题
SUBJECT = '%s日份天气预报信息,请查收'%today_time
# 设置发件人邮箱
FROM = '271370166@qq.com'
# 设置收件人邮箱
TO = '271370166@qq.com' # 可以同时发送到多个邮箱
message = MIMEMultipart('related')
# --------------------------------------发送文本-----------------
# 发送邮件正文到对方的邮箱中
message_html = MIMEText("%s日份天气预报到账啦,请查收" % today_time, 'plain', 'utf-8')
message.attach(message_html)

# -------------------------------------添加文件---------------------
# today_weather.csv这个文件
message_xlsx = MIMEText(open('today_weather.csv', 'rb').read(), 'base64', 'utf-8')
# 设置文件在附件当中的名字
message_xlsx['Content-Disposition'] = 'attachment;filename="today_weather.csv"'
message.attach(message_xlsx)

# 设置邮件发件人
message['From'] = FROM
# 设置邮件收件人
message['To'] = TO
# 设置邮件标题
message['Subject'] = SUBJECT

# 获取简单邮件传输协议的证书
email_client = smtplib.SMTP_SSL(HOST)
# 设置发件人邮箱的域名和端口,端口为465
email_client.connect(HOST, '465')
# ---------------------------邮箱授权码------------------------------
result = email_client.login(FROM, 'ellnzvqenuclcaab')
print('登录结果', result)
email_client.sendmail(from_addr=FROM, to_addrs=TO.split(','), msg=message.as_string())
# 关闭邮件发送客户端
email_client.close()

get_weather_data()

运行以后发现,邮件就已经以csv的格式发送到邮箱里了。注意,这里我用的是python3.7,不同版本使用会有细微差别,所以需要一点调整,无伤大雅。

现在是发送一个天气的CSV附件,但是这还不是我所想要的内容,我希望把这个内容提取到邮件内容里,比如

主子/小主:

​ 今天XXX的天气是XXX,温度在XX和XX之间,与昨天相比更冷/热了,注意保暖:-)。今天有什么代办事项(课程),服务器有什么记录balabala

那这是下一步的事,今天因为多吃了一粒米心情不好就不继续写了,明天再继续写。


我是分割线


把内容提取到邮件之中