人生苦短,我用python。

一、email模块

SMTP是发送邮件的协议,Python对SMTP支持有email和smtplib两个模块,email负责构造邮件,smtplib负责发送邮件。

  • email.header.Header(s=None, charset=None, maxlinelen=None, header_name=None, continuation_ws=' ', errors='strict'):邮件头

    • s:标头的值,也就是对应From、To、Subject的值。
    • charset:字符集格式,默认是ASCII,但是一般指定UTF-8格式以兼容更多字符。
    • header_name: 标头名,就是From、To、Subject、Time等;
  • email.mime.base.MIMEBase(_maintype, _subtype, **_params):这是MIME的一个基类。一般不需要在使用时创建实例。

    • _maintype:是内容类型,如text或者image。
    • _subtype:是内容的minor type类型,如plain或者gif。
    • **_params:是一个字典,直接传递给Message.add_header()。
  • email.mime.multipart.MIMEMultipart([_subtype[, boundary[, _subparts[, _params]]]]:MIMEBase的一个子类,多个MIME对象的集合。

    • _subtype:默认值为mixed。
    • boundary:是MIMEMultipart的边界,默认边界是可数的。
  • email.mime.APPLICATION.MIMEApplication(_data[, _subtype[, _encoder[, **_params]]]):MIMEMultipart的一个子类。

  • email.mime.audio. MIMEAudio(_audiodata[, _subtype[, _encoder[, **_params]]]):MIME音频对象。

  • email.mime.image.MIMEImage(_imagedata[, _subtype[, _encoder[, **_params]]]):MIME二进制文件对象。

  • email.mime.text.MIMEText(_text[,_subtype[,_charset]]):MIME文本对象。

    • _text:是邮件内容,
    • _subtype:邮件类型,可以是text/plain(普通文本邮件),html/plain(html邮件)。
    • charset:编码,可以是gb2312等等。
  • email.mime.message.MIMEMessage(_msg[, _subtype]):具体的一个message实例。

    • msg=mail.Message.Message() # 一个实例
    • msg['from']='me@xxx.com' # 自己的邮件地址
    • msg['to']='friend@xxx.com' # 发送到哪里
    • msg['date']='2012-3-16' # 时间日期
    • msg['subject']='helloworld' # 邮件主题

二、smtplib模块

SMTP是发送邮件的协议,Python对SMTP支持有email和smtplib两个模块,email负责构造邮件,smtplib负责发送邮件。

  • smtplib.SMTP([host[, port[, local_hostname[, timeout]]]]):SMTP类构造函数,表示与SMTP服务器之间的连接,通过这个连接可以向smtp服务器发送指令,执行相关操作(如:登陆、发送邮件)。所有参数都是可选的。

    • host:smtp服务器主机名
    • port:smtp服务的端口,默认是25;如果在创建SMTP对象的时候提供了这两个参数,在初始化的时候会自动调用connect方法去连接服务器。
  • smtplib.SMTP提供的方法:

    • SMTP.set_debuglevel(level):设置是否为调试模式。默认为False,即非调试模式,表示不输出任何调试信息。
    • SMTP.connect([host[, port]]):连接到指定的smtp服务器。参数分别表示smpt主机和端口。注意: 也可以在host参数中指定端口号(如:smpt.yeah.net:25),这样就没必要给出port参数。
    • SMTP.docmd(cmd[, argstring]):向smtp服务器发送指令。可选参数argstring表示指令的参数。
    • SMTP.helo([hostname]):使用”helo”指令向服务器确认身份。相当于告诉smtp服务器“我是谁”。
    • SMTP.has_extn(name):判断指定名称在服务器邮件列表中是否存在。出于安全考虑,smtp服务器往往屏蔽了该指令。
    • SMTP.verify(address):判断指定邮件地址是否在服务器中存在。出于安全考虑,smtp服务器往往屏蔽了该指令。
    • SMTP.login(user, password):登陆到smtp服务器。现在几乎所有的smtp服务器,都必须在验证用户信息合法之后才允许发送邮件。
    • SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]):发送邮件。这里要注意一下第三个参数,msg是字符串,表示邮件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意msg的格式。这个格式就是smtp协议中定义的格式。
    • SMTP.quit():断开与smtp服务器的连接,相当于发送”quit”指令。(很多程序中都用到了smtp.close())

