Python实现不本地保存Word文档对象直接邮件发送的方法
问题解决思路
这个错误我之前也碰到过!本质是你调用的发送函数(不管是邮件发送、API上传还是其他场景)需要接收字符串或字节数据,但你直接传入了Document对象——它没法自动把这个对象转换成可识别的Unicode字符串,所以就抛出了这个TypeError。
核心解决方法
不用把文档保存到本地,而是把Document对象写入内存字节流(比如Python的io.BytesIO),再把字节流里的数据传给发送函数,这样既满足了“不本地保存”的要求,又能让发送函数拿到它能处理的数据。
示例代码(以python-docx为例)
1. 生成Word文档并写入内存字节流
from docx import Document import io # 先创建你的Word文档内容 doc = Document() doc.add_paragraph("这是测试段落") doc.add_heading("测试标题", level=1) # 将文档写入内存中的字节流,完全不用存到本地 byte_stream = io.BytesIO() doc.save(byte_stream) # 一定要重置流的位置到开头,不然后续读取会从末尾开始,拿不到内容 byte_stream.seek(0)
2. 场景1:作为邮件附件发送
如果是用邮件发送这个文档,可以把字节流转成邮件附件:
from email.mime.base import MIMEBase from email import encoders import smtplib from email.mime.multipart import MIMEMultipart # 创建邮件主体 msg = MIMEMultipart() msg['Subject'] = "测试Word文档" msg['From'] = "your-email@example.com" msg['To'] = "recipient@example.com" # 把字节流转成邮件附件 attachment = MIMEBase('application', 'vnd.openxmlformats-officedocument.wordprocessingml.document') attachment.set_payload(byte_stream.read()) encoders.encode_base64(attachment) attachment.add_header('Content-Disposition', 'attachment', filename='测试文档.docx') # 添加附件到邮件并发送 msg.attach(attachment) with smtplib.SMTP('smtp.example.com', 587) as server: server.starttls() server.login("your-email@example.com", "your-password") server.send_message(msg)
3. 场景2:通过API上传文档
如果是调用第三方API上传文档,可以直接把字节流的内容传给接口:
import requests # 读取字节流中的文档数据 doc_data = byte_stream.read() # 发送POST请求,把文档作为文件参数上传 response = requests.post( "https://your-api-url.com/upload", files={ 'file': ('测试文档.docx', doc_data, 'application/vnd.openxmlformats-officedocument.wordprocessingml.document') } ) # 检查响应 if response.status_code == 200: print("上传成功!") else: print(f"上传失败,状态码:{response.status_code}")
关键注意点
- 写完字节流后一定要调用
seek(0),不然指针在流的末尾,后续读取会得到空数据。 - 不同的发送场景,需要匹配对应的Content-Type(Word文档的MIME类型是
application/vnd.openxmlformats-officedocument.wordprocessingml.document)。
内容的提问来源于stack exchange,提问作者user3558939
相关产品推荐
相关产品推荐

