目录
摘要
网上有很多python发送邮件的方法参考,但基本都无法防止乱码现象的发生,今天在写自动化脚本的时候遇到了这个问题,在此处记录一下,希望能对大家有所帮助!
乱码现象
首先我们来看我最开始写的python发送邮件的代码,如下所示:
# coding=utf-8
import os
import xlwt
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
def sendMail(self):
# 收件人(列表)
mail_receivers=['[email protected]']
# 邮件标签
mail_lable="测试邮件"
# 使用的邮箱的smtp服务器地址,这里是qq的
mail_host="smtp.qq.com"
# 用户名,登录名
mail_user="[email protected]"
# 授权码,注意这里不是密码是授权码
mail_pass="xxxx"
# 邮箱的后缀
mail_postfix="qq.com"
files = ['D:/中文测试.xlsx']
me=mail_lable+"<"+mail_user+"@"+mail_postfix+">"
msg = MIMEMultipart()
msg.attach(MIMEText('正文',_subtype='html', _charset='utf-8'))
msg['Subject'] = '标题'
msg['From'] = me
msg['To'] = ",".join(mail_receivers) #将收件人列表以‘,’分隔
#print(len(files))
if len(files) != 0:
for i in range(len(files)):
if os.path.isfile(files[i]):
att = MIMEBase('application', 'octet-stream')
att.set_payload(open(files[i], 'rb').read())
att.add_header('Content-Disposition', 'attachment', filename=os.path.basename(files[i]))
encoders.encode_base64(att)
msg.attach(att)
try:
server = smtplib.SMTP_SSL(mail_host, 465)
server.login(mail_user,mail_pass) #登录操作
server.sendmail(me, mail_receivers, msg.as_string())
server.close()
except Exception as e:
return False
return True
if __name__ == '__main__':
sendMail()
qq邮箱申请授权码方法如下:
点击设置——》账户:
下拉,把这一栏全部开启,然后点击生成授权码即可。
代码比较简单,遍历文件列表,加入到msg对象中,最后以附件的形式发送到邮箱,这里我使用的是自己的邮箱,给自己发送信息,调用sendMail方法运行,本来以为完事了,结果附件名称却显示乱码,于是开始寻找解决之道。
解决办法
最后经过各种尝试,查阅资料等,找到了一种确实可行的方法,修改以下代码即可:
att.add_header('Content-Disposition', 'attachment', filename=('gbk', '', os.path.basename(files[i])) )
这之后乱码问题就被解决了。后来发现windows平台下使用gbk没有问题,改成utf-8的话网页没有问题,但是手机端会乱码。再后来我用同事的电脑进行尝试,发现他的电脑不需要修改代码也不会有乱码问题的出现,修改了本行代码也不会有问题。。。
总而言之,这样不会出现问题就好,希望能对正在观看的你有所帮助,喜欢还请右上角点个赞哦,谢谢!