【发布时间】:2017-07-08 04:23:50
【问题描述】:
我正在编写一个 Python 脚本来设置一个套接字,以通过 SMTP 从我的 Gmail 帐户发送带有图像的多部分电子邮件。我没有将 smtplib 或 email.mime 用于教育目的。我正在使用 ssl 和套接字,并使用 ssl.wrap_socket 包装 TCP 套接字。
一切正常,电子邮件到达时带有文本和附加图像。但是,附加的 JPEG 图像已损坏。
在十六进制编辑器中比较原始图像和损坏的图像,我可以看到 jpeg 中的所有 0x0D 和 0x0A 字节都已被 0x0D0x0A 替换。这些字节将在文本中表示 CR 和 LF,因此在某些时候,CR 和 LF 在我的二进制数据中被不恰当地替换为 CRLF。
如果我在将其发送到 ssl 套接字之前立即将其写入文件,则二进制数据似乎是正确的。 Gmail 似乎正确解释了内容类型,因为它将损坏的图像显示为图像。
CRLF 替换可能会渗透到二进制图像数据中的任何想法?
解决方案:
编码头的相关解决方案代码:
b'Content-Transfer-Encoding: base64\r\n' +\
对于 base64 编码本身:
clientSocketSSL.sendall(base64.b64encode(msgImage))
【问题讨论】:
-
如果您不想了解协议的所有细节并让它做“正确的事情”,也许您应该使用更高级别的模块。如果您确实想使用套接字,请深入研究 MIME RFC。
标签: python sockets ssl smtp gmail