Ich habe hier ein paar Fragen gestellt, habe aber immer noch Probleme. Ich würde mich freuen, wenn Sie mir sagen könnten, was ich in meinem Code falsch mache. Ich führe den obigen Code von einer ASP.Net-Seite aus und erhalte die Meldung "Kann nicht auf einen geschlossenen Stream zugreifen".
var doc = new Document();
MemoryStream memoryStream = new MemoryStream();
PdfWriter.GetInstance(doc, memoryStream);
doc.Open();
doc.Add(new Paragraph("First Paragraph"));
doc.Add(new Paragraph("Second Paragraph"));
doc.Close(); //if I remove this line the email attachment is sent but with 0 bytes
MailMessage mm = new MailMessage("[email protected]", "[email protected]")
{
Subject = "subject",
IsBodyHtml = true,
Body = "body"
};
mm.Attachments.Add(new Attachment(memoryStream, "test.pdf"));
SmtpClient smtp = new SmtpClient
{
Host = "smtp.gmail.com",
Port = 587,
EnableSsl = true,
Credentials = new NetworkCredential("[email protected]", "my_password")
};
smtp.Send(mm); //the "Cannot Access a Closed Stream" error is thrown here
Vielen Dank!!!
BEARBEITEN:
Um jemandem bei der Suche nach der Antwort auf diese Frage zu helfen, finden Sie unten den Code zum Senden einer an eine E-Mail angehängten PDF-Datei, ohne die Datei physisch erstellen zu müssen (danke an Ichiban und Brianng):
var doc = new Document();
MemoryStream memoryStream = new MemoryStream();
PdfWriter writer = PdfWriter.GetInstance(doc, memoryStream);
doc.Open();
doc.Add(new Paragraph("First Paragraph"));
doc.Add(new Paragraph("Second Paragraph"));
writer.CloseStream = false;
doc.Close();
memoryStream.Position = 0;
MailMessage mm = new MailMessage("[email protected]", "[email protected]")
{
Subject = "subject",
IsBodyHtml = true,
Body = "body"
};
mm.Attachments.Add(new Attachment(memoryStream, "filename.pdf"));
SmtpClient smtp = new SmtpClient
{
Host = "smtp.gmail.com",
Port = 587,
EnableSsl = true,
Credentials = new NetworkCredential("[email protected]", "password")
};
smtp.Send(mm);
c#
email
pdf
itextsharp
Gus Cavalcanti
quelle
quelle
position=0
. rettete mich!Antworten:
Hast du es versucht:
Wenn mein Gedächtnis mir richtig dient, hat dies ein ähnliches Problem in einem früheren Projekt gelöst.
Siehe http://forums.asp.net/t/1093198.aspx
quelle
writer.Flush()
dann tun ?Ich habe den Code von brianng ausprobiert und es hat funktioniert. Ändern Sie einfach den oberen Rand des Codes wie folgt:
quelle
Können Sie spülen Sie das Dokument oder Speicherstrom und schließen Sie es dann , nachdem Sie es anhängen?
quelle
Wahrscheinlich wird doc.Close () aufgerufen. Entspricht dem zugrunde liegenden Stream. Versuchen Sie, doc.Close () zu entfernen, und setzen Sie anstelle dieser Zeile memoryStream.Position = 0;
Alternativ können Sie eine temporäre Datei verwenden:
quelle
Ich hatte das gleiche Problem und habe diesen Beitrag verwendet, um es zu lösen. In dem von brianng geschriebenen Code
Ich denke anstatt zu schreiben
Erstellen Sie einfach einen neuen Stream
und dann anrufen
Beide funktionieren, aber ich denke, es ist besser, den neuen Stream zu erstellen
quelle