中文文件名的邮件附件在qq邮箱和sina邮箱显示有误

来源:6-3 发送html邮件和带附件的邮件

小神1984

2023-03-12 14:03:11

问题描述:

发送邮件到QQ邮箱,附件名变成了tcmime.xxx.bin; 发送到sina邮箱,附件名变成了 附件1,下载后可以用word打开。不知道是哪里出了问题?


相关代码:

# coding:utf-8

import os

import xlrd

import smtplib
from email.header import Header
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

from docx import Document
from docx.oxml.ns import qn
from docx.shared import Pt
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT

path = r"D:\PycharmProjects\salary\org_file\salary.xlsx"
book = xlrd.open_workbook(path)
sheet = book.sheet_by_index(0)

# 读取excel到列表
result = []
for i in sheet.get_rows():
    content = []
    for j in i:
        content.append(j.value)
    result.append(content)

for i in result:
    print(i)

# 编辑word
tar_path = os.path.split(path)[0]
tar_file_list = []
receiver_name_list = []
for d in result[1:]:
    doc = Document()

    title = doc.add_heading('', 0)
    _title = title.add_run('5月工资单')

    table_obj = doc.add_table(2, 10,
                              style='Table Grid')
    cell = table_obj.rows[0].cells
    for n, c in enumerate(result[0][:-1]):
        cell[n].text = str(c)
    cell = table_obj.rows[1].cells
    for n, c in enumerate(d[:-1]):
        cell[n].text = str(c)

    style = doc.styles['Normal']
    style.font.name = '微软雅黑'
    style.element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')
    style.font.size = Pt(11)

    title.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
    _title.font.name = '微软雅黑'
    _title._element.rPr.rFonts.set(qn('w:eastAsia'), u'微软雅黑')
    _title.bold = True

    tar_file = os.path.join(tar_path, d[0]+'5月工资单.docx')
    doc.save(tar_file)
    tar_file_list.append(tar_file)
    receiver_name_list.append(d[0])

# 发送邮件
mail_host = 'smtp.sina.com'
mail_user = 'm00000000'
mail_pass = '00000000000'

sender = 'm00000000@sina.com'
receivers = []
for d in result[1:]:
    receivers.append(d[10])

for n, t in enumerate(tar_file_list):
    message = MIMEMultipart()
    attr = MIMEText(open(t, 'rb').read(), 'base64', 'uft-8')
    attr['Content-Type'] = 'application/octet-stream'
    f_name = os.path.split(t)[-1]
    attr.add_header('Content_Disposition', 'attachment',
                    filename=('gbk', '', f_name))
    message.attach(attr)

    msg_content = '''
    <p style="font-weight:bold;">亲爱的
    ''' + receiver_name_list[n] + '''
    : </p>
    <p style="text-indent:2em;">感谢您为公司做出的贡献! </p>
    <p style="text-indent:2em;">本月工资已经到账,请注意查收。如未收到,请您在5个工作日内联系人力资源部。 </p>
    <p style="text-indent:2em;">您的工资单详情请查看邮件附件! </p>
    <p style="text-indent:2em;">如有异议请联系人力资源部。 </p></p>
    <br /><br /><br />
    <p style="text-align:right;">人力资源部<br />2021年5月31日 </p>
    '''
    text = MIMEText(msg_content, 'html', 'utf-8')
    message.attach(text)

    message['From'] = Header(sender)
    message['Subject'] = Header('5月工资单')

    try:
        smtpObj = smtplib.SMTP()
        smtpObj.connect(mail_host, 25)
        smtpObj.login(mail_user, mail_pass)
        smtpObj.sendmail(sender, (receivers[n], sender), message.as_string())
    except smtplib.SMTPException as e:
        print('error: %s' % e)


写回答

1回答

好帮手慕小猿

2023-03-13

同学,你好!是附件名称为中文造成的,同学按以下操作进行修改

1、导入make_header()方法

https://img.mukewang.com/climg/640eae5b090dbbdb05670042.jpg

2、使用make_header方法对filename进行操作

https://img.mukewang.com/climg/640eaf520908ce0609320144.jpg

祝学习愉快~

0

0 学习 · 4470 问题

查看课程