python 发送邮件
在一个web项目中,邮件也经常扮演者重要的角色,那么使用代码发送邮件也成为了我们必须得会的一个技能。下面我们就来看一下如何使用python发送邮件。
演示环境
- 操作系统:windows10
- python版本:python 3.7
- 代码编辑器:pycharm 2018.2
- 使用模块:email, smtplib
- tips: 这些模块不用我们安装,是python自带的模块
注意: 以下所有例子都是在QQ邮箱上实现的。
准备工作
首先我们先去QQ邮箱得到授权码,在qq邮箱的 设置->账户 中找到下图位置。
点击开启,然后按照操作提示进行下去,我们就会得到一个授权码。
然后我们需要知道QQ邮箱的服务器地址,下图是qq邮件服务器信息
POP3服务器是接收邮件的服务器地址,SMTP服务器是发送邮件的服务器地址,我们需要使用的就是SMTP服务器地址,也就是smtp.qq.com
发送一封简单的邮件(纯文本邮件)
首先我们构建一个消息对象,里面存放我们需要发送的信息。
1
2
3
4
5 1from email.mime.text import MIMEText
2
3msg = MIMEText('hello, send by python...', 'plain', 'utf-8')
4
5
MIMEText参数说明:
- _text: 发送的文本
- _subtype: 发送的邮件类型,默认就是plain,最终的MIME就是text/plain
- _charset: 制定编码格式,默认是us-ascii
需要发送的消息对象构造好了,接下来我们就可以发送我们的邮件了。
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 1from email.mime.text import MIMEText
2import smtplib
3
4# 发送邮箱的账号
5account = '<发件人的QQ>@qq.com'
6# 授权码,修改为发件人的授权码
7auth_code = 'istvzeerhoyefehc'
8
9# 接收人的邮箱
10msg_to = '<接收人的QQ>@qq.com'
11
12def simple_email():
13 # 消息对象
14 msg = MIMEText('hello, send by python...', 'plain', 'utf-8')
15
16 # 首先创建一个SMTP对象,后面所有的操作都是基于这个对象
17 server = smtplib.SMTP('smtp.qq.com', 25)
18 # 登录邮箱
19 server.login(account,auth_code)
20 # 发送邮件
21 server.sendmail(account,[msg_to],msg.as_string())
22 # 关闭连接
23 server.quit()
24
25
-
smtplib.SMTP:
-
host: 邮箱服务器地址
- port: 邮箱服务器端口,smtp的默认端口就是25,所以我们这里写25就可以了。
-
smtplib.SMTP.login:
-
user: 发送人的邮箱账号
- password: 发送人的邮箱授权码,注意,这里的password不是邮箱的密码,而是授权码。
-
smtplib.SMTP.sendmail:
-
from_addr: 发送人邮箱账号
- to_addrs: 接收人邮箱账号,因为可以是多个,这里使用一个列表来存放
- msg: 发送的消息
上面,我们就发送看一封简单的邮件了,没有主题,没有附件,也不是富文本。
发送带主题的邮件
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 1from email.mime.text import MIMEText
2import smtplib
3
4# 发送邮箱的账号
5account = '<发件人的QQ>@qq.com'
6# 授权码,修改为发件人的授权码
7auth_code = 'istvzeerhoyefehc'
8
9# 接收人的邮箱
10msg_to = '<接收人的QQ>@qq.com'
11
12def has_subject_email():
13 msg = MIMEText('hello, send by python...', 'plain', 'utf-8')
14 # 主题
15 msg['Subject'] = 'python 发送邮件'
16 # 发件人
17 msg['From'] = '发件人'
18 # 收件人
19 msg['To'] = '收件人'
20
21 server = smtplib.SMTP('smtp.qq.com', 25)
22 server.login(account, auth_code)
23 server.sendmail(account, [msg_to], msg.as_string())
24 server.quit()
25
26
我们可以看到,我们在msg中添加了几个属性,给邮件设置了主题,发件人,收件人等。(我们上面发送第一封简单的邮件的时候,是没有发件人的,只有代发送人,也没有接收人。)这也就说明邮件主题,发件人,收件人等信息并不是通过SMTP协议发出去的,而是包含在MIMEText的文本中,所以,我们必须把这些参数添加到MIMEText中,才是一封完整的邮件。
带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
31
32
33
34 1from email.mime.text import MIMEText
2import smtplib
3
4# 发送邮箱的账号
5account = '<发件人的QQ>@qq.com'
6# 授权码,修改为发件人的授权码
7auth_code = 'istvzeerhoyefehc'
8
9# 接收人的邮箱
10msg_to = '<接收人的QQ>@qq.com'
11def has_html_email():
12 text = '''
13 <html>
14 <body>
15 <h1>
16 <a href="http://ww.baidu.com">hello world</a>
17 </h1>
18 </body>
19 </html>
20 '''
21 msg = MIMEText(text, 'html', 'utf-8')
22 # 主题
23 msg['Subject'] = 'python 发送html邮件'
24 # 发件人
25 msg['From'] = account
26 # 收件人
27 msg['To'] = msg_to
28
29 server = smtplib.SMTP('smtp.qq.com', 25)
30 server.login(account, auth_code)
31 server.sendmail(account, [msg_to], msg.as_string())
32 server.quit()
33
34
想要发送带html文本的邮件,我们只需要将MIMEText的第二个参数改为html就可以了。
带附件的邮件
带附件的邮件我们可以看成包含若干部分的邮件,所以,我么可以构造一个MIMEMultipart对象代表邮件本省,然后往里面添加MIMEText作为邮件正文,再继续往里面添加表示附件的对象就可以了。
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 1from email.mime.text import MIMEText
2from email.mime.multipart import MIMEMultipart
3import smtplib
4
5# 发送邮箱的账号
6account = '<发件人的QQ>@qq.com'
7# 授权码,修改为发件人的授权码
8auth_code = 'istvzeerhoyefehc'
9
10# 接收人的邮箱
11msg_to = '<接收人的QQ>@qq.com'
12
13def has_attachment_email():
14 # 构造邮件对象
15 msg = MIMEMultipart()
16
17 msg['From'] = account
18 msg['To'] = msg_to
19 msg['Subject'] = 'python 发送带附件的邮件'
20
21 # 构造邮件正文
22 text = MIMEText('请查看附件!!!', 'plain', 'utf-8')
23
24 # 构造附件
25 with open('attachments/test.txt', 'rb') as fp:
26 file = MIMEText(fp.read(), 'base64', 'utf-8')
27
28 # 将附件重命名
29 file.add_header('Content-Disposition','attachment',filename='test.txt')
30
31 # 添加附件到邮件中
32 msg.attach(file)
33 # 添加邮件正文到邮件中
34 msg.attach(text)
35
36 server = smtplib.SMTP('smtp.qq.com', 25)
37 server.login(account, auth_code)
38 server.sendmail(account, [msg_to], msg.as_string())
39 server.quit()
40
41
将附件显示在邮件正文中
上面我们使用邮件发送了一个txt文件,如果我们换成图片文件,也是可以的。那么我们如果想让这张图片显示在邮件正文中,我们应该怎样写呢?直接写图片的url地址可以吗?答案当然是不可以的,因为我们不知道url地址是否安全,所以我们不能这样显示,得换另外一种方法。设置附件的id。
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 1from email.mime.text import MIMEText
2from email.mime.multipart import MIMEMultipart
3import smtplib
4
5# 发送邮箱的账号
6account = '<发件人的QQ>@qq.com'
7# 授权码,修改为发件人的授权码
8auth_code = 'istvzeerhoyefehc'
9
10# 接收人的邮箱
11msg_to = '<接收人的QQ>@qq.com'
12
13def show_image_in_text():
14 msg = MIMEMultipart()
15
16 msg['From'] = account
17 msg['To'] = msg_to
18 msg['Subject'] = 'python 显示图片在邮件正文中'
19
20 # 构造邮件正文
21 html_text = '''
22 <html>
23 <body>
24 <h1>
25 下面是我发给你的图片
26 </h1>
27 <!-- cid后面就是设置的附件的id -->
28 <p><img src="cid:0"></p>
29 </body>
30 </html>
31 '''
32 text = MIMEText(html_text, 'html', 'utf-8')
33
34 # 构造附件
35 with open('attachments/image.jpg', 'rb') as fp:
36 file = MIMEText(fp.read(), 'base64', 'utf-8')
37
38 # 将附件重命名
39 file.add_header('Content-Disposition', 'attachment', filename='image.jpg')
40 # 设置附件id
41 file.add_header('Content-ID','<0>')
42
43 # 添加附件到邮件中
44 msg.attach(file)
45
46 # 添加邮件正文到邮件中
47 msg.attach(text)
48
49 server = smtplib.SMTP('smtp.qq.com', 25)
50 server.login(account, auth_code)
51 server.sendmail(account, [msg_to], msg.as_string())
52 server.quit()
53
54
使用MIMEImage类发送图片附件
我们也可以使用MIMEImage类来发送图片。
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 1from email.mime.text import MIMEText
2from email.mime.multipart import MIMEMultipart
3from email.mime.image import MIMEImage
4import smtplib
5
6# 发送邮箱的账号
7account = '<发件人的QQ>@qq.com'
8# 授权码,修改为发件人的授权码
9auth_code = 'istvzeerhoyefehc'
10
11# 接收人的邮箱
12msg_to = '<接收人的QQ>@qq.com'
13
14def use_MIMEImage_send_image():
15 msg = MIMEMultipart()
16
17 msg['From'] = account
18 msg['To'] = msg_to
19 msg['Subject'] = 'python 使用MIMEImage发送图片附件'
20
21 # 构造邮件正文
22 html_text = '''
23 <html>
24 <body>
25 <h1>
26 下面是我发给你的图片
27 </h1>
28 <p><img src="cid:image1"></p>
29 </body>
30 </html>
31 '''
32 text = MIMEText(html_text, 'html', 'utf-8')
33
34 # 构造附件
35 with open('attachments/image.jpg', 'rb') as fp:
36 image = MIMEImage(fp.read())
37
38 image['Content-Type'] = 'application/octet-stream'
39
40 # 将附件重命名
41 image.add_header('Content-Disposition', 'attachment', filename='image.jpg')
42 # 设置附件id
43 image.add_header('Content-ID', '<image1>')
44
45 # 添加附件到邮件中
46 msg.attach(image)
47
48 # 添加邮件正文到邮件中
49 msg.attach(text)
50
51 server = smtplib.SMTP('smtp.qq.com', 25)
52 server.login(account, auth_code)
53 server.sendmail(account, [msg_to], msg.as_string())
54 server.quit()
55
56