Eu fiz algumas perguntas aqui, mas ainda estou tendo problemas. Eu apreciaria se você pudesse me dizer o que estou fazendo de errado no meu código. Eu executo o código acima de uma página ASP.Net e recebo "Não é possível acessar um fluxo fechado".
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
Obrigado!!!
EDITAR:
Só para ajudar quem está procurando a resposta a esta pergunta, segue abaixo o código para enviar um arquivo pdf anexado a um e-mail sem ter que criar fisicamente o arquivo (obrigado a Ichiban e 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
fonte
fonte
position=0
. me salvou!Respostas:
Você tentou:
Se minha memória não me falha, isso resolveu um problema semelhante em um projeto anterior.
Veja http://forums.asp.net/t/1093198.aspx
fonte
writer.Flush()
isso?Tentei o código postado por brianng e funcionou. Basta alterar o topo do código para este:
fonte
Você pode liberar o documento ou fluxo de memória e fechá-lo depois de anexá-lo?
fonte
Provavelmente chamando doc.Close () descarta o fluxo subjacente. Tente remover doc.Close () e em vez dessa linha defina memoryStream.Position = 0;
Como alternativa, você pode usar um arquivo temporário:
fonte
Tive o mesmo problema e usei este post para resolvê-lo. No código escrito por brianng
Eu penso em vez de escrever
Basta criar um novo fluxo
e então ligar
Ambos funcionam, mas acho que é melhor criar o novo fluxo
fonte