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