python 发邮件,带附件,中文

本文介绍了如何使用Python的smtplib和email库来发送带有附件且包含中文内容的电子邮件。首先,你需要设置SMTP服务器和凭证,然后创建邮件消息,包含正文和附件。对于中文内容,可以使用email.header模块进行编码。最后,通过SMTP连接发送邮件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

# !/usr/bin/python
# -*- coding: UTF-8 -*-
from email import encoders
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.utils import parseaddr, formataddr

import cv2
import os
import smtplib
import urllib
from email.mime.text import MIMEText
from email.header import Header

sender = 'aaa@163.com'
mail_user ='aaa@163.com'
receivers = []  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱

# 第三方 SMTP 服务
mail_host = "smtp.com"  # 设置服务器

receivers.append("bbb@163.com")  # 用户名
mail_pass = "123456"  # 口令

def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((Header(name, 'utf-8').encode(), addr))

def sendMsa(subject,content):
    try:
        msg = MIMEMultipart()
        message = MIMETex
<think>我们正在处理用户关于Python发送邮件时附件未收到的问题。根据用户描述,邮件接收正常但附件缺失,具体表现为附件未命名或显示不正确。 根据引用[1][2][3]中的信息,附件问题通常与MIME类型设置、附件添加方式或邮件客户端兼容性有关。 解决方案步骤: 1. 确保正确创建MIMEMultipart消息,并添加正文附件。 2. 在添加附件时,需要设置附件的Content-Disposition头,指定文件名。 3. 正确设置附件的MIME类型和编码。 引用[2]中的问题:附件名为空白,是因为没有设置附件的文件名。在MIMEBase或MIMEApplication等部分,需要设置附件头信息。 引用[3]中的问题:在Outlook客户端中附件名显示不正确,可能是因为没有正确设置Content-Disposition,或者文件名编码问题。 因此,我们将提供一个发送附件的邮件的完整示例,重点注意附件的添加方式。 修改后的代码步骤: 1. 创建MIMEMultipart对象,设置邮件头(From, To, Subject)。 2. 添加正文(MIMEText)。 3. 添加附件:读取文件,创建MIMEBase对象(或使用MIMEApplication等),设置内容类型、编码,并添加Content-Disposition头,指定文件名。 4. 使用base64编码附件内容(通常由email库自动处理)。 5. 登录SMTP服务器并发送。 注意:文件名如果包含中文,需要进行编码处理,以避免乱码。 下面我们将编写一个示例代码,并解释关键步骤。</think>### Python 发送邮件附件缺失解决方案 您的邮件附件缺失问题通常由以下原因导致: #### 核心问题分析 1. **附件未正确添加** 在您的代码中,创建了`MIMEMultipart`对象但未实际添加附件文件(仅添加了文本内容)[^1]: ```python message.attach(MIMEText(content, 'plain', 'utf-8')) # 只添加了文本,未添加附件 ``` 2. **文件名未规范设置** 附件需要显式设置`Content-Disposition`头信息,否则客户端可能显示为"未命名"或"noname"[^2][^3]: ```python attachment.add_header("Content-Disposition", "attachment", filename=("gbk", "", filename)) ``` 3. **编码问题** 中文文件名需特殊处理编码,否则会被替换为`Attachment_1.txt`等默认名称[^3]。 --- ### 完整解决方案代码 ```python import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.application import MIMEApplication mail_host = 'smtp.qq.com' port = 465 sender = 'your_email@qq.com' password = 'your_password' # QQ邮箱需用授权码 receiver = 'recipient@example.com' def send_email_with_attachment(title, content, attachment_path): # 创建附件的邮件容器 msg = MIMEMultipart() msg["From"] = sender msg["To"] = receiver msg["Subject"] = title # 添加邮件正文 msg.attach(MIMEText(content, 'plain', 'utf-8')) # 添加附件(关键步骤) with open(attachment_path, "rb") as f: attachment = MIMEApplication(f.read()) # 获取纯文件名(不含路径) filename = attachment_path.split("/")[-1] # 设置附件头信息(解决未命名问题) attachment.add_header("Content-Disposition", "attachment", filename=("gbk", "", filename)) # 处理中文文件名 msg.attach(attachment) # 发送邮件 try: with smtplib.SMTP_SSL(mail_host, port) as smtp: smtp.login(sender, password) smtp.sendmail(sender, receiver, msg.as_string()) print("邮件发送成功") except Exception as e: print(f"发送失败: {str(e)}") # 使用示例 if __name__ == "__main__": send_email_with_attachment( title="附件的测试邮件", content="请查收附件", attachment_path="/path/to/your/file.txt" # 替换为实际文件路径 ) ``` #### 关键修复点说明: 1. **添加附件实体** 使用`MIMEApplication`加载文件内容并显式附加到邮件体 2. **规范文件名设置** ```python attachment.add_header("Content-Disposition", "attachment", filename=("gbk", "", filename)) ``` - `("gbk", "", filename)` 解决中文文件名乱码问题 - `"attachment"` 声明内容为附件而非内嵌资源 3. **上下文管理器** 使用`with`语句自动管理SMTP连接,避免资源泄漏 --- ### 测试建议 1. 检查文件路径是否正确 2. 测试不同文件类型(PDF/图片/ZIP) 3. 同时发送多个附件: ```python attachments = ["file1.pdf", "file2.jpg"] for path in attachments: with open(path, "rb") as f: attachment = MIMEApplication(f.read()) attachment.add_header(...) msg.attach(attachment) ``` > **注意**:QQ邮箱需开启SMTP服务并使用授权码(非登录密码)[^1]。超大附件(>50MB)建议使用云存储链接替代直接发送。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI算法网奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值