iTextSharp - отправка в формате PDF в виде вложения электронной почты
Я задал пару вопросов здесь, но у меня все еще есть проблемы. Буду признателен, если вы скажете мне, что я делаю неправильно в моем коде. Я запускаю приведенный выше код со страницы ASP.Net и получаю "Не удается получить доступ к закрытому потоку".
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("username@gmail.com", "username@gmail.com")
{
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("username@gmail.com", "my_password")
};
smtp.Send(mm); //the "Cannot Access a Closed Stream" error is thrown here
Спасибо!!!
РЕДАКТИРОВАТЬ:
Чтобы помочь кому-то найти ответ на этот вопрос, ниже приведен код для отправки pdf-файла, прикрепленного к электронному письму без физического создания файла (спасибо Ichiban и 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("username@gmail.com", "username@gmail.com")
{
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("username@gmail.com", "password")
};
smtp.Send(mm);
5 ответов
Ты пытался:
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"));
Если моя память мне не изменяет, это решило подобную проблему в предыдущем проекте.
Смотрите http://forums.asp.net/t/1093198.aspx
Я попробовал код, опубликованный brianng, и это сработало. Просто измените верхнюю часть кода на это:
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*/
Можете ли вы очистить документ или поток памяти, а затем закрыть его после прикрепления?
Возможно, вызов doc.Close() Удаляет основной поток. Попробуйте удалить doc.Close() и вместо этой строки установить memoryStream.Position = 0;
В качестве альтернативы вы можете использовать временный файл:
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("username@gmail.com", "username@gmail.com")
{
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("username@gmail.com", "my_password")
};
smtp.Send(mm);
}
finally
{
File.Delete(tempFilePath);
}
У меня была та же проблема, и я использовал этот пост, чтобы решить ее. В коде, написанном 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"));
Я думаю вместо того чтобы писать
writer.CloseStream = false and memoryStream.Position = 0;
Просто создайте новый поток
MemoryStream m = new MemoryStream(memoryStream);
а затем позвоните
mm.Attachments.Add(new Attachment(memoryStream, "test.pdf"));
Оба работают, но я думаю, что лучше создать новый поток