0X00
感觉在项目中有蛮多地方可以用到邮件自动发送,于是去学了一下python怎样自动发送邮件。
0X01 准备
想要发送邮件的话得开通自己邮箱的 SMTP 功能,以QQ邮箱为例,进入上方的设置。
选择账户
打开SMTP服务,然后会得到一个QQ邮箱授权码,在代码中会用到。
用到的库有smtplib、email。
smtplib用于发送邮件,email用于构建邮件内容。
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header
from email.mime.application import MIMEApplication
0X02 发送简单邮件
首先设置我们的发件邮箱from_addr ,以及邮箱授权码password(有的邮箱是邮箱密码),然后还有收信方邮箱to_addr,发信服务器smtp_server。
# 发信方的信息:发信邮箱,QQ 邮箱授权码
from_addr = 'xxx@qq.com'
password = 'xxx'
# 收信方邮箱
to_addr = 'xxx@qq.com'
# 发信服务器
smtp_server = 'smtp.qq.com'
然后使用MIMEText来设置我们的正文内容,第一个参数为内容,第二个参数为格式(plain 为纯文本),第三个参数为编码。
msg = MIMEText('send by python,中文', 'plain', 'utf-8')
接着来设置我们的邮件头信息,将之前设置好的信息放入
msg['From'] = Header(from_addr)
msg['To'] = Header(to_addr)
msg['Subject'] = Header('python test')
最后发送邮件
# 开启发信服务,这里使用的是加密传输
server = smtplib.SMTP_SSL(smtp_server)
server.connect(smtp_server, 465)
# 登录发信邮箱
server.login(from_addr, password)
# 发送邮件
server.sendmail(from_addr, to_addr, m.as_string())
# 关闭服务器
server.quit()
0X03 发送附件
发送附件的话就在之前邮件的基础上加一点东西。
使用MIMEMultipart来标示这个邮件是多个部分组成的,然后attach各个部分。如果是附件,则add_header加入附件的声明。
MIME有很多种类型,附件是不同的类型要用不同的MIME类型。
数据类型 | MIME类型 |
普通文本 .txt | text/plain |
超文本标记语言文本 .html | text/html |
RTF文本 .rtf | application/rtf |
GIF图形 .gif | image/gif |
JPEG图形 .ipeg,.jpg | image/jpeg |
au声音文件.au | audio/basic |
MIDI音乐文件 mid,.midi audio/midi, | audio/x-midi |
RealAudio音乐文件 .ra, .ram | audio/x-pn-realaudio |
MPEG文件 .mpg,.mpeg | video/mpeg |
AVI文件 .avi | video/x-msvideo |
GZIP文件 .gz | application/x-gzip |
TAR文件 .tar | application/x-tar |
最简单直接的方法就是,不管什么类型的附件,都用MIMEApplication,MIMEApplication默认子类型是application/octet-stream。
pdfFile = 'test.pdf'
pdfApart = MIMEApplication(open(pdfFile, 'rb').read())
pdfApart.add_header('Content-Disposition', 'attachment', filename=pdfFile)
然后设置我们的邮件内容
msg_file = MIMEMultipart()
msg_file['From'] = Header(from_addr)
msg_file['To'] = Header(to_addr)
# 邮箱正文内容,第一个参数为内容,第二个参数为格式(plain 为纯文本),第三个参数为编码
msg = MIMEText('send by python,中文', 'plain', 'utf-8')
msg_file.attach(msg)
msg_file.attach(pdfApart)
msg_file['Subject'] = 'title'
发送邮件。
# 开启发信服务,这里使用的是加密传输
server = smtplib.SMTP_SSL(smtp_server)
server.connect(smtp_server, 465)
# 登录发信邮箱
server.login(from_addr, password)
# 发送邮件
server.sendmail(from_addr, to_addr, msg_file.as_string())
# 关闭服务器
server.quit()
总代码:
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header
from email.mime.application import MIMEApplication
if __name__ == '__main__':
from_addr = 'xxx@qq.com'
password = 'xxx'
to_addr = 'xxx@qq.com'
smtp_server = 'smtp.qq.com'
pdfFile = 'test.pdf'
pdfApart = MIMEApplication(open(pdfFile, 'rb').read())
pdfApart.add_header('Content-Disposition', 'attachment', filename=pdfFile)
msg_file = MIMEMultipart()
msg_file['From'] = Header(from_addr)
msg_file['To'] = Header(to_addr)
msg = MIMEText('send by python,中文', 'plain', 'utf-8')
msg_file.attach(msg)
msg_file.attach(pdfApart)
msg_file['Subject'] = 'title'
server = smtplib.SMTP_SSL(smtp_server)
server.connect(smtp_server, 465)
server.login(from_addr, password)
server.sendmail(from_addr, to_addr, msg_file.as_string())
server.quit()
0X04 成果展示
成果展示