【问题标题】:How to avoid MailKit changing transfer encoding of text/plain and text/html parts?如何避免 MailKit 更改 text/plain 和 text/html 部分的传输编码?
【发布时间】:2021-03-06 00:53:48
【问题描述】:

我正在使用MimeMessage.Load()SmtpClient.Send() 加载和发送.eml 文件。问题是 MailKit 将没有传输编码的 UTF-8 text/plain 部分更改为使用 base64 的 UTF-8,而使用 UTF-8 并且没有传输编码的 text/html 部分更改为使用 quoted-printable 的 UTF-8。这可以避免吗?理想情况下,我想按原样发送 eml 文件,只需对 ToFrom 标头进行少量更改。

【问题讨论】:

  • 你确定不是 SMTP 服务器在改变这个吗?如果您在调用 SmtpClient.Send() 之前使用message.WriteTo("filename.txt") 编写消息,它是否具有重写的标头?如果不是,那么它可能是 SMTP 服务器。
  • @jstedfast 在发送前将消息写入文件并不会更改部分的传输编码。我还尝试使用 febootimail 工具发送原始 eml 文件,当我在 Thunderbird 中查看接收到的消息的来源时,t 编码也没有改变。会不会是SmtpClient引起的?
  • 我刚刚意识到,如果您的文本部分有 UTF-8 文本(非 ASCII)并且没有设置 Content-Transfer-Encoding,那么 SmtpClient 需要强制编码为您的 SMTP 服务器支持的任何内容(它实际上调用message.Prepare (EncodingConstraints.SevenBit)message.Prepare (EncodingConstraints.EightBit),具体取决于服务器支持的内容)。

标签: c# mailkit


【解决方案1】:

在发送消息之前,MailKit 的 SmtpClient 将 Prepare 给定 SMTP 服务器的编码约束(取决于服务器支持的编码为:7 位、8 位或二进制)来传输消息。

SmtpClient 的 Prepare() 方法是虚拟的,因此可以被覆盖。

默认实现本质上只是调用MimeMessage.Prepare

此方法的作用是遍历 MIME 部分树,确保每个 MIME 部分的内容都符合所提供的编码约束。如果发现不符合的部分,它会计算要使用的最佳 Content-Transfer-Encoding 并设置它。

【讨论】:

  • 那么用空实现覆盖 SmtpClient 的 Prepare() 是否可以实现我的目标,即让消息与原始 eml 文件相同?
  • 是的,应该的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 2011-12-10
  • 2021-08-04
  • 2020-01-12
  • 2011-05-25
相关资源
最近更新 更多