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

时间:2014-04-22 06:38:34

标签: c# asp.net reporting-services

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

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

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

修改:我正在使用SmtpClient发送电子邮件。

2 个答案:

答案 0 :(得分:8)

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);

答案 1 :(得分:4)

要执行此操作,您需要利用SSRS ReportManager API,如下所示。

  1. 首先阅读SSRS
  2. 的Web服务报告
  3. 将文件读入内存而不是保存到服务器或客户端
  4. 将MemoryStream对象直接发送到电子邮件服务器。
  5. 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);
       }
    }