完成这个任务需要三个步骤:
- 1、查询天气
- 2、发送邮件
- 3、代码实现
查询天气,主要是通过api来发送请求得到json数据串,并通过postman来测试请求。
查询天气接口
要获取天气情况,需要一个查询天气的接口,网上找了一下,一般都是注册后送一定调用次数的,我选择了一个,免费送 500 次查询次数的。
我们看看接口的 API 文档。
其中城市名 cityname 和 key 是必填项。
http://v.juhe.cn/weather/index?format=2&cityname=%E8%8B%8F%E5%B7%9E&key=您申请的KEY
key 值在 juhe.cn 我的接口那一栏中可以看到。
我们也可以事先在 Postman 工具中调试看看接口能否调通。
Postman 接口工具没用过的没关系,他们网页上也提供了调试工具。
查询天气方法
我们直接用 requests 库请求接口就能获得 json 格式的天气信息,json 数据中包含了当天和未来几天的天气信息,这里我只需要当天的,当天数据都在 result 下的 today 里,提取出来用 return 返回。
2、发送邮件
def send_mail(self):
# 设置邮件信息
city_name, day_temp, day_weather, weather_date, city_id = self.get_weather()
print(city_name)
weather = "城市:{}\n温度:{}\n天气状况:{}\n天气日期:{}\n城市代码:{}"\
.format(city_name, day_temp, day_weather, weather_date, city_id)
print(weather)
msg = MIMEText(weather, 'plain', 'utf-8')
msg['Subject'] = Header('天气状态', 'utf-8').encode()
msg['From'] = self._format_addr('中国气象网 <%s>' % self.from_addr)
for to_addr in to_address:
msg['To'] = self._format_addr('天气状态 <%s>' % to_addr)
# 发送邮件
server = smtplib.SMTP(self.SmtpServer, 25)
server.login(self.from_addr, self.password)
server.sendmail(self.from_addr, [to_addr], msg.as_string())
server.quit()
发送邮件实例:
这样,小工具就完成了,你也可以在上面扩展,加上其他功能,这样就更完善了。
3、代码实现
完整代码如下:
# coding:utf-8
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import requests
import smtplib
class PostWeatherEmail(object):
def __init__(self, to_address):
# 发件人地址
self.from_addr = '***********@163.com'
# 邮箱密码
self.password = '******'
self.SmtpServer = 'smtp.163.com'
# 收件人地址
self.to_address = ['[email protected]']
self.mail_text = ''
self. url = 'http://v.juhe.cn/historyWeather/weather?city_id=1&weather_' \
'date=2019-11-01&key=59d5c0a48f07f6a6e333dcb86aef55fb'
def _format_addr(self, s):
"""
转化地址
:param s:
:return: 指定格式
"""
name, addr = parseaddr(s)
self.url
return formataddr((Header(name, 'utf-8').encode(), addr))
def get_weather(self):
"""
根据api获取天气信息
:return: 天气信息文本
"""
weather_json = requests.get(self.url).json()
city_id = weather_json['result']['city_id']
day_temp = weather_json['result']['day_temp']
day_weather = weather_json['result']['day_weather']
city_name = weather_json['result']['city_name']
weather_date = weather_json['result']['weather_date']
return city_name, day_temp, day_weather, weather_date, city_id
def send_mail(self):
# 设置邮件信息
city_name, day_temp, day_weather, weather_date, city_id = self.get_weather()
print(city_name)
weather = "城市:{}\n温度:{}\n天气状况:{}\n天气日期:{}\n城市代码:{}"\
.format(city_name, day_temp, day_weather, weather_date, city_id)
print(weather)
msg = MIMEText(weather, 'plain', 'utf-8')
msg['Subject'] = Header('天气状态', 'utf-8').encode()
msg['From'] = self._format_addr('中国气象网 <%s>' % self.from_addr)
for to_addr in to_address:
msg['To'] = self._format_addr('天气状态 <%s>' % to_addr)
# 发送邮件
server = smtplib.SMTP(self.SmtpServer, 25)
server.login(self.from_addr, self.password)
server.sendmail(self.from_addr, [to_addr], msg.as_string())
server.quit()
if __name__ == '__main__':
try:
to_address = ['********[email protected]']
send_mail = PostWeatherEmail(to_address)
send_mail.send_mail()
except Exception as e:
print(e)