从 python 脚本发送时,outlook 中的电子邮件附件名称总是 "AT00001.xlsx" 而不是实际名称

Email attachment name in outlook always "AT00001.xlsx" instead of actual name when sent from python script

我正在尝试发送一封带有来自 python 脚本的附件的电子邮件。电子邮件到达我的收件箱,附件中包含所有正确的收件人、主题、正文和数据

问题是附件文件名始终是“AT00001.xlsx”,而不是脚本中的文件名。

这是我调用的发送电子邮件的方法:

def send_email():

    msg = MIMEMultipart()

    message = "Here is your file"

    msg['From'] = MY_ADDRESS
    msg['To'] = MY_ADDRESS
    msg['Subject'] = "File extract"
    msg.attach(MIMEText(message))

    attach_file_name = "test.xlsx"
    attach_file = open(attach_file_name, "rb")

    payload = MIMEBase('application', 'vnd.openxmlformats-officedocument.spreadsheetml.sheet')
    payload.set_payload(attach_file.read())

    attach_file.close()
    encoders.encode_base64(payload)

    payload.add_header('Content-Decomposition', 'attachment', filename=attach_file_name)
    msg.attach(payload)

    s = smtplib.SMTP(host='smtp-mail.outlook.com', port=587)
    s.starttls()
    s.login(MY_ADDRESS, PASSWORD)

    s.sendmail(MY_ADDRESS, MY_ADDRESS, msg.as_string())
    s.quit()

我在各种网站上发现 post 描述了由于附件和文本乱序而导致的此问题。我确认附件位于电子邮件负载中的最后,所以我认为这不是导致它的原因。

正如 rfkortekaas 在他的评论中指出的那样,这个问题的原因是我使用的是“Content-Decomposition”而不是“Content-Disposition”。

我更新了这行代码并且它完美运行:

payload.add_header('Content-Disposition', 'attachment', filename=attach_file_name)