使用 MailKit 获取 MimeMessage 大小
Get the MimeMessage size using MailKit
我的 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;
}
你想要的可以这样实现:
// 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 有一个方便的 MeasuringStream,所以你不需要分配内存。
我很确定您还想测量整个邮件内容(包括邮件 headers)。
我不明白你为什么要对输出消息进行 base64 编码,但我怀疑你是否需要或想要这样做。
我的 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;
}
你想要的可以这样实现:
// 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 有一个方便的 MeasuringStream,所以你不需要分配内存。
我很确定您还想测量整个邮件内容(包括邮件 headers)。
我不明白你为什么要对输出消息进行 base64 编码,但我怀疑你是否需要或想要这样做。