【问题标题】:Get the MimeMessage size using MailKit使用 MailKit 获取 MimeMessage 大小
【发布时间】:2021-12-05 20:24:33
【问题描述】:

我的 SMTP 服务器限制了每个 smtpclient 会话可以发送的数据量以及其他一些限制。例如,我想发送 10 条消息,但服务器可能会施加总共 10Mb 的限制。我想计算消息的大小,以便知道何时需要重新初始化服务器连接。

我正在使用 MailKit 库来完成这项工作。

我正在考虑将包含附件的 Message.Body 写入 MemoryStream,但这似乎只是为了获得大小。

如果我有一个内存中的 MimeMessage 对象,是否有一种方法可以在发送之前确定其完整的内容长度?

-----更新-----

如果没有原生选项,这是我建议的方法:

using (var memory = new MemoryStream())
      {
         await mailMessage.Body.WriteToAsync(memory);
         curMessageLength = Convert.ToBase64String(memory.ToArray()).Length;
       }

【问题讨论】:

  • @ErmiyaEskandary 谢谢,虽然这个问题是相关的,可能是我必须走的路,但我希望 MailKit 库中可能有一些我可能遗漏的东西。
  • 啊-不,不幸的是,我在文档中没有找到任何内容!我只是计算附件大小(如 base64 提醒你)和正文,这应该足够了 - 为标题等提供或获取一个小缓冲区,

标签: c# mailkit


【解决方案1】:

你想要的可以这样完成:

// Make sure to prepare the message for sending before you call
// SmtpClient.Send/Async() so that you are getting an accurate size.
mailMessage.Prepare (EncodingConstraint.SevenBit);

using (var stream = new MimeKit.IO.MeasuringStream ())
{
    await mailMessage.WriteToAsync (stream);
    curMessageLength = stream.Length;
}

MimeKit 有一个方便的测量流,因此您无需分配内存。

我很确定您还想测量整个邮件内容(包括邮件标题)。

我不明白您为什么要对输出消息进行 base64 编码,但我怀疑您是否需要或想要这样做。

【讨论】:

  • 再次感谢。 RE:base64,这里有一条评论(stackoverflow.com/a/7751030/116208)暗示它给出了更准确的长度。
  • 那是在谈论附件的大小,而不是邮件。附件已在邮件中编码。
猜你喜欢
  • 1970-01-01
  • 2017-07-14
  • 2019-12-01
  • 1970-01-01
  • 2020-01-19
  • 1970-01-01
  • 1970-01-01
  • 2020-02-20
  • 2014-01-18
相关资源
最近更新 更多