使用python将信息发送到QQ邮箱
我们在写爬虫的时候,爬取的信息很多都是每天在变化的,但是要是每天都打开爬虫爬那么一次,就会显得非常不优雅。这个时候我们就可以利用python的email库(书写邮件)或itchat(链接微信库)还有smtplib(简单邮件传输协议库)然后部署到服务器上来,实现程序自动化
- 在写代码之前,首先要有一些准备条件,那就是在qq邮箱中打开smtp服务,我用的是QQ邮箱,在设置/账户选项中找到这个字段
打开POP3/SMTP服务,然后我们就可以在第三方发送接收邮件了 - 然后我们开始写一个最简单的代码,先实现发送文本邮件这个功能
import smtplib
from email.mime.text import MIMEText
#QQ邮箱提供的SMTP服务器
mail_host = 'smtp.qq.com'
#服务器端口
port = 465
send_by = 'ayang818@qq.com'
password = '开启SMTP服务后,QQ邮箱自动生成的16位密码'
send_to = 'ayang818@qq.com'
def send_email(title,content,):
#创建了MIMEText类,相当于在写邮件内容,是plain类型
message = MIMEText(content,'plain','utf-8')
message["From"] = send_by
message['To'] = send_to
message['Subject'] = title
try:
#注意第三个参数,设置了转码的格式(我不设的时候会报解码错误)
smpt = smtplib.SMTP_SSL(mail_host, port, 'utf-8')
smpt.login(send_by,password)
smpt.sendmail(send_by, send_to,message.as_string())
print("发送成功")
except:
print("发送失败")
title = '测试文件'
content = '执行自动化单元测试'
send_email(title,content)
上面的代码是定义了一个send_email函数,并定义了MIMEtext的实例的From,To,Subject三个字段的属性,分别是,发送邮件人邮箱号,接收者邮箱号,标题,然后创建了使用smtplib的SMTP_SSl函数,创建了一个smpt_ssl对象,然后调用类方法login登陆,最后使用sendemail方法发送邮件(携带发送者,接收者,内容三个参数),测试一下。发现可以使用。
- 邮件单单只有文本肯定还不够,我们可能需要携带一些附件或者说传输非文本数据(HTML),这个时候我们单单用到MIMEText类就不够了,这个时候我们需要使用其他两个类,一个是MIMEBase,另一个是MIMEMultipart,这三个类的关系是MIMEBase是由基类message.Message继承而来,MIMEMultipart又是继承MIMEBase类,MIMEText又是继承MIMEMultipart类,这三个类的作用可以这么理解,MIMEMultipart相当于是一个容器,他可以使用attach方法加入其他对象,然后MIMEBase类可以理解为携带附件内容的类,代码如下
import smtplib
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
mail_host = 'smtp.qq.com'
port = 465
send_by = 'ayang818@qq.com'
password = '开启SMTP服务后,QQ邮箱自动生成的16位密码'
send_to = 'ayang818@qq.com'
def send_email(title,content,fileaddress):
message = MIMEMultipart()
message["From"] = send_by
message['To'] = send_to
message['Subject'] = title
message.attach(MIMEText(content,'plain','utf-8'))
#下面是发送附件类
try:
with open(fileaddress,'r',encoding = 'utf-8') as f:
mime = MIMEBase('text','txt',filename = fileaddress)
mime.add_header('Content-Disposition','321',filename = fileaddress)
mime.set_payload(f.read())
message.attach(mime)
except:
pass
# print(message)
try:
#要注意位置参数和关键字参数啊啊
smpt = smtplib.SMTP_SSL(mail_host, port, 'utf-8')
smpt.login(send_by,password)
smpt.sendmail(send_by, send_to,message.as_string(),)
# print(message.as_string)
smpt.quit()
print("发送成功")
except:
print("发送失败")
if __name__ == "__main__":
title = '附件文件测试'
content = '三体'
# title:标题 , context:正文 ,第三个参数选填
send_email(title, content, "D:/三体.txt")