三、发送邮件

1、发送文本邮件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from email.header import Header
from email.mime.text import MIMEText
import smtplib

#一.构建邮件内容信息
message = MIMEText('邮件正文测试...此处省略一万字', 'plain', 'utf-8') #1.邮件正文,plain表示普通文本
message['Subject'] = Header('邮件标题测试', 'utf-8') #2.邮件标题,中文用Header编码
message['From'] = Header('发件人的名称测试', 'utf-8') #3.发件人名称
message['To'] = Header('收件人名称测试', 'utf-8') #4.收件人名称

#二.定义邮件服务器信息
mail_host = 'smpt.xxx.com' #1.邮件服务器
mail_user = 'username' #2.登录服务器的用户名
mail_pass = 'password' #3.登录服务器的密码

#三.定义发件人和收件人
sender = 'me@163.com' #1.发件人邮箱
receivers = ['friend@126.com'] #2.收件人邮箱,注意可以是列表

#四.邮件服务器发送邮件
smtp_server = smtplib.SMTP() #1.声明邮件服务器
smtp_server.connect(mail_host, 25) #2.连接服务器,端口25
smtp_server.login(mail_user, mail_pass) #3.登录服务器
smtp_server.sendmail(sender, receivers, message.as_string()) #4.服务器发送邮件
smtp_server.quit() #5.退出服务器

2、发送html邮件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from email.header import Header
from email.mime.text import MIMEText
import smtplib

#一.构建邮件内容信息
#定义html格式内容
msg_html = """
<p>邮件正文测试...此处省略一万字</p>
<p><a href="http://www.baidu.com">点击进入百度</a></p>
"""
message = MIMEText(msg_html, 'html', 'utf-8') #1.邮件正文,html表示html格式
message['Subject'] = Header('邮件标题测试', 'utf-8') #2.邮件标题,中文用Header编码
message['From'] = Header('发件人的名称测试', 'utf-8') #3.发件人名称
message['To'] = Header('收件人名称测试', 'utf-8') #4.收件人名称

#二.定义邮件服务器信息
mail_host = 'smpt.xxx.com' #1.邮件服务器
mail_user = 'username' #2.登录服务器的用户名
mail_pass = 'password' #3.登录服务器的密码

#三.定义发件人和收件人邮箱
sender = 'me@163.com' #1.发件人邮箱
receivers = ['friend@126.com'] #2.收件人邮箱,注意可以是列表

#四.邮件服务器发送邮件
smtp_server = smtplib.SMTP() #1.声明邮件服务器
smtp_server.connect(mail_host, 25) #2.连接服务器,端口25
smtp_server.login(mail_user, mail_pass) #3.登录服务器
smtp_server.sendmail(sender, receivers, message.as_string()) #4.服务器发送邮件
smtp_server.quit() #5.退出服务器

3、发送带附件邮件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from email.header import Header
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import smtplib

#一.构建带附件的实例
message = MIMEMultipart() #1.带附件实例
message['Subject'] = Header('邮件标题测试', 'utf-8') #2.邮件标题,中文用Header编码
message['From'] = Header('发件人的名称测试', 'utf-8') #3.发件人名称
message['To'] = Header('收件人名称测试', 'utf-8') #4.收件人名称

#二、增加邮件正文内容
message.attach(MIMEText('邮件正文测试...此处省略一万字', 'plain', 'utf-8')) #1.邮件正文,plain表示普通文本

