Python中的SMTP发送邮件

215 阅读3分钟
一:SMTP介绍
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。
Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。
Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件
二:发送邮件实列
在这里我们使用企业邮箱263发送邮件,由于找不到设置smtp服务的密码,然后向客服询问,263企业邮箱默认smtp服务是开启的,密码就是对应发送邮箱账号的密码;
[Python]
纯文本查看
复制代码
1
2
3
4
# 发信服务器
smtp_server = 'smtp.263.net'
# 服务器端口--加密
port = 465
纯文本邮件:
[Python]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
import smtplib # smtp服务器
from email.mime.text import MIMEText # 邮件文本
# 邮件构建
sender = "*******@itcast.cn" # 发送方
password = "*****" # smtp服务密码
subject = "滴滴答答" # 邮件标题
content = "新年快乐!" # 文本内容
recver = "*******@itcast.cn" # 接收方
# content 发送内容 "plain"文本格式 utf-8 编码格式
message = MIMEText(content, "plain", "utf-8")
message['Subject'] = subject # 邮件标题
message['To'] = recver # 收件人
message['From'] = sender # 发件人
smtp = smtplib.SMTP_SSL("smtp.263.com", 465) # 实例化smtp服务器
smtp.login(sender, password) # 发件人登录
smtp.sendmail(sender, [recver], message.as_string()) # as_string 对 message 的消息进行了封装
smtp.close()
发送带附件的邮件:
[Python]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
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
import smtplib # smtplib 用于邮件的发信动作
from email.mime.text import MIMEText # email 用于构建邮件内容
from email.header import Header # Header 用来构建邮件头
from email.mime.multipart import MIMEMultipart # 用于实例化附件(处理多种形态的邮件主体我们需要 MIMEMultipart 类)
# 邮件构建
sender = "*******@itcast.cn" # 发送方
password = "*****" # smtp服务密码
subject = "滴滴答答" # 邮件标题
content = "新年快乐!" # 文本内容
recver = "*******@itcast.cn" # 接收方
# content 发送内容 "plain"文本格式 utf-8 编码格式
message = MIMEText(content, "plain", "utf-8")
message['Subject'] = subject # 邮件标题
message['To'] = recver # 收件人
message['From'] = sender # 发件人
# 构造文件附件1
attr1 = MIMEText(open(files, 'rb').read(), 'base64', 'utf-8')
attr1["content_Type"] = 'application/octet-stream'
# attr1["Content-Disposition"] = "attachment; filename=Header({}, 'utf-8').encode()".format('你好') # 表示这是附件,名字是啥
# 解决附件中文名称乱码问题
attr1.add_header('Content-Disposition', 'attachment', filename=Header(file_name, 'utf-8').encode())
message.attach(attr1)
# 构造图片附件2
att2 = MIMEText(open('./1.png', 'rb').read(), 'base64', 'utf-8')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="12.jpg"'
message.attach(att2)
# 构造html附件3
att3 = MIMEText(open('./2.html', 'rb').read(), 'base64', 'utf-8')
att3["Content-Type"] = 'application/octet-stream'
att3["Content-Disposition"] = 'attachment; filename="boke.html"'
message.attach(att3)
smtp = smtplib.SMTP_SSL("smtp.263.com", 465) # 实例化smtp服务器
smtp.login(sender, password) # 发件人登录
smtp.sendmail(sender, [recver], message.as_string()) # as_string 对 message 的消息进行了封装
smtp.close()
注意点:使用smtp服务发送带附件的邮件,附件的名称不能直接用中文,否则发送过去文件名会是乱码
[Python]
纯文本查看
复制代码
1
2
# 解决附件中文名称乱码问题
attr1.add_header('Content-Disposition', 'attachment', filename=Header(file_name, 'utf-8').encode())