2010-01-29 33 views
7

Dự án của chúng tôi có các tệp được lưu trữ trong db máy chủ sql dưới dạng blobs. Tôi muốn lấy các tập tin từ cơ sở dữ liệu và đính kèm nhiều tập tin vào một email mà không cần ghi vào đĩa.đính kèm nhiều tệp vào một chương trình email mà không cần ghi vào đĩa

Đây là những gì tôi có cho đến nay (mọi thứ hoạt động ok, không có file đính kèm):

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

tôi nhận được các lỗi sau đây:

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) 

tôi sao chép hầu hết các mã dòng từ các ví dụ tôi tìm thấy trên web.

+0

1. không sử dụng tab (sử dụng khoảng trắng), giúp dễ dàng sửa định dạng cho web và 2. để đăng mã trên Stack Overflow, thụt lề mỗi dòng theo 4 dấu cách (bạn có thể chọn mã sau đó và nhấn Ctrl + K hoặc sử dụng nút trên thanh công cụ) –

Trả lời

10

Bạn đã tìm thấy lý do để không triển khai khối using: khi bạn vẫn sẽ sử dụng đối tượng sau khi chặn đã thoát. Lấy MemoryStream ra khỏi khối using.

+1

Your're right, khối sử dụng đang gây ra sự cố. Tôi redid nó để một cái gì đó như thế này: memorystream ms = null; if (Tôi có file đính kèm) ms = MemoryStream mới() Đỗ tạo tập tin đính kèm Send message if (ms! = Null) Do dọn dẹp Nhờ sự giúp đỡ của bạn. –

+2

Bạn đã sử dụng luồng bộ nhớ để xử lý nhiều tệp đính kèm như thế nào? Tôi đã tạo ra 1 và xử lý thủ công chúng nhưng tôi muốn xem nếu có một cách tốt hơn, và cũng để đảm bảo rằng tôi không tạo ra bất kỳ rò rỉ bộ nhớ nào - thx –

+0

Tôi có cùng một câu hỏi. – Kate

Các vấn đề liên quan