c# - 发送带附件的电子邮件时,我应该处理 MimeKit 使用的流吗?

标签 c# stream mailkit mimekit

我在玩 MailKit/MimeKit 时遇到了一些问题。我想使用流发送带有附件的电子邮件。 MimeKit 提供了 BodyBuilder 类,这使得创建正文消息和附加文件变得非常容易:

public void SendEmail(string body, Stream attachment, string fileName)
{
    var message = new MimeMessage();
    message.From.Add(new MailboxAddress("Carl", "carl@site.com"));
    message.To.Add(new MailboxAddress("Rick", "rick@site.com"));
    message.Subject = "Things got messy...?";

    var builder = new BodyBuilder();
    builder.TextBody = body;

    builder.Attachments.Add(fileName, attachment);

    message.Body = builder.ToMessageBody();

    using (var client = new SmtpClient())
    {
        // code to send e-mail here...
    }
}

我在我的代码中的其他地方生成流并且我没有关闭它,所以我可以将它传递给 MimeKit。不清楚的是:MimeKit 是否处理流?基本上(据我所知)消费者通常负责处理流。我也知道在 MemoryStream 上调用 dispose (我基本上使用它)不会释放任何资源..但会阻止读取/写入它。但是,如果将来实现更改为另一种类型的 Stream,事情就会变得更加复杂。

我还深入研究了 MikeKit 源代码,发现传递给 AttachmentCollection.Add 的 Stream 被“添加”到继承自 Stream 的 MemoryBlockStream 中(并且实现 Dispose),所以我假设它已被处置,但在这一点上,我只是猜测。

有什么想法吗?

最佳答案

通过检查 MimeKit 上的代码。特别是两个重载:

1 - Overload获取 byte[] 数据,你可以看到他们创建了一个流并保留了它的所有权。这是通过在 using block 上创建流来完成的。可以假定下游代码 (CreateAttachment()) 没有处理任何 Stream dispose。

2 - overload that you mention ,流只是传递给 CreateAttachment()

我想说的是,在这种情况下,如果可以的话,你最好自己处理它。也就是说,如果它只能在流被消耗后完成。

其实调用Add之后,你的Stream就已经被消费了。一旦方法返回,所有数据都将保存在内存中,您可以处理流。你可以在 LoadContent() 上看到这个.

正如您不想避免调用 Dispose 一样,因为您有一个 MemoryStream,并且知道稍后可以使用另一个需要 Dispose 的流。在调用 Add 之后处理您的 Stream 可能不是一个好主意。 如果将来库的行为发生变化,并且在调用 Add 时您的流还没有被消耗(我认为这是预期的行为)。

只有在将数据写入 NetworkSocket 时,流才会被读取。实际上是流式传输数据,无需将其全部加载到 RAM 中。

在这种情况下,您只能在调用 Mailkit.Send 后处理流。

关于c# - 发送带附件的电子邮件时,我应该处理 MimeKit 使用的流吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44486018/

相关文章:

scala - Scala 中无限流的嵌套迭代

c# - Mailkit 对 Imap 的身份验证失败

c# - MailKit:当 Gmail 设置“对话” View 时,消息不会从收件箱中删除

c# - GridView ObjectDataSource LINQ 分页和排序使用多表查询

c# - 当通过 C# 调用 C++ DLL 的导出类时,该类的 C 样式字符串成员在一个导出函数中是 OK,但在另一个函数中不是

c# - 在流中保存二进制数据

c# - 使用 MailKit 库保存附件?

c# - 如何将值从结构放置到数组?

C# .net 4.5 异步委托(delegate)

javascript - JavaScript 中的流