我有一个ASP.NET MVC应用程序,它必须向收件人列表发送一封电子邮件,其中附件详细说明了特定的“项目”.我通过使用sql Server Reporting Services(SSRS)从报告中获取详细信息.
我之前从未真正使用过SSRS,但是我收到了他使用它的同事的一些代码.他对报告的处理是将其在浏览器中下载到客户端的计算机上.所以,如果我不这样做,我会坐在一个包含报告数据的字节数组中.
有没有一种方法可以将此作为附件发送而无需先将文件物理写入服务器的文件系统?该报告将采用excel格式或pdf格式.
编辑:我正在使用SmtpClient发送电子邮件.
解决方法
要做到这一点,您需要利用SSRS ReportManager API,如下所示.
>首先使用SSRS从Web服务的报告中读取
>将文件读入内存而不是保存到服务器或客户端
>将MemoryStream对象直接发送到电子邮件服务器.
Reporting services: Get the PDF of a generated report
How to send an email with attachments using 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); } }