Python发送邮件:内嵌图片被识别为附件的问题求助
解决邮件内嵌图片被当作附件发送的问题
你的代码里有两个核心问题导致图片变成附件:
- 使用了
MIMEMultipart('alternative')类型,这种类型是用来提供纯文本和HTML版本的备选内容,不适合承载内嵌资源; - 没有添加引用该图片的HTML正文,邮件客户端不知道这张图是要内嵌到正文里的。
修正步骤:
- 将邮件容器改为
MIMEMultipart('related'),这个类型专门用于包含HTML正文及其关联的内嵌资源(比如图片、样式); - 添加HTML正文部分,在HTML中通过
cid:image1引用图片的Content-ID(要和图片的Content-ID值一致); - (可选)添加纯文本版本的正文,适配不支持HTML的邮件客户端;
- 移除代码中多余的
]符号(msgImage.add_header那行末尾的错误符号)。
修正后的完整代码:
def send_email(recipients): # 使用related类型的多部分邮件容器 msg = MIMEMultipart('related') msg['Subject'] = 'subject' msg['From'] = 'myemail@gmail.com' msg['To'] = ', '.join(recipients) # 创建HTML正文,通过cid引用内嵌图片 html_body = """ <html> <body> <p>这是内嵌图片:</p> <img src="cid:image1" alt="内嵌图片"> </body> </html> """ msg_html = MIMEText(html_body, 'html') msg.attach(msg_html) # (可选)添加纯文本备选内容 text_body = "这是纯文本版本,你的邮件客户端不支持HTML显示" msg_text = MIMEText(text_body, 'plain') msg.attach(msg_text) # 处理内嵌图片 with open('myimage.webp', 'rb') as fp: msgImage = MIMEImage(fp.read()) # 设置Content-ID,供HTML引用 msgImage.add_header('Content-ID', '<image1>') # 设置为inline,明确是内嵌而非附件 msgImage.add_header('Content-Disposition', 'inline', filename='myimage.webp') msg.attach(msgImage) with smtplib.SMTP_SSL('smtp.gmail.com', 465) as smtp_server: smtp_server.login(config.EMAIL_USERNAME, config.EMAIL_PASSWORD) smtp_server.sendmail(config.EMAIL_USERNAME, recipients, msg.as_string())
函数调用不变:
send_email(['someone@somewhere.com'])
关键说明:
MIMEMultipart('related')会把HTML正文和内嵌资源绑定在一起,让邮件客户端识别它们的关联关系;- HTML里的
cid:image1必须和图片的Content-ID完全一致(包括尖括号); Content-Disposition: inline明确告诉客户端这是内嵌资源,不要当成附件处理。
内容的提问来源于stack exchange,提问作者Arshia Haeri-Mehrizi
相关产品推荐
相关产品推荐

