Nicht auf einen geschlossenen stream beim senden der Anlage
Ich versuche zum senden von E-Mail mit attachment mit C#. Hier ist meine Methode:
public void SendEmail(string from, string to, SmtpClient client)
{
MailMessage mm = new MailMessage(from, to, "Otrzymałeś nowe zamówienie od "+from , "Przesyłam nowe zamówienie na sprzęt");
mm.BodyEncoding = UTF8Encoding.UTF8;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
//Adding attachment:
System.IO.MemoryStream ms = new System.IO.MemoryStream();
System.IO.StreamWriter writer = new System.IO.StreamWriter(ms);
writer.Write("Hello its my sample file");
writer.Flush();
writer.Dispose();
System.Net.Mime.ContentType ct = new System.Net.Mime.ContentType(System.Net.Mime.MediaTypeNames.Text.Plain);
System.Net.Mail.Attachment attach = new System.Net.Mail.Attachment(ms, ct);
attach.ContentDisposition.FileName = "myFile.txt";
mm.Attachments.Add(attach);
try
{
client.Send(mm);
}
catch(SmtpException e)
{
Console.WriteLine(e.ToString());
}
ms.Close();
}
stacktrace Punkte für diese Zeile:
client.Send(mm);
problem verursacht, indem Sie diese Zeile:
writer.Dispose();
Warum kann ich nicht über dieses element rechts, nachdem Sie es zu schreiben in MemoryStream
?
Dieses element nicht verwendet wird, einem späteren Zeitpunkt in den code.
- warum nicht versuchen
using
block. - Die Entsorgung der streamwriter verfügt AUCH über die zugrunde liegenden stream. Nennen Sie den Autor.Entsorgen Sie NACH der E-Mail gesendet wurde.
- Ich fand, dass, wenn der Betrieb auf
Stream
Objekte, dieusing
Schlüsselwort ist extrem nützlich. Wie @HassanNisar erwähnt, versuchen Sie es. Es macht den code um einiges lesbarer, und Sie sollten in der Lage sein, um zu vermeiden, die Ausnahme, Sie sind immer im moment. - Wie rene bereits erwähnt, schliessen oder durch ein StreamWriter, schließt auch die zugrunde liegende basestream (memorystream in diesem Fall). Wenn Sie brauchen, um die Wiederverwendung der gleichen memorystream, können Sie frei nach dem senden, wie vorgeschlagen, oder wenn Sie mit .net 4.5, können Sie erstellen Sie einen streamwriter, die Blätter der basestream öffnen Sie mit dem folgenden Konstruktor: msdn.microsoft.com/EN-US/library/....
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aufruf von Dispose auf die writer Verfügt auch über die zugrunde liegenden stream. Sie verfügen beide, der Schriftsteller und der Strom nach der E-Mail gesendet wurde. Sie erreichen das, indem er Ihren code in zwei using-Anweisungen.
Using-block verwenden, wie vorgeschlagen, in den Kommentaren:
Wenn
client.Send
zu senden versucht, wird es natürlich LesenAttachment
Punkte, die zu einemMemoryStream
die hat bereits geschlossenStreamWriter
. Sie können dies überprüfen, indem Inspektionms.CanRead
wird false zurückgegeben.Zugriff auf geschlossene stream Ausnahme auslösen, das ist, was du erlebst. Um es zu lösen einfach loswerden
writer.Dispose()
da gibt es nichts zu entsorgen mitMemoryStream
oder entsorgen Sie es nach Abschluss Ihrer Arbeit.