#三、添加附件
with open('/Users/tester/Downloads/test.xlsx', 'rb') as xlsxpart: #1.用with打开,防止不能关闭文件
att = MIMEText(xlsxpart.read(), 'base64', 'utf-8') #2.定义附件
att.add_header('Content-Disposition', 'attachment', filename='test.xlsx') #3.添加必要的头信息
message.attach(att) #4.添加附件

#四.定义邮件服务器信息
mail_host = 'smpt.xxx.com' #1.邮件服务器
mail_user = 'username' #2.登录服务器的用户名
mail_pass = 'password' #3.登录服务器的密码

#五.定义发件人和收件人
sender = 'me@163.com' #1.发件人邮箱
receivers = ['friend@126.com'] #2.收件人邮箱,注意可以是列表

#六.邮件服务器发送邮件
smtp_server = smtplib.SMTP() #1.声明邮件服务器
smtp_server.connect(mail_host, 25) #2.连接服务器,端口25
smtp_server.login(mail_user, mail_pass) #3.登录服务器
smtp_server.sendmail(sender, receivers, message.as_string()) #4.服务器发送邮件
smtp_server.quit() #5.退出服务器

4、发送带图片邮件

按照发送附件的方式,先把邮件作为附件添加进去,然后,在HTML中通过引用src="cid:0"就可以把附件作为图片嵌入了。如果有多个图片,给它们依次编号,然后引用不同的cid:x即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
from email.header import Header
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
import smtplib

#一.构建带附件的实例
msgroot = MIMEMultipart('relate') #1.带附件实例,relate可以存储图片
msgroot['Subject'] = Header('邮件标题测试', 'utf-8') #2.邮件标题,中文用Header编码
msgroot['From'] = Header('发件人的名称测试', 'utf-8') #3.发件人名称
msgroot['To'] = Header('收件人名称测试', 'utf-8') #4.收件人名称

#二、构建超文本实例
msgAlternative = MIMEMultipart('alternative') #1.arternative邮件可以同时存在纯文本和超文本内容
msgRoot.attach(msgAlternative) #2.添加到附件实例

#三、超文本实例添加html内容
#html内容,图片cid定义image1
msg_html = """
<p>邮件正文测试...此处省略一万字</p>
<p>图片展示:</p>
<p><img src="cid:image1"></p>
"""
msgAlternative.attach(MIMEText(msg_html, 'html', 'utf-8')) #添加html内容到超文本实例

#四、附件实例添加邮件正文内容
msgRoot.attach(MIMEText('邮件正文测试...此处省略一万字', 'plain', 'utf-8')) #1.邮件正文,plain表示普通文本

#五、添加图片附件
with open('/Users/tester/Downloads/test.png', 'rb') as imagepart: #1.用with打开,防止不能关闭文件
att = MIMEImage(imagepart.read(), 'base64', 'utf-8') #2.定义附件
att.add_header('Content-Disposition', 'attachment', filename='test.png') #3.添加必要的头信息
att.add_header('Content-ID', '<image1>') #4.头信息添加图片cid
msgRoot.attach(att) #5.添加附件

#六.定义邮件服务器信息
mail_host = 'smpt.xxx.com' #1.邮件服务器
mail_user = 'username' #2.登录服务器的用户名
mail_pass = 'password' #3.登录服务器的密码

#七.定义发件人和收件人
sender = 'me@163.com' #1.发件人邮箱
receivers = ['friend@126.com'] #2.收件人邮箱,注意可以是列表

#八.邮件服务器发送邮件
smtp_server = smtplib.SMTP() #1.声明邮件服务器
smtp_server.connect(mail_host, 25) #2.连接服务器,端口25
smtp_server.login(mail_user, mail_pass) #3.登录服务器
smtp_server.sendmail(sender, receivers, msgRoot.as_string()) #4.服务器发送邮件
smtp_server.quit() #5.退出服务器

5、发送邮件全示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# email操作

import smtplib # email负责构造邮件,smtplib负责发送邮件
from email.mime.multipart import MIMEMultipart # 多个MIME对象的集合,可以添加附件
from email.mime.text import MIMEText # 文本对象
from email.mime.image import MIMEImage # 图片对象
from email.mime.audio import MIMEAudio # 音频对象
from email.utils import formatdate # 设置邮件时间

