Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

attach multiple files to an email programticaly without writing to disk

Our project has files stored in a sql server db as blobs. I'd like to get the files from the database and attach multiple files to an email without writing to disk.

This is what I have so far(everything works ok, with no attachments):

// snip

List<System.Net.Mail.Attachment> attachments = null;
// Attachments is a child list of Messagebody object holding Attachment ids
MessageBody.Attachments = MessageBodyAttachmentList.GetMessageBodyAttachmentList(this.MessageBody.ID);

if (MessageBody.Attachments != null && MessageBody.Attachments.Count > 0)
{
    attachments = new List<Attachment>();

    foreach (Library.Entity.Messaging.MessageBodyAttachment att in MessageBody.Attachments)
    {
        using (MemoryStream memoryStream = new MemoryStream())
        {
            // create a new attachment
            Library.Attachments.Attachment attachment = Library.Attachments.Attachment.GetAttachment(att.AttachmentID);

            byte[] contentAsBytes = attachment.FileData;// FileData holds byte[] that is the contents of the file
            memoryStream.Write(contentAsBytes, 0, contentAsBytes.Length);
            memoryStream.Seek(0, SeekOrigin.Begin);

            // content type for file info
            ContentType contentType = new ContentType();
            contentType.MediaType = MediaTypeNames.Application.Octet;
            contentType.Name = attachment.FileName;

            // create the .Net specific attachment
            Attachment netAttachment = new Attachment(memoryStream, contentType);
            attachments.Add(netAttachment);

            memoryStream.Position = 0;
        }
    }
}

response = message.SendMessage(_recipient, _sender, _cc, _bcc, MessageBody.Subject, MessageBody.Body, true, attachments);
// snip

public string SendMessage(string to, string from, string cc, string bcc, string subject, string body, bool IsHtml,  List<Attachment> attachments)
{
    string response = String.Empty;
    System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage(from, to, subject, body);

    // Add the attachments
    if (attachments != null)
    {
        foreach (Attachment a in attachments)
            message.Attachments.Add(a);
    }

    message.IsBodyHtml = IsHtml;

    if (IsHtml)
    {
        // snip
    }

    try
    {
        _client.Timeout = 500000;
        _client.Send(message);
    }
    catch (SmtpException smtpex)
    {
        response = smtpex.Message;
    }
    catch (System.Exception ex)
    {
        response = ex.Message;
    }
    return response;
}

I'm getting the following errors:

exception message: Failure sending mail.
source: System
stack trace:
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   at MyCompany.Shared.Email.SMTPMessage.SendMessage(String to, String from, String cc, String bcc, String subject, String body, Boolean IsHtml, List`1 attachments) in C:\svn_repos\branches\2010.02.28\Net\Common\Shared\Email\SMTPMessage.cs:line 116

inner exception msg: Cannot access a closed Stream.
inner source: mscorlib
inner targetsite: {Void StreamIsClosed()}
inner stack trace:
   at System.IO.__Error.StreamIsClosed()
   at System.IO.MemoryStream.Read(Byte[] buffer, Int32 offset, Int32 count)
   at System.Net.Mime.MimePart.Send(BaseWriter writer)
   at System.Net.Mime.MimeMultiPart.Send(BaseWriter writer)
   at System.Net.Mail.Message.Send(BaseWriter writer, Boolean sendEnvelope)
   at System.Net.Mail.MailMessage.Send(BaseWriter writer, Boolean sendEnvelope)
   at System.Net.Mail.SmtpClient.Send(MailMessage message)

I copied most of the stream code from examples I found on the web.

like image 771
Chris L Avatar asked Jan 29 '10 23:01

Chris L


People also ask

What is the best way to send multiple attachments via email?

The easiest way to send multiple files at the same time is to place all of the files into a compressed folder. Also called a "Zipped" folder, this lets many files act like one. You can upload all of the files as a single attachment, and the person on the other end can download them as a single attachment as well.

How do I attach multiple files to an email in Outlook?

Tips: If you need to attach multiple files from the same hard folder, you can open the folder in the Insert File dialog, click to select multiple files simultaneously with holding Ctrl or Shift key, and then click the Insert button. Now the specified file has been attached in the current message composing window. 4.

How do I attach multiple files?

When you open the folder where the files are stored, select one and then press and hold the Ctrl Key down while you click each file you want to attach. When you are finished click the Open Button and all of the selected files will be attached.


1 Answers

You've found a reason to not implement a using block: when you're still going to use the object after the block has exited. Take the MemoryStream out of the using block.

like image 85
John Saunders Avatar answered Oct 20 '22 16:10

John Saunders