使用smtp发送邮件时,在已发送邮件列表中,收件人信息显示“收件人未填写”,在邮件详情中也没有直接显示收件人信息,发件人也为空:
发送方显示:
收件方显示:
解决办法:
引入email.utils模块 中的parseaddr函数和formataddr函数,用来在发送Email的时候,“美化”地址中的姓名部分。
参考demo源码:
# 粥粥yan
# 开发时间:2021/7/22 10:53
# coding:utf-8
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
# 美化”地址中的姓名部分
from email.utils import parseaddr, formataddr
msg_from = 'xxx@qq.com'
# 授权码
pwd = 'xxxxxxxx'# 接收方邮箱
to = ['xxxx@126.com', 'xxxxx@qq.com']# 发送邮件主题
subject = 'Python email tests2 V1'# 发送邮件
# MIMEMultipart 类可以放任何内容
msg = MIMEMultipart()
content = 'hello word!'# 把内容加进去
msg.attach(MIMEText(content, 'plain', 'utf-8'))# 设置邮件主题
msg['Subject'] = subject# 自定义发件人和收件人信息
# (可以在收到邮件的时候看到发件人和收件人信息),没设置该部分在收邮件时告知是未知发件人
def _format_addr(s):addr = parseaddr(s)return formataddr(addr)# 自定义发件人名称
msg['From'] = _format_addr(u'tester <%s>' % msg_from)# 自定义收件人(不定义会显示'收件人未填写')
for item in to:msg['to'] = _format_addr(item)# 开始发送
# 通过SSL方式发送,服务器地址和端口
smtObj = smtplib.SMTP_SSL("smtp.qq.com", 465)
# 登录邮箱
smtObj.login(msg_from, pwd)
# 开始发送
smtObj.sendmail(msg_from, to, msg.as_string())
print("邮件发送成功")
# 关闭邮件服务器的连接
smtObj.quit()
发送方显示结果:
收件方显示:
Tips:其实大可不必如上去解决,直接用yagmail 这个第三方库发送,就不需要自己额外去美化发件人和收件人的信息了。