邮箱发送天气提醒 这个在网上还算是比较多的,主要功能就是调用和风天气api或者爬取天气,定时发送邮件到指定的邮箱,起到一个报告的作用
但是,这个也被诟病没有用—-打开手机就能看到天气还需要这样的邮件嘛。但是从另一个角度来说也不是完全没用,比如先设置好,定时发送服务器中的报告来提防服务器出事或者说找个语料包,定时给女朋友发个问候之类的,最次,也是一个学习的过程啊(笑哭)
我就大概描述一下发送天气提醒的过程及关键代码
配置天气的api接口 这里常用的免费api就是和风天气了,虽然免费有一些限制使用,但是比专门爬取是要好上很多了。
*注:由于图片麻烦,我会尽量使我的描述清楚不用配图,除了要做开箱:-),那就没办法了
首先登陆和风天气 ,按照提示注册,这个不需要多说
回到首页,找到天气api(右上角),进入登陆进入控制台
在左边的控制台找到应用管理,新建一个应用,即新建一个自己的接口
新建完成后找到新建的应用,点击编辑,输入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 requestsimport jsonurl = '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' ] result = res['HeWeather6' ][0 ]['daily_forecast' ] 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 import csvimport timeimport jsonimport requestsimport smtplibfrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultiparturl = '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) 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) 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
那这是下一步的事,今天因为多吃了一粒米心情不好就不继续写了,明天再继续写。
我是分割线
把内容提取到邮件之中