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("n@x.net");


            MailAddress mailAddress = new MailAddress("info@x.net");
            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 文件。

我哪里错了?

4

3 回答 3

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;

于 2013-11-14T18:04:14.960 回答
0

很可能ms.Position = 0在附加流之前会处理它。

不太可能,但可能不需要关闭/处理流(但我不认为这是同步发送邮件的情况)。

旁注:我有单独MemoryStream的写作和阅读/发送。仅在原始流的缓冲区上创建只读流将使代码更清晰/更易于推理。下面的示例,也最好使用其他采用缓冲区+长度而不是复制的构造函数:

   var streamToSend = new MemoryStream(ms.ToArray()); 
于 2013-11-14T16:59:49.593 回答
0

我认为您需要将 MemoryStream 和 ContentType 传递给附件,而不是 Memorystream 和 PDF 名称。还要确保 ms 设置为位置 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);
于 2013-11-14T17:12:47.310 回答