Ich schreibe ein Programm, um eine Datei an eine E-Mail anzuhängen. Derzeit speichere ich Datei mit FileStream
auf Festplatte, und dann verwende ich
System.Net.Mail.MailMessage.Attachments.Add(
new System.Net.Mail.Attachment("file name"));
Ich möchte keine Datei auf der Festplatte speichern, ich möchte eine Datei im Speicher speichern und diese vom Speicherstrom an weiterleiten Attachment
.
c#
email
smtp
memorystream
Zain Ali
quelle
quelle
System.Net.Mime.MediaTypeNames.Application.Pdf
writer.Disopose()
war zu früh für meine Lösung, aber alles andere ist ein gutes Beispiel.ms.Position = 0;
vor dem Erstellen des Anhangs einen geben sollte.Ein bisschen verspäteter Eintrag - aber hoffentlich immer noch nützlich für jemanden da draußen: -
Hier ist ein vereinfachtes Snippet zum Senden einer speicherinternen Zeichenfolge als E-Mail-Anhang (in diesem speziellen Fall eine CSV-Datei).
Der StreamWriter und der zugrunde liegende Stream sollten erst nach dem Senden der Nachricht entsorgt werden (um dies zu vermeiden
ObjectDisposedException: Cannot access a closed Stream
).quelle
stream.position = 0;
stream.Position=0
.Da ich nirgendwo eine Bestätigung dafür finden konnte, habe ich getestet, ob das Entsorgen der MailMessage und / oder des Attachment-Objekts den in sie geladenen Stream wie erwartet entsorgen würde.
Beim folgenden Test wird angezeigt, dass beim Entsorgen der MailMessage alle zum Erstellen von Anhängen verwendeten Streams ebenfalls entsorgt werden. Solange Sie Ihre MailMessage entsorgen, müssen die Streams, mit denen sie erstellt wurden, nicht darüber hinaus verarbeitet werden.
quelle
Wenn Sie tatsächlich eine PDF-Datei hinzufügen möchten, musste die Position des Speicherstroms auf Null gesetzt werden.
quelle
Wenn Sie nur eine Zeichenfolge anhängen, können Sie dies in nur zwei Zeilen tun:
Ich konnte meine mit StreamWriter nicht über unseren Mailserver zum Laufen bringen.
Ich denke, vielleicht, weil Sie mit StreamWriter viele Informationen zu Dateieigenschaften vermissen und unser Server vielleicht nicht mochte, was fehlte.
Mit Attachment.CreateAttachmentFromString () wurde alles erstellt, was ich brauchte, und es funktioniert großartig!
Andernfalls würde ich vorschlagen, Ihre im Speicher befindliche Datei mit MemoryStream (Byte []) zu öffnen und den StreamWriter insgesamt zu überspringen.
quelle
Ich bin auf diese Frage gestoßen, weil ich eine Excel-Datei anhängen musste, die ich über Code generiere und die als verfügbar ist
MemoryStream
. Ich konnte es an die E-Mail-Nachricht anhängen, aber es wurde als 64-Byte-Datei anstelle von ~ 6 KB gesendet, wie es gemeint war. Die Lösung, die für mich funktioniert hat, war folgende:Festlegen des Werts von
attachment.ContentDisposition.Size
Lassen Sie mich Nachrichten mit der richtigen Größe des Anhangs senden.quelle
Verwenden Sie ANDEREN OFFENEN Memorystream:
Beispiel für lauch pdf und pdf in MVC4 C # Controller senden
quelle
stream.Position=0;
ist die Linie, die mir geholfen hat. ohne sie war meine attcahment nur 504 Bytes von einigen kBs instaedIch denke, dieser Code wird Ihnen helfen:
quelle