# 1、设置邮件服务器配置信息
mail_host = 'mail.btte.net' # 邮件服务器host
mail_port = 25 # 邮件服务器端口
mail_username = 'zhangguowei3@btte.net' # 登录服务器用户名
mail_password = 'gnor6jo3' # 登录服务器密码
sender = 'zhangguowei3@btte.net' # 发件人
receivers = ['zhangguowei3@btte.net','guoyaqian@btte.net'] # 收件人列表
cc_receivers = ['851745050@qq.com','313235294@qq.com'] # 抄送人列表

# 2、配置邮件主体信息
message = MIMEMultipart() # 定义一个MIMEMultipart实例,作为邮件主体处理正文及附件
message['Subject'] = '邮件标题测试' # 标题
message['From'] = sender # 发件人
message['To'] = ';'.join(receivers) # 收件人
message['Cc'] = ';'.join(cc_receivers) # 抄送人
message['Date'] = formatdate() # 邮件时间,可以不用加

# 3、邮件主体添加文本正文
content_part = MIMEText('邮件文本测试', 'plain', 'utf-8') # 定义文本内容实例
message.attach(content_part) # 邮件主体添加文本正文,不过会被后面的html正文覆盖,这里仅作示例

# 4、邮件主体添加html正文
html_content = """
<p>邮件html测试</p>
<p><a href="http://www.baidu.com">点击进入百度</a></p>
<p>邮件图片测试</p>
<p><img src="cid:image1"></p>
""" # 在HTML中通过引用src="cid:x"就可以把附件作为图片嵌入了
html_part = MIMEText(html_content, 'html', 'utf-8') # 定义html内容实例,推荐使用html正文内容,可以附加图片地址,调整格式等
message.attach(html_part) # 邮件主体添加html正文


# 5、邮件主体添加图片
with open(r'E:\邮件图片测试.jpg', 'rb') as fp:
image_part = MIMEImage(fp.read()) # 定义图片内容实例
image_part['Content-Type'] = 'application/octet-stream' # 设置内容类型为二进制流
#image_part['Content-Disposition'] = 'attachment; filename="邮件图片测试.jpg"' # 设置文件名称,直接设置会乱码或不显示,所以使用下面的方法
image_part.add_header('Content-Disposition', 'attachment', filename=('gbk', '', '邮件图片测试.jpg')) # 解决中文附件乱码或不显示问题
image_part.add_header('Content-ID', '<image1>') # 头信息添加图片cid,用于html正文显示
message.attach(image_part) # 邮件主体添加图片

# 6、邮件主体添加附件
with open(r'E:\邮件附件测试.txt', 'rb') as f:
file_part = MIMEText(f.read(), 'base64','utf-8') # 定义附件内容实例
file_part['Content-Type'] = 'application/octet-stream' # 设置内容类型为二进制流
#file_part['Content-Disposition'] = 'attachment; filename="邮件附件测试.txt"' # 设置文件名称,直接设置会乱码或不显示,所以使用下面的方法
file_part.add_header('Content-Disposition', 'attachment', filename=('gbk', '', '邮件附件测试.txt')) # 解决中文附件乱码或不显示问题
message.attach(file_part) # 邮件主体添加附件

# 7、发送邮件
smtp = smtplib.SMTP() # 定义服务器实例
smtp.connect(mail_host, mail_port) # 连接服务器
#smtp = smtplib.SMTP_SSL(mail_host) # 有的需要SSL认证
smtp.login(mail_username, mail_password) # 登录服务器
smtp.sendmail(sender, receivers+cc_receivers, message.as_string()) # 服务器发送邮件
smtp.quit() # 退出服务器

持续更新…

最后更新: 2018年12月04日 21:14

原始链接: http://pythonfood.github.io/2017/12/30/python发送邮件/

× 多少都行~
打赏二维码