Вот как это сделать. Предположим, у вас есть массив вложений, загруженных из вашей базы данных:
IEnumerable<byte[]> attachments = ... fetch from your database
Мы могли бы также с уверенностью предположить, что наряду с этими вложениями вы загрузили имена файлов и, возможно, их соответствующий тип 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);
}
Вот сделка:
A MailMessage
(IDisposable) содержит несколько Attachments
(IDisposable). Каждое вложение ссылается на MemoryStream
(IDisposable). MailMessage заключено в использование block
, которое гарантирует, что будет вызван его метод Dispose, который, в свою очередь, вызывает метод Dispose для всех вложений, которые, в свою очередь, вызывают метод Dispose для потоков памяти.