visual studio por masivos form envio enviar electronico diferentes correos correo con como archivos archivo adjuntos adjunto c# email pdf itextsharp

c# - studio - iTextSharp: envío de pdf en memoria en un archivo adjunto de correo electrónico



enviar pdf por correo c# (5)

He hecho algunas preguntas aquí, pero sigo teniendo problemas. Te agradecería si pudieras decirme qué estoy haciendo mal en mi código. Ejecuto el código anterior desde una página ASP.Net y obtengo "No puedo acceder a un flujo cerrado".

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

¡¡¡Gracias!!!

EDITAR:

Para ayudar a alguien a buscar la respuesta a esta pregunta, debajo está el código para enviar un archivo pdf adjunto a un correo electrónico sin tener que crear físicamente el archivo (gracias a Ichiban y 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);


¿Puedes vaciar el documento o la secuencia de la memoria y luego cerrarlo después de colocarlo?


Has probado:

PdfWriter writer = PdfWriter.GetInstance(doc, memoryStream); // Build pdf code... writer.CloseStream = false; doc.Close(); // Build email memoryStream.Position = 0; mm.Attachments.Add(new Attachment(memoryStream, "test.pdf"));

Si mi memoria me sirve correctamente, esto resolvió un problema similar en un proyecto anterior.

Ver http://forums.asp.net/t/1093198.aspx


Probablemente llamar a doc.Close () Elimina la transmisión subyacente. Intente eliminar doc.Close () y en lugar de esa línea configure memoryStream.Position = 0;

Alternativamente puede usar un archivo temporal:

var tempFilePath = Path.GetTempFileName(); try { var doc = new Document(); PdfWriter.GetInstance(doc, File.OpenWrite(tempFilePath)); doc.Open(); doc.Add(new Paragraph("First Paragraph")); doc.Add(new Paragraph("Second Paragraph")); doc.Close(); MailMessage mm = new MailMessage("[email protected]", "[email protected]") { Subject = "subject", IsBodyHtml = true, Body = "body" }; mm.Attachments.Add(new Attachment(tempFilePath, "test.pdf")); SmtpClient smtp = new SmtpClient { Host = "smtp.gmail.com", Port = 587, EnableSsl = true, Credentials = new NetworkCredential("[email protected]", "my_password") }; smtp.Send(mm); } finally { File.Delete(tempFilePath); }


Tuve el mismo problema y utilicé esta publicación para resolverlo. En el código escrito por brianng

PdfWriter writer = PdfWriter.GetInstance(doc, memoryStream); // Build pdf code... writer.CloseStream = false; doc.Close(); // Build email memoryStream.Position = 0; mm.Attachments.Add(new Attachment(memoryStream, "test.pdf"));

Creo que en lugar de escribir

writer.CloseStream = false and memoryStream.Position = 0;

Solo crea una nueva secuencia

MemoryStream m = new MemoryStream(memoryStream);

y luego llamar

mm.Attachments.Add(new Attachment(memoryStream, "test.pdf"));

Ambos funcionan, pero creo que es mejor crear la nueva secuencia


brianng el código publicado por brianng y funcionó. Simplemente cambie la parte superior del código a esto:

var doc = new Document(); MemoryStream memoryStream = new MemoryStream(); PdfWriter writer = PdfWriter.GetInstance(doc, memoryStream); //capture the object doc.Open(); doc.Add(new Paragraph("First Paragraph")); doc.Add(new Paragraph("Second Paragraph")); writer.CloseStream = false; //set the closestream property doc.close(); //close the document without closing the underlying stream memoryStream.Position = 0; /* remainder of your code stays the same*/