Zadałem tutaj kilka pytań, ale nadal mam problemy. Byłbym wdzięczny, gdybyś mógł mi powiedzieć, co robię źle w swoim kodzie. Uruchamiam powyższy kod ze strony ASP.Net i otrzymuję komunikat „Nie można uzyskać dostępu do zamkniętego strumienia”.
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
Dzięki!!!
EDYTOWAĆ:
Aby pomóc komuś, kto szuka odpowiedzi na to pytanie, kod do wysłania pliku pdf załączonego do e-maila bez konieczności fizycznego tworzenia pliku znajduje się poniżej (dzięki Ichiban i 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
źródło
źródło
position=0
. uratował mnie!Odpowiedzi:
Czy próbowałeś:
Jeśli moja pamięć dobrze mi służy, rozwiązało to podobny problem w poprzednim projekcie.
Zobacz http://forums.asp.net/t/1093198.aspx
źródło
writer.Flush()
?Wypróbowałem kod przesłany przez brianng i zadziałał. Po prostu zmień górę kodu na następującą:
źródło
Czy możesz opróżnić dokument lub strumień pamięci, a następnie zamknąć go po dołączeniu?
źródło
Prawdopodobnie wywołanie doc.Close () Usuwa źródłowy strumień. Spróbuj usunąć doc.Close () i zamiast tej linii ustaw memoryStream.Position = 0;
Alternatywnie możesz użyć pliku tymczasowego:
źródło
Miałem ten sam problem i wykorzystałem ten post do rozwiązania go w kodzie napisanym przez briannga
Myślę, zamiast pisać
Po prostu utwórz nowy strumień
a następnie zadzwoń
Oba działają, ale myślę, że lepiej jest utworzyć nowy strumień
źródło