实现逻辑如下
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib
# 格式化输出地址
def __format_address(r):
name, address = parseaddr(r)
return formataddr((Header(name, 'utf-8').encode(), address))
content = '''
人生苦短,我用Python
'''
# 发件人邮箱
from_address = input('请输入发件人邮箱:')
# 邮箱密码
pwd = input('请输入邮箱密码:')
# 邮箱服务器
server_smtp = input('请输入邮箱服务器地址:')
# 收件人邮箱列表
to_address_lists = []
def to_address_list():
to_address = input('请输入收件人邮箱:')
to_address_lists.append(to_address)
while True:
if_quit = input('是否继续输入邮箱,n退出,其他操作继续输入')
if if_quit == 'n':
break
else:
to_address = input('请输入收件人邮箱:')
to_address_lists.append(to_address)
# to_address = input('请输入收件人邮箱:')
to_address_list()
# 邮件的消息内容
msg = MIMEText(content, 'plain', 'utf-8')
# 发件人
msg['From'] = __format_address(u'测试<%s>' % from_address)
# 收件人
list_to = []
for i in to_address_lists:
list_to.append(__format_address(u'管理员<%s>' % i))
msg['To'] = ','.join(list_to) # 多个收件人需要以','分割成一个字符串
# 邮件主题
msg['Subject'] = Header(u'这是一封测试邮件', 'utf-8').encode()
# 启动服务
server = smtplib.SMTP_SSL(server_smtp, 465)
# 打印日志
server.set_debuglevel(1)
# 登录邮箱
server.login(from_address, pwd)
# 发送邮件,多个收件人是一个列表[]
server.sendmail(from_address, to_address_lists, msg.as_string())
server.quit()
遇到的问题总结
-
msg['To']的值是有‘,’分割开的一个字符串('test1@163.com, test2@163.com'),而server.sendmail参数中的to_address_lists是一个列表(['test1@163.com','test2@163.com'])
-
formataddr 接受2个参数,第一个是需要转换的值,第二个是编码方式,编码默认是utf-8,可以不传