发送邮件
from email.mime.text import MIMEText
message = MIMEText('Gitchat is funny!', 'plain', 'utf-8')
首先我们导入 email 模块,该模块用来构造我们需要传输的邮件信息。从 email 模块中导入 MIMEText 对象。MIMEText 一共有三个参数:第一个参数为“邮件正文”;第二个参数指定“文本类型”,这里我们指定的是 plain,即文本信息;第三个参数为“正文编码”,即指定我们邮件正文的编码,防止因为编码错误而导致邮件正文乱码的情况出现。
# 导入smtplib模块,用来发送邮件
import smtplib
user_mail = '你本人的邮箱地址'
password = '你的邮箱授权码' # 注意不是登录密码是授权密码
send_mail = '收件人的邮箱地址'
smtp_server = '你所在邮箱的smtp服务器地址'
server = smtplib.SMTP(smtp_server, 25) # smtp的端口号默认是25
server.set_debuglevel(1)
server.login(user_mail, password)
# 发送邮件到对方的邮箱
server.sendmail(user_mail, [send_mail], message.as_string())
# 结束服务
server.quit()
smtp服务器地址
执行上面的代码的时候出现503错误:是因为邮箱的登录密码不是真正的登录密码,而是应该输入授权密码(是用于登录第三方邮件客户端的专用密码),使用python发送邮件时相当于自定义客户端根据用户名和密码登录,然后使用SMTP服务发送邮件,QQ邮箱是默认不开启客户端授权的,因此登录总是被拒绝;解决办法:进入QQ邮箱-设置-客户端授权密码-开启(授权码是用于登录第三方邮件客户端的专用密码),非第三方登录密码不变。
生成授权码
解决上面的错误后,发送成功
发送成功
收到邮件
实战:某新闻网站重大新闻邮件通知小服务
前面说明了怎么样爬取网页信息,把收集到的信息存储在数据库中,和发送电子邮件通知;现在结合前面的三个部分,写一个小实战。
# 封装网络获取的信息
import requests
from bs4 import BeautifulSoup
import re
def getUrlCoding(data): # 解决网站的编码问题
charset = 'utf-8'
if data.encoding.lower() == 'utf-8' or data.encoding == 'utf8':
return 'utf-8'
if data.encoding.lower() == 'gb2312':
return 'gb2312'
if data.encoding.lower() == 'gbk':
return 'gbk'
if data.encoding.lower() == 'gb18030':
return 'GB18030'
m = re.compile('<meta .*(http-equiv="?Content-Type"?.*)?charset="?([a-zA-Z0-9_-]+)"?', re.I).search(data.text)
if m and m.lastindex == 2:
charset = m.group(2).lower()
return charset
def get_info(url):
response = requests.get(url)
if response.status_code == 200:
response.encoding = getUrlCoding(response)
soup = BeautifulSoup(response.text, 'lxml')
big_news = soup.select('#js_top_news > h2:nth-of-type(1) > a')[0].get_text()
url = soup.select('#js_top_news > h2:nth-of-type(1) > a')[0].get('href')
return "新闻标题:"+big_news+"\n新闻地址:"+url
上面爬取网页信息之后,需要发送邮件去通知;现在配置邮件通知服务:
# 发送邮件至对应的邮箱
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib
def _format_addr(s):
name, addr = parseaddr(s)
return formataddr((Header(name, 'utf-8').encode(), addr))
def send_mail(text):
from_addr = '你的邮箱地址'
password = '邮箱授权密码,不是登录密码'
to_addr = '收件人的邮箱地址'
smtp_server ='你邮箱的smtp服务器地址'
msg = MIMEText(text, 'plain', 'utf-8')
msg['From'] = _format_addr('XX大新闻 <%s>' % from_addr)
msg['To'] = _format_addr('收件人 <%s>' % to_addr)
msg['Subject'] = Header('XX新闻提醒', 'utf-8').encode()
server = smtplib.SMTP(smtp_server, 25)
server.set_debuglevel(1)
server.login(from_addr, password)
server.sendmail(from_addr, [to_addr], msg.as_string())
server.quit()
服务运行入口:
if __name__ == '__main__':
crawl_url = "https://news.163.com/"
content = get_info(crawl_url)
send_mail(content)
在主函数中,首先我们指定了待爬取页面的 URL,然后将该 URL 传送至 get_info 函数中,获取到网页对应的新闻内容,然后将新闻内容传送到 send_mail 函数中,发送至对应的邮箱;运行的效果:
image.png
短信通知
- 使用 API 接口发送短信
常见的 API 接口文档一般分为两种:一种是基于 Token 验证的 API 接口;一种是直接提供 SDK。 - 基于 Token 验证的 API 接口
基于 Token 验证的 API 接口目前广泛应用于各个服务提供商提供的服务中,比如我们经常使用的百度地图 AP接口:
http://api.map.baidu.com/geocoder/v2/?address=北京市海淀区上地十街10号&output=json&ak=您的ak&callback=showLocation //GET请求
在上述的 API 地址中,ak 就是我们用来验证用户信息的 Token。系统在后台为每个用户的不同应用都提供了一个独一无二的 ak 字符串。只有用户提供了正确的 ak 字符串,系统才会返回正确的结果。
- SDK 方式的 API 接口
使用 Token 验证的方法提供 API 接口,的确大大方便了开发者的开发过程,但是也随之带来了很多的问题,比如编码错误、请求的文字太多系统无法处理等等。
这个时候,各大厂商便提供了第二种方法:使用厂商提供的 SDK 进行短信发送。目前比较常见的短信服务提供商,例如阿里巴巴、腾讯、百度等,大都推出各自的短息 SDK,向开发者提供短信发送服务。
天气预报的短信通知服务小实战
- 申请天气预报 API 接口
首先登陆百度开放平台首页,进入控制台。第一次进入控制台时会要求进行验证,大家直接输入相应的信息即可。然后点击“创建新应用”,输入应用名称这里我们称它为“天气预报”,下面不要做改动,直接点击确认即可。
返回控制台页面,我们可以看到“天气预报”所对应的 ak 值。
百度的天气预报 API 请求接口为:http://api.map.baidu.com/telematics/v3/weather?location=点&output=json&ak=你的ak值
这里我们选择城市为杭州,输入上面的 ak 值,使用浏览器访问,得到的返回结果如下:
{"error":0,"status":"success","date":"2018-06-28","results":[{"currentCity":"杭州","pm25":"42","index":[{"des":"天气炎热,建议着短衫、短裙、短裤、薄型T恤衫等清凉夏季服装。","zs":"炎热","tipt":"穿衣指数","title":"穿衣"},{"des":"较适宜洗车,未来一天无雨,风力较小,擦洗一新的汽车至少能保持一天。","zs":"较适宜","tipt":"洗车指数","title":"洗车"},{"des":"各项气象条件适宜,发生感冒机率较低。但请避免长期处于空调房间中,以防感冒。","zs":"少发","tipt":"感冒指数","title":"感冒"},{"des":"天气较好,但风力较强,在户外要选择合适的运动,另外考虑到天气炎热,建议停止高强度运动。","zs":"较不宜","tipt":"运动指数","title":"运动"},{"des":"属中等强度紫外线辐射天气,外出时建议涂擦SPF高于15、PA+的防晒护肤品,戴帽子、太阳镜。","zs":"中等","tipt":"紫外线强度指数","title":"紫外线强度"}],"weather_data":[{"date":"周四 06月28日 (实时:30℃)"}]}]}
网友评论