如何用Python MIME Multipart拆分邮件?Socket发送邮件格式异常求助
问题分析与修正方案
你的代码核心问题是MIME多部分格式的换行规则、分隔符使用不符合邮件协议标准,导致邮件解析器无法正确识别纯文本和附件的边界,具体修正如下:
核心错误点
- 邮件协议要求使用**CRLF(\r\n)**作为换行符,单纯的
\n无法被标准解析器正确识别 - 每个MIME部分的头信息和内容之间必须有一个空行(\r\n\r\n),用于分隔头字段和实际内容
- 分隔符(boundary)的格式必须严格遵循:
--boundary+ CRLF 开启新部分,结束时用--boundary--+ CRLF
修正后的代码
# 发送MIME版本与内容类型头,严格用CRLF换行 cSockSSL.send("MIME-Version: 1.0\r\n".encode()) cSockSSL.send("Content-Type: multipart/mixed; boundary=gg4g5gg\r\n\r\n".encode()) # 第一个分隔符,加CRLF开启纯文本部分 cSockSSL.send("--gg4g5gg\r\n".encode('ascii')) # 纯文本头信息,结尾用CRLF+CRLF分隔头与内容 cSockSSL.send("Content-Type: text/plain\r\n\r\n".encode()) # 发送纯文本内容,结尾加CRLF cSockSSL.send("Some text\r\n".encode()) # 分隔符开启附件部分 cSockSSL.send("--gg4g5gg\r\n".encode()) # 附件头信息,结尾用CRLF+CRLF分隔头与附件内容 cSockSSL.send("Content-Type: text/plain\r\n".encode()) cSockSSL.send("Content-Disposition: attachment; filename=gg.txt\r\n\r\n".encode()) # 发送附件内容,结尾加CRLF cSockSSL.send(txt_file + b"\r\n") # 结束分隔符,加CRLF cSockSSL.send("--gg4g5gg--\r\n".encode()) # 邮件结束标记(单独一行的.) cSockSSL.send("\r\n.\r\n".encode())
关键细节说明
- 所有头信息行必须以
\r\n结尾,包括Content-Type等字段 - 每个MIME部分的头信息结束后,必须用
\r\n\r\n明确标记头结束、内容开始 - 分隔符
--boundary必须单独占据一行,因此前后都要添加\r\n - 附件的
filename参数不要加空格,写成filename=gg.txt更符合标准规范 - 邮件结束标记
.必须单独成一行,前面加\r\n确保它是独立行
内容的提问来源于stack exchange,提问作者DarkMessiah
相关产品推荐
相关产品推荐

