2014-04-22 59 views
6

我有一個ASP.NET MVC應用程序必須發送一封電子郵件給收件人列表,附件詳細說明了一個特定的「項目」。我通過使用SQL Server報告服務(SSRS)從報告中獲得此詳細信息。獲取文件作爲附件從字節數組發送

我從來沒有真正使用過SSRS,但我從他的一個同事那裏收到了一些他使用過的代碼。他對報告做的是他在瀏覽器中將其下載到客戶機器上。所以,如果我不這樣做,我坐在一個包含報告數據的字節數組。

有沒有一種方法可以將它作爲附件發送,而無需先將文件物理寫入服務器的文件系統?該報告將採用excel格式或PDF格式。我想用SmtpClient發送郵件。

+0

您有ASP.NET MVC(版本?)Web服務器上傳文件,並且您想將上傳的文件發送到(SMTP?)您的電子郵件地址列表? –

+0

@JossefHarush:不,我沒有文件上傳控件。我要附加的文件來自從SQL報告服務器檢索到的SSRS報告。我可以在代碼中配置以各種格式檢索報告,但我將使用xsl或pdf。 – Carel

+0

誰將文件保存到文件系統?你或你的同事提供的'黑盒'解決方案? –

回答

4

要做到這一點,您需要像下面那樣利用SSRS ReportManager API。

  1. 從Web服務的報告與SSRS
  2. 首先讀取文件讀入到內存,而不是保存到服務器或客戶端
  3. 發送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("[email protected]", "[email protected]"); 
      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); 
    } 
} 
+0

謝謝。這與我找到的解決方案非常相似。在做這件事時,我注意到我必須設置附件的內容類型,例如,如果它的一個xls: 「郵件附件.Add(新附件(流, ,「application/vnd。ms-excel「));' – Carel

+0

啊是的MIME類型,虐待它添加在上面,以便任何人看到並使用上面的代碼是堅實的。 –

7

獲取一個byte[]

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

文件數據準備目標地址的列表或陣列:

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

發送SMTP消息通過SmtpClient

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); 
相關問題