Я задал здесь пару вопросов, но проблемы все еще возникают. Буду признателен, если вы скажете мне, что я делаю неправильно в своем коде. Я запускаю приведенный выше код со страницы 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, прикрепленного к электронному письму, без необходимости его физического создания (спасибо Ичибану и Бриангу):
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);
c#
email
pdf
itextsharp
Гас Кавальканти
источник
источник
position=0
. спас меня!Ответы:
Ты пробовала:
Если мне не изменяет память, это решило аналогичную проблему в предыдущем проекте.
См. Http://forums.asp.net/t/1093198.aspx
источник
writer.Flush()
тогда?Я попробовал код, опубликованный brianng, и он сработал. Просто измените верхнюю часть кода на это:
источник
Можете ли вы очистить документ или поток памяти, а затем закрыть его после прикрепления?
источник
Вероятно, вызов doc.Close () удаляет базовый поток. Попробуйте удалить doc.Close () и вместо этой строки установите memoryStream.Position = 0;
В качестве альтернативы вы можете использовать временный файл:
источник
У меня была такая же проблема, и я использовал этот пост, чтобы решить ее. В коде, написанном brianng
Я думаю вместо того, чтобы писать
Просто создайте новый поток
а потом позвони
Оба работают, но я думаю, что лучше создать новый поток
источник