2013-11-14 114 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'已刷新并重置为准备好读取,因此MemoryStream无法在附件中工作。 –

+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接受从流派生的类型。相反,将PDF导出到FileStream

pcl.ExportToPdf(fileStream);

然后装上的FileStream和正确的MIME类型:

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

只要删除临时文件就会在这个过程中创造。无论什么原因,即使您设置了MemoryStream.Position = 0;