2010-01-29 11 views
7

Projemiz, sql server db'de blob olarak saklanan dosyalara sahiptir. Dosyaları veritabanından almak ve diske yazmadan bir e-postaya birden çok dosya eklemek istiyorum. diske yazmadan bir program için bir e-postaya birden çok dosya ekleyin

Bu

(her şey hiçbir ekleri ile ok çalışır) Bugüne kadar ne var:

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) 

ben dere kodunun en kopyalanan: Ben aşağıdaki hataları alıyorum

// 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; 
} 

internette bulduğum örneklerden.

+0

1. Sekmeleri kullanmayın (boşluk kullanın), web için biçimlendirmeyi daha kolay hale getirmeyi ve 2. Yığın Taşması üzerine kod yayınlamayı, her satırı 4 boşlukla girmeyi (sonra kodu seçip Ctrl'ye basabilirsiniz) kullanmayın + K veya araç çubuğu düğmesini kullanın) –

cevap

10

using bloğunu uygulamamanın bir sebebi var: bloğu çıktıktan sonra hala nesneyi kullanacaksanız. MemoryStream'u using bloğundan alın.

+1

Doğru, kullanım bloğu sorunlara neden oluyordu. Bunu şu şekilde değiştirdim: memorystream ms = null; if (ı ekleri var) ms = new MemoryStream() Do eki oluşturma Mesaj gönder (ms! = Null) temizleme Yardımlarınız için Teşekkür yapın eğer. –

+2

Birden çok eki işlemek için bellek akışını nasıl kullandınız? Her biri için 1 tane yarattım ve elden çıkardım ama daha iyi bir yol olup olmadığını görmek istedim ve ayrıca herhangi bir bellek sızıntısı yaratmadığımdan emin olmak istedim - thx –

+0

Aynı soruya sahibim. – Kate

İlgili konular