You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python的SMTP库发邮件,Windows版Outlook无法接收附件问题

问题:Windows版Outlook无法显示邮件附件,其他客户端正常

我正在为应用开发邮件系统,完成特定步骤后需发送带附件(PDF文件)的邮件。测试过的Linux Geary、移动端Outlook、网页版Outlook、基于Roundcube的自研邮件系统都能正常显示附件,但Windows版Outlook客户端接收后看不到附件。尝试更换.png、.jpg、.docx格式附件,问题依旧。

使用的代码如下:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase

from email import encoders
import base64

FROM = "sender@mail.com"
data = request.data['data']
base64_string = data['file']
base64_string = base64_string.split(',')[1]
attachment_data = base64.b64decode(base64_string)

PASS = ""
SERVER = 'mail.ourhost.be'

TO = "receiver@mail.com"

msg = MIMEMultipart('alternative')
msg['Subject'] = "subject"
msg['From'] = FROM
msg['To'] = TO

html = f"""\
    <html style="font-family: Heebo;">
            my email content
    </html>
    """ 

part2 = MIMEText(html, 'html')
msg.attach(part2)


# Add the decoded attachment data to the email
part = MIMEBase('application', 'pdf')
part.set_payload((attachment_data))
encoders.encode_base64(part)
filename = f'name.pdf'
part.add_header('Content-Disposition', "attachment; filename= %s" % filename)
msg.attach(part)

请问针对Windows版Outlook,有什么需要特别注意的地方吗?


解决方案

核心问题:Multipart类型错误

你使用了MIMEMultipart('alternative'),这个类型的设计目的是提供纯文本和HTML版本的替代内容(让邮件客户端选择显示哪一种),并不适合包含附件。大部分邮件客户端会兼容这种错误,但Windows版Outlook对MIME类型的合规性要求更严格,会忽略alternative类型容器中的附件。

修改方法:将Multipart类型改为mixed(这是带附件邮件的标准类型),直接使用无参数的MIMEMultipart()即可(默认就是mixed):

# 替换原有的msg初始化代码
msg = MIMEMultipart()  # 或者显式写MIMEMultipart('mixed')

其他Windows Outlook注意事项

  1. 文件名编码:如果文件名包含非ASCII字符(比如中文、特殊符号),直接用字符串会导致Outlook显示乱码,建议用email.header模块处理:
    from email.header import Header
    # 设置文件名时替换为
    part.add_header('Content-Disposition', f'attachment; filename="{Header(filename, "utf-8").encode()}"')
    
  2. Content-Type准确性:不同类型的附件要设置对应的MIME类型,比如:
    • PNG图片:MIMEBase('image', 'png')
    • Word文档:MIMEBase('application', 'vnd.openxmlformats-officedocument.wordprocessingml.document')
  3. Content-Disposition格式:文件名用双引号包裹更稳妥,避免文件名包含空格等特殊字符时出现解析问题,比如attachment; filename="name.pdf"而不是不带引号的写法。

内容的提问来源于stack exchange,提问作者Yorbjörn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 20:20:48