0X00

感觉在项目中有蛮多地方可以用到邮件自动发送,于是去学了一下python怎样自动发送邮件。

0X01 准备

想要发送邮件的话得开通自己邮箱的 SMTP 功能,以QQ邮箱为例,进入上方的设置。

选择账户

python发邮件正文包含图片 python发送邮件附件_webmail

打开SMTP服务,然后会得到一个QQ邮箱授权码,在代码中会用到。

python发邮件正文包含图片 python发送邮件附件_python发邮件正文包含图片_02

用到的库有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 成果展示

成果展示

python发邮件正文包含图片 python发送邮件附件_webmail_03