2013-11-14 2 views
1
MemoryStream ms = new MemoryStream(); 
       PrintableComponentLink pcl = new PrintableComponentLink(new PrintingSystem()); 
       pcl.Component = ASPxGridViewExporter1; 
       pcl.Margins.Left = pcl.Margins.Right = 50; 
       pcl.Landscape = true; 
       pcl.CreateDocument(false); 
       pcl.PrintingSystem.Document.AutoFitToPagesWidth = 1; 
       pcl.ExportToPdf(ms); 

MailMessage mailMsg = new MailMessage(); 
      mailMsg.To.Add("[email protected]"); 


      MailAddress mailAddress = new MailAddress("[email protected]"); 
      mailMsg.From = mailAddress; 


      mailMsg.Subject = ""; 
      mailMsg.Body = ""; 

      System.Net.Mime.ContentType ct = new System.Net.Mime.ContentType(System.Net.Mime.MediaTypeNames.Application.Pdf); 
      System.Net.Mail.Attachment attach = new System.Net.Mail.Attachment(ms, "x.pdf"); 



      mailMsg.Attachments.Add(attach); 


      SmtpClient smtpClient = new SmtpClient("192.168.1.200", 25); 
      smtpClient.UseDefaultCredentials = false; 
      smtpClient.Send(mailMsg); 

      ms.Close(); 

И я получаю файл 153B в приложении.Отправка памятного сообщения по почте

Где я ошибаюсь?

+0

Оберните 'pcl' в инструкцию' using', и после того, как это будет сделано, убедитесь, что 'ms' очищено и сброшено, чтобы быть готовым к чтению. –

+0

@TimS. проблема с «использованием» ... –

ответ

0

Скорее всего ms.Position = 0 перед присоединением потока позаботится об этом.

Меньше вероятность, но возможно не закрытие/удаление потока будет необходимо (но я не думаю, что это случай синхронной отправки почты).

Сторона примечания: у меня будет отдельный MemoryStream для записи и чтения/отправки. Простое создание потока только для чтения поверх буфера исходного потока сделает код более понятным и понятным. Пример ниже, а также его лучше использовать другой конструктор, который принимает буфер + длину вместо копии:

var streamToSend = new MemoryStream(ms.ToArray()); 
0

Я думаю, что вам нужно, чтобы передать ваши MemoryStream и ContentType к вашей привязанности, а не MemoryStream и имя PDF. Также убедитесь, что мс установлен в положение 0.

Попробуйте заменить эти строки

System.Net.Mime.ContentType ct = new System.Net.Mime.ContentType(System.Net.Mime.MediaTypeNames.Application.Pdf); 
System.Net.Mail.Attachment attach = new System.Net.Mail.Attachment(ms, "x.pdf"); 
mailMsg.Attachments.Add(attach); 

С следующее:

ms.Seek(0, SeekOrigin.Begin); 
System.Net.Mime.ContentType ct= new System.Net.Mime.ContentType(); 
ct.MediaType = System.Net.Mime.MediaTypeNames.Application.Pdf; 
ct.Name = "x.pdf"; 

Attachment attach = new Attachment(ms, contentType); 
mailMsg.Attachments.Add(attach); 
0

Не использовать MemoryStream в качестве дополнения. ExportToPdf принимает типы, полученные из Stream. Вместо этого экспортируйте PDF в FileStream.

pcl.ExportToPdf(fileStream);

Затем прикрепите FileStream и правильный MIME тип:

var attach = new System.Net.Mail.Attachment(fileStream, "x.pdf", MediaTypeNames.Application.Pdf);

Просто удалить временный файл, он будет создан в процессе. По какой-либо причине MemoryStream не работает для вложений здесь, даже если вы установили MemoryStream.Position = 0;

Смежные вопросы