2012-04-19 32 views
6

Estoy usando System.Net.Mail para enviar correos electrónicos a través de mi aplicación. Estaba tratando de enviar correos electrónicos con los archivos adjuntos con el siguiente código.Enviar correo electrónico con attchement usando 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); 

Cuando envío los correos electrónicos con los archivos adjuntos, arrojo una excepción de la siguiente manera.

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) 

Respuesta

11

La llave de cierre final de su declaración de using cierra el flujo de archivo:

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

Sin embargo, la corriente se lee en el momento de la stmpClient.Send(mailMessage), donde no se abra más.

La solución más sencilla es proporcionar sólo el nombre de archivo en lugar de una corriente:

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); 

Con esta solución, la biblioteca .NET tendrá que preocuparse de abrir, leer y cerrar el archivo.

+0

Listo ... He eliminado la secuencia de archivos – udaya726

Cuestiones relacionadas