在.NET中从数据库映像列将多个文件附加到电子邮件

Mad*_*ing 4 .net c# database email attachment

有没有关于如何将数据库中的多个文件附加到.NET中的电子邮件的好例子?我有一个返回字节[]包含我在一个循环我打电话让每个附件Image列内容的方法,但我想知道是否有这样做的"正确" /最佳实践方法,尤其是有可能通过使用MemoryStreams来包含数据引入内存泄漏?我没事创建连接电子邮件的对象和附件列表中连接到它,一旦我有他们能做到这一点罚款单attachement但它似乎变得有多个文件稍微复杂一些.考虑到我不会认为这是一个不寻常的要求,似乎缺乏关于它的文章/帖子.

Thx - MH

Dar*_*rov 8

这是如何进行的.假设您有一个从数据库加载的附件数组:

IEnumerable<byte[]> attachments = ... fetch from your database
Run Code Online (Sandbox Code Playgroud)

我们还可以安全地假设您连同这些附件一起加载了文件名,可能还有相应的MIME类型(您肯定必须保留的信息以及表示附件的字节数组).所以你可能已经获得了,IEnumerable<SomeAttachmentType>但这对于这篇文章来说并不重要.

所以现在你可以发送邮件:

using (var client = new SmtpClient("smtp.foo.com"))
using (var message = new MailMessage("from@foo.com", "to@bar.com"))
{
    message.Subject = "test subject";
    message.Body = "test body";
    message.IsBodyHtml = false;
    foreach (var attachment in attachments)
    {
        var attachmentStream = new MemoryStream(attachment);
        // TODO: Choose a better name for your attachments and adapt the MIME type
        var messageAttachment = new Attachment(attachmentStream, Guid.NewGuid().ToString(), "application/octet-stream");
        message.Attachments.Add(messageAttachment);
    }
    client.Send(message);
}
Run Code Online (Sandbox Code Playgroud)

这是交易:

A MailMessage(IDisposable)包含多个Attachments(IDisposable).每个附件都引用一个MemoryStream(IDisposable).MailMessage包含在一个using中block,它确保调用其Dispose方法,然后调用所有附件的Dispose方法,后者又调用内存流的Dispose方法.