python发送邮件

释放双眼,带上耳机,听听看~!

python 发送邮件

在一个web项目中,邮件也经常扮演者重要的角色,那么使用代码发送邮件也成为了我们必须得会的一个技能。下面我们就来看一下如何使用python发送邮件。

演示环境

  • 操作系统:windows10
  • python版本:python 3.7
  • 代码编辑器:pycharm 2018.2
  • 使用模块:email, smtplib
  • tips: 这些模块不用我们安装,是python自带的模块

注意: 以下所有例子都是在QQ邮箱上实现的。

准备工作

首先我们先去QQ邮箱得到授权码,在qq邮箱的 设置->账户 中找到下图位置。

python发送邮件

点击开启,然后按照操作提示进行下去,我们就会得到一个授权码。

python发送邮件

然后我们需要知道QQ邮箱的服务器地址,下图是qq邮件服务器信息

python发送邮件

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: 发送的消息

python发送邮件

上面,我们就发送看一封简单的邮件了,没有主题,没有附件,也不是富文本。

发送带主题的邮件


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中,才是一封完整的邮件。

python发送邮件

带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就可以了。

python发送邮件

带附件的邮件

带附件的邮件我们可以看成包含若干部分的邮件,所以,我么可以构造一个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

python发送邮件

将附件显示在邮件正文中

上面我们使用邮件发送了一个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

python发送邮件

使用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

python发送邮件

给TA打赏
共{{data.count}}人
人已打赏
安全技术

c++ vector

2022-1-11 12:36:11

安全资讯

Windows 更新错误每次都让你头大?微软现在有了官方的解决工具

2016-12-24 11:19:34

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索