用Python通过SMTP发送邮件

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
66
# -*- coding: utf-8 -*-
import traceback
import smtplib
import os
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from email.utils import formataddr as _formataddr

def formataddr(addr):
return ','.join([_formataddr([a.split("@")[0].strip(), a.strip()]) for a in addr.split(',')])

"""
smtp_server: SMTP服务器地址
from_addr: 发件人地址
to_addr: 收件人地址(多个地址用英文逗号分割)
subject: 邮件主题
content: 邮件内容
attachmentpaths: 附件的文件路径
html: 邮件内容是否是HTML格式
ssl: 使用SMTP_SLL(465端口)还是SMTL(25端口)
"""
def send_email(smtp_server, from_addr, password, to_addr, subject, content, attachmentpaths=[], html=False, ssl=True):
try:
msg = MIMEMultipart()
msg['From'] = formataddr(from_addr) # 括号里的对应发件人邮箱昵称、发件人邮箱账号
msg['To'] = formataddr(to_addr) # 括号里的对应收件人邮箱昵称、收件人邮箱账号
msg['Subject'] = subject # 邮件标题
if html:
context_part = MIMEText(content, 'html', 'utf-8')
else:
context_part = MIMEText(content, 'plain', 'utf-8')
msg.attach(context_part)

if attachmentpaths:
for path in attachmentpaths:
filedir, filename = os.path.split(path)
part = MIMEApplication(open(path,'rb').read())
part.add_header('Content-Disposition', 'attachment', filename=filename)
msg.attach(part)

if ssl:
server=smtplib.SMTP_SSL(smtp_server, 465)
else:
server=smtplib.SMTP(smtp_server, 25) # 发件人邮箱中的SMTP服务器,端口是25
server.login(from_addr, password) # 括号中对应的是发件人邮箱账号、邮箱密码
server.sendmail(from_addr, to_addr.split(','), msg.as_string())
server.quit() # 关闭连接
return True
except Exception:
traceback.print_exc()
return False

if __name__ == '__main__':
# test

send_email("smtp.163.com", "kyo_86@163.com", "XXXXXXXXX", "kyo_86@163.com",
f"测试HTML内容和附件发送",
"""
<html>
<body>
<img src="http://kyo86.com/images/saber.jpg"/>
</body>
</html>
""",
attachmentpaths=[r"./mailer.py"], html=True, ssl=True)