2013-11-14 113 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;