Вопрос по c# – Отправить письмо с привязкой с помощью System.Net.Mail

8

Я использую System.Net.Mail для отправки электронных писем через свое приложение. Я пытался отправить электронное письмо с вложенными файлами со следующим кодом.

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

Когда я отправляю электронные письма с вложениями, они создают следующие исключения.

<code>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)
</code>

Ваш Ответ

1   ответ
13

Конечная фигурная скобка твоегоusing оператор закрывает файловый поток:

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

Однако поток читается во времяstmpClient.Send(mailMessage), где он больше не открыт.

Самое простое решение - предоставить только имя файла вместо потока:

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

При таком решении библиотеке .NET придется беспокоиться об открытии, чтении и закрытии файла.

Готово ... Я удалил поток файлов udaya726

Похожие вопросы