从字节数组中获取要作为附件发送的文件

我有一个ASP.NET MVC应用程序,必须向收件人列表发送一封电子邮件,其中附件详细说明了特定的“项目”。 我通过使用SQL Server Reporting Services(SSRS)从报告中获取详细信息。

我之前从未真正使用过SSRS,但是我收到了他使用过它的同事的一些代码。 他对报告的处理是将其在浏览器中下载到客户端的计算机上。 所以,如果我不这样做,我会坐在一个包含报告数据的字节数组中。

有没有办法在不首先将文件物理写入服务器的文件系统的情况下将其作为附件发送? 该报告将采用excel格式或pdf格式。

编辑:我正在使用SmtpClient发送电子邮件。

要做到这一点,您需要利用SSRS ReportManager API,如下所示。

  1. 首先使用SSRS从Web服务的报告中读取
  2. 将文件读入内存而不是保存到服务器或客户端
  3. 将MemoryStream对象直接发送到电子邮件服务器。

报告服务:获取生成的报告的PDF 如何使用SmtpClient.SendAsync发送带附件的电子邮件?

 string strReportUser = "RSUserName"; string strReportUserPW = "MySecretPassword"; string strReportUserDomain = "DomainName"; string sTargetURL = "http://SqlServer/ReportServer?" + "/MyReportFolder/Report1&rs:Command=Render&rs:format=PDF&ReportParam=" + ParamValue; HttpWebRequest req = (HttpWebRequest)WebRequest.Create( sTargetURL ); req.PreAuthenticate = true; req.Credentials = new System.Net.NetworkCredential( strReportUser, strReportUserPW, strReportUserDomain ); HttpWebResponse HttpWResp = (HttpWebResponse)req.GetResponse(); Stream fStream = HttpWResp.GetResponseStream(); HttpWResp.Close(); //Now turn around and send this as the response.. ReadFullyAndSend( fStream ); 

ReadFullyAnd发送方法。 注意:SendAsync调用,所以你不等待服务器完全发送电子邮件,然后再将用户带回到点头之外。

 public static void ReadFullyAndSend( Stream input ) { using ( MemoryStream ms = new MemoryStream() ) { input.CopyTo( ms ); MailMessage message = new MailMessage("from@foo.com", "too@foo.com"); Attachment attachment = new Attachment(ms, "my attachment",, "application/vnd.ms-excel"); message.Attachments.Add(attachment); message.Body = "This is an async test."; SmtpClient smtp = new SmtpClient("localhost"); smtp.Credentials = new NetworkCredential("foo", "bar"); smtp.SendAsync(message, null); } } 

byte[]获取文件数据

 byte[] binaryFile = // get your file data from the SSRS ... string filename = "SSRS.pdf"; 

准备目标地址的列表或数组:

 string[] addresses = // get addresses somehow (db/hardcoded/config/...) 

通过SmtpClient发送smtp消息:

 MailMessage mailMessage= new MailMessage(); mailMessage.From = new MailAddress("sender email address goes here"); // Loop all your clients addresses foreach (string address in addresses) { mailMessage.To.Add(address); } mailMessage.Subject = "your message subject goes here"; mailMessage.Body = "your message body goes here"; MemoryStream memoryStream = new MemoryStream(binaryFile); mailMessage.Attachments.Add( new Attachment( memoryStream, filename , MediaTypeNames.Application.Pdf )); SmtpClient smtpClient = new SmtpClient(); smtpClient.Send(mailMessage);