Email邮件提醒
前言:今天在看书的时候,发现一个挺有趣的玩意,就是用python写一个自动发送Email邮件的模块。那Email在Python爬虫开发中有什么作用呢?主要起到提醒作用,当爬虫在运行过程中遇到异常或者服务器遇到问题,可以通过Email及时向自己报告。
代码中涉及的邮箱授权密码,QQ跟网易的获取方式如下:
1.QQ邮箱授权密码获取方式:
2.网易邮箱授权密码获取方式:
3.完整代码
直接拷贝下来,分别注释代码去查看效果,相应的代码,也写上了注释,就不一一提出来作说明了。
# -*- coding: UTF-8 -*-
"""
@author:林健
@file:Email_Alert.py
@time:2020/10/25
"""
import time
from email.mime.multipart import MIMEMultipart # 打包多个部分的邮件内容(正文、附件、图片...)
from email.mime.text import MIMEText # 邮件的正文内容
from email.mime.application import MIMEApplication # 用来发送附件
from email.mime.image import MIMEImage # 用来发送图片
import smtplib # 发送邮件
from email.utils import parseaddr, formataddr
from email.header import Header
class EmailAlert(object):
def __init__(self):
"""连接smtp服务器"""
# 1.邮箱服务地址
smtp_server = 'smtp.qq.com' # 网易邮箱服务地址:smtp.163.com;QQ邮箱服务地址:smtp.qq.com
# 2.实例化smtplib模块中的SMTP对象
self.server = smtplib.SMTP()
# 3.连接服务器,需要2个参数[邮箱服务地址、SMTP端口号]
self.server.connect(smtp_server, 25)
"""登录邮箱"""
# 1.发件人地址
self.from_addr = '2445301989@qq.com'
# 2.邮箱授权密码 【注意】该密码不是你邮箱的登录密码
password = 'xxxxxxxxxxxxxxxx' # 替换成自己的邮箱授权密码
# 3.登录邮箱
self.server.login(self.from_addr, password)
# 当前时间(看是实际开发需求)
self.time1 = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))
def _format_addr(self, s):
name, addr = parseaddr(s)
# 如果包含中文,需要通过Header对象进行编码。
return formataddr((Header(name, 'utf-8').encode(), addr))
def Mail_Notice(self):
"""'编辑发送信息"""
# 1.收件人/抄送人地址
# 如果要发给多人,格式为['***@qq.com','***@163.com','***@qq.com']
to_addrs = ['896263973@qq.com', '2916812162@qq.com'] # 收件人地址
cc_addrs = ['2097182629@qq.com'] # 抄送人地址
# 2.构造一个邮件对象
msg = MIMEMultipart()
subject = '租房一号爬虫运行状态'
msg['Subject'] = Header(subject, 'utf-8').encode() # 邮件主题
msg['From'] = self._format_addr('租房一号爬虫<%s>' % self.from_addr) # 发件人名称
msg['To'] = ','.join(to_addrs) # 收件人
msg['Cc'] = ','.join(cc_addrs) # 抄送人
# 3.1.1如果是纯文本邮件 构造MIMEText对象,需要3个参数[邮件正文、MIME的subtype,传入'plain'表示纯文本,最终的MIME就是'text/plain'、编码格式]
# 其中,'_subtype'值默认为'palin'
# text_str = f'Python爬虫运行异常,异常信息为遇到HTTP 403...{time1}'
# content = MIMEText(text_str, 'plain', 'utf-8') # 正文内容
# 3.1.2有时候我们发送的可能不是纯文本,需要发送HTML邮件,将异常网页信息发送回去。在构造MIMEText对象时,把HTML字符串传进去,再把第二个参数由“plain" 变为“html”
html_str = f'<h5>Python爬虫运行异常,异常信息为遇到HTTP 403...{self.time1}</h5><p>send by <a href="http://www.python.org"><img src="cid:img1" width="400px"></a></p>'
content = MIMEText(html_str, 'html', 'utf-8')
# 4.添加到 MIMEMultipart
msg.attach(content)
# 3.2如果在HTML邮件中,想添加图片
file_path = 'C:\\Users\\admin\\Pictures\\Camera Roll\\背景图片\\其他\\wallhaven-j5mj3w.png' # 你本地图片的路径
img = MIMEImage(open(file_path, 'rb').read()) # 打开读取图片
img.add_header('Content-ID', 'img1') # 给图片一个ID值 需要跟上面html_str = '...img src="cid:img1">...'中的cid值对应
msg.attach(img)
# 3.3在邮件中添加附件(xlsx、docx、pdf、MP3、MP4...)
file_path = 'C:\\Users\\admin\\Desktop\\租房信息.xlsx' # 本地路径
app = MIMEApplication(open(file_path, 'rb').read())
app.add_header('content-disposition', 'attachment', filename='租房信息.xlsx')
msg.attach(app)
"""发送邮件"""
try:
# 方法中介绍需要传入msg, from_addr=None, to_addrs=None,mail_options=[], rcpt_options={}
# 为什么这里只传入一个msg呢,因为在方法下面还介绍了,如果没有传入会自动去msg中找这些参数
self.server.send_message(msg) # 发送邮件
print('邮件发送 ...OK')
except Exception as e:
print(f'邮件发送 ...fail\n原因如下:{e}')
"""退出邮箱"""
self.server.quit()
if __name__ == '__main__':
email_alert = EmailAlert()
email_alert.Mail_Notice()
新手上路,代码写得不好,如果有理解错误的或者不理解的,欢迎在评论区中,指出来,非常感谢!
以上就是Email邮件提醒的所有内容了,点赞收藏加评论是最大的支持哦!
📑编写不易,转载请注明出处,如有侵权,请联系我!