Hängen Sie eine Datei aus MemoryStream zu einer MailMessage in C#
Ich Schreibe an einem Programm, um eine Datei Anhängen zu E-Mail. Derzeit bin ich beim speichern der Datei mit FileStream
in der Festplatte, und dann benutze ich
System.Net.Mail.MailMessage.Attachments.Add(
new System.Net.Mail.Attachment("file name"));
Will ich nicht zum speichern der Datei in der Festplatte, die ich speichern möchten Datei in den Speicher und vom Speicher-stream übergeben Sie diese zu Attachment
.
InformationsquelleAutor Zain Ali | 2011-03-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist der Beispielcode.
Bearbeiten 1
Können Sie festlegen, dass andere Dateitypen, die durch das System.Net.Mime.MimeTypeNames wie
System.Net.Mime.MediaTypeNames.Application.Pdf
Basierend auf Mime-Typ müssen Sie die richtige Erweiterung in den Dateinamen für die Instanz
"myFile.pdf"
Sie benötigen
System.Net.Mime.MediaTypeNames.Application.Pdf
writer.Disopose()
war zu früh für meine Lösung, aber all das andere große Beispiel.Ich bin mir ziemlich sicher, es sollte eine
ms.Position = 0;
vor der Erstellung der Anlage.InformationsquelleAutor Waqas Raja
Etwas verspäteter Eintrag, aber hoffentlich immer noch nützlich, um jemand da draußen:-
Hier ist eine vereinfachte snippet für das senden einer in-memory-string als E-Mail-Anhang (CSV-Datei, in diesem Fall).
Den StreamWriter und den zugrunde liegenden stream sollte nicht entsorgt werden, bis, nachdem die Nachricht gesendet wurde (um zu vermeiden
ObjectDisposedException: Cannot access a closed Stream
).stream.position = 0;
+1 für die entsprechende Nutzung zu verwenden()'s -- etwas, das scheint immer zu fehlen Beispiele und snippets online (einschließlich der akzeptierten Antworten auf diese Frage).
Dank @m.t.bennet, das war auch mein problem - Einstellung
stream.Position=0
.InformationsquelleAutor tranquil tarn
Da konnte ich nicht Bestätigung findet dieses überall, die ich getestet habe, wenn die Entsorgung der MailMessage-und/oder der Anlage-Objekt entsorgen würde der stream geladen in Sie, wie ich erwartete, passieren würde.
Scheint es mit dem folgenden test, wenn die MailMessage-ist entsorgt, alle Ströme verwendet, um Anhänge zu erstellen wird auch entsorgt werden. So lange, wie Sie entsorgen Ihre MailMessage die Ströme, die ging in die Schaffung Sie nicht brauchen, Umgang mit darüber hinaus.
Ich wünschte, dies war tatsächlich dokumentiert. Ihr test/Verifikation dieses Verhalten nützlich ist, aber ohne in der offiziellen Dokumentation ist es schwer zu glauben, dass dies immer der Fall sein wird. Trotzdem, vielen Dank für das testen.
Gut, Mühe und Forschung @Thymin
es ist eine Art dokumentiert, wenn die Referenz-Quelle zählt. mailmessage.entsorgen ruft "Anlagen".entsorgen die wiederum ruft entsorgen, die auf jeder Anlage, die in mimepart, schließt den stream.
InformationsquelleAutor Thymine
Wenn Sie wirklich wollen, hinzufügen .pdf, ich fand es auch notwendig, die position des Speicher-stream zu Null.
InformationsquelleAutor Jason Dimmick
Wenn alles, was Sie tun, ist das anbringen einer Schnur, können Sie es in nur 2 Linien:
War ich nicht in der Lage zu mir zu bekommen, um die Arbeit mit unserer E-mail-server mit StreamWriter.
Ich denke, vielleicht, weil mit StreamWriter-Sie verpassen eine Menge von Datei-Eigenschaft-Informationen und vielleicht ist unser server nicht gefällt, was fehlte.
Mit Attachment.CreateAttachmentFromString() erstellt alles, was ich brauchte und funktioniert Super!
Ansonsten würde ich empfehlen Ihnen, die Datei im Speicher und öffnen Sie es mit MemoryStream(byte[]), und das überspringen der StreamWriter alle zusammen.
InformationsquelleAutor MikeTeeVee
Landete ich auf diese Frage, weil ich brauchte, um zu befestigen Sie eine Excel-Datei, die ich generieren durch den code und steht als
MemoryStream
. Ich könnte befestigen Sie es an die E-mail-Nachricht, aber es wurde geschickt als 64Bytes-Datei anstelle der ~6KB, wie es gemeint war. So, die Lösung, die für mich gearbeitet wurde:Einstellung der Wert von
attachment.ContentDisposition.Size
lassen Sie mich senden von Nachrichten mit der richtigen Größe der Anlage.InformationsquelleAutor ilForna
nutzen ANDERE OPEN-memorystream:
Beispiel für lauch-pdf-und senden Sie pdf in MVC4-C# - Controller
stream.Position=0;
ist die Linie, die mir geholfen haben. ohne es meine attcahment war nur 504 bytes nur einige kBsInformationsquelleAutor Ángel Ibáñez
Ich denke, dass dieser code Ihnen helfen:
InformationsquelleAutor r12