SMTP到Gmail:图像因添加的CRLF而损坏

时间:2017-02-18 17:24:14

标签: python sockets ssl smtp gmail

我正在编写一个Python脚本来设置套接字,以便通过SMTP从我的Gmail帐户发送包含图像的多部分电子邮件。我没有使用smtplib或email.mime用于教育目的。我使用ssl和socket并用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))

1 个答案:

答案 0 :(得分:1)

由于您没有显示任何代码,我猜您只需将二进制图像放入邮件即可。但是,传统上邮件只能传输ASCII数据,并且行长度限制为1000个字符,因此必须对数据进行编码以便传输,有关更多信息,请参阅Wikipedia:MIME

如果您没有为传输指定任何编码,它将被视为7位,如果您幸运的是8位编码,并且这两种编码都将线路端特殊处理,并将根据平台进行更改。这意味着在Windows上,原始单个LF将存储为CRLF,而在Unix上,原始CRLF将仅存储为LF。请注意,不仅发送和接收邮件用户代理可能会将数据调整到平台,但其间的任何邮件服务器也可能会更改这些。

总结:使用MIME正确编码二进制数据以进行传输,email提供您需要的功能。