【问题标题】:SMTP to Gmail: image corrupted by added CRLFsSMTP 到 Gmail:图像被添加的 CRLF 损坏
【发布时间】: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


【解决方案1】:

由于您没有显示任何代码,我的猜测是您简单地将二进制图像放入邮件中。但是,传统邮件只能传输 ASCII 数据,并且行长限制为 1000 个字符,因此必须对数据进行编码才能传输,请参阅Wikipedia:MIME 了解更多信息。

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

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

【讨论】:

  • 感谢有关编码的提示。请参阅上面的编辑,了解我到目前为止所做的事情,但我会继续调查。
  • @TonyM:这和我预期的完全一样,即没有像 base64 这样的适当的传输安全编码。除此之外,您应该将电子邮件视为字节,而不是 UTF-8 编码数据。
猜你喜欢
  • 2021-08-01
  • 2016-05-24
  • 1970-01-01
  • 1970-01-01
  • 2018-01-29
  • 1970-01-01
  • 1970-01-01
  • 2021-05-30
  • 1970-01-01
相关资源
最近更新 更多