2012-04-19 11 views
6

Używam System.Net.Mail do wysyłania wiadomości e-mail za pośrednictwem mojej aplikacji. Próbowałem wysyłać wiadomości e-mail z załącznikami za pomocą następującego kodu.Wyślij e-mail z Attchement przy użyciu System.Net.Mail

Collection<string> MailAttachments = new Collection<string>(); 
    MailAttachments.Add("C:\\Sample.JPG"); 
    mailMessage = new MailMessage(); 
    foreach (string filePath in emailNotificationData.MailAttachments) 
    { 
     FileStream fileStream = File.OpenWrite(filePath); 
     using (fileStream) 
     { 
     Attachment attachment = new Attachment(fileStream, filePath); 
     mailMessage.Attachments.Add(attachment); 
     } 
    } 
    SmtpClient smtpClient = new SmtpClient(); 
    smtpClient.Host = SmtpHost; 
    smtpClient.Send(mailMessage); 

Kiedy wysyłam e-maile z załącznikami, zgłaszam wyjątki w następujący sposób.

Cannot access a closed file. 
at System.IO.__Error.FileNotOpen() 
at System.IO.FileStream.Read(Byte[] array, 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) 

Odpowiedz

11

Końcówka nawias klamrowy z wyciągu using zamyka strumień pliku:

using (fileStream) 
{ 
    Attachment attachment = new Attachment(fileStream, filePath); 
    mailMessage.Attachments.Add(attachment); 
} // <-- file stream is closed here 

Jednak strumień jest czytać w czasie stmpClient.Send(mailMessage), gdzie nie jest już otwarte.

Najprostszym rozwiązaniem jest dostarczenie tylko nazwę pliku zamiast strumienia:

Collection<string> MailAttachments = new Collection<string>(); 
MailAttachments.Add("C:\\Sample.JPG"); 

mailMessage = new MailMessage(); 
foreach (string filePath in emailNotificationData.MailAttachments) 
{ 
    Attachment attachment = new Attachment(filePath); 
    mailMessage.Attachments.Add(attachment); 
} 
SmtpClient smtpClient = new SmtpClient(); 
smtpClient.Host = SmtpHost; 
smtpClient.Send(mailMessage); 

Dzięki takiemu rozwiązaniu, biblioteki .NET będzie musiał martwić się o otwarcie, czytanie i zamykania pliku.

+0

Gotowe ... Usunąłem strumień plików – udaya726