我正在编写一个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))
答案 0 :(得分:1)
由于您没有显示任何代码,我猜您只需将二进制图像放入邮件即可。但是,传统上邮件只能传输ASCII数据,并且行长度限制为1000个字符,因此必须对数据进行编码以便传输,有关更多信息,请参阅Wikipedia:MIME。
如果您没有为传输指定任何编码,它将被视为7位,如果您幸运的是8位编码,并且这两种编码都将线路端特殊处理,并将根据平台进行更改。这意味着在Windows上,原始单个LF将存储为CRLF,而在Unix上,原始CRLF将仅存储为LF。请注意,不仅发送和接收邮件用户代理可能会将数据调整到平台,但其间的任何邮件服务器也可能会更改这些。
总结:使用MIME正确编码二进制数据以进行传输,email提供您需要的功能。