2009-05-28 4 views
5

Próbuję wysłać raport z SQL reportserver 2008 jako załącznik poczty elektronicznej z wykorzystaniem ASP.NET i C#, Do tej pory nauczyłem się Get report as PDF w moim kodu, teraz chcę połączyć linię kodów jakWyślij SQL raport w załączniku e mail przy użyciu C# i ASP.NET

byte[] bytes = rview.ServerReport.Render(format, deviceInfo, out mimeType, out encoding, out extension, out streamids, out warnings); 
Response.OutputStream.Write(bytes, 0, bytes.Length); 
Attachment reportAttachment = new Attachment(Response.OutputStream.Write(bytes,0,bytes.Length),"ado"); //Here I go wrong 

Thanx z góry

Odpowiedz

3

Może się to źle (wiem trochę o SSRS), ale myślę, że powinno

  1. Zapisz plik w systemie plików

    System.IO.File.WriteAllBytes("c:\temp\temp.pdf", bytes); 
    
  2. Wyślij plik przez e-mail

    MailMessage mail = new MailMessage(); 
    mail.From  = "Me"; 
    mail.To   = "You"; 
    mail.Subject  = "Subject"; 
    mail.Body  = "Body"; 
    mail.BodyFormat = MailFormat.Html; 
    mail.Attachments.Add(new MailAttachment("c:\temp\temp.pdf")); 
    
    try 
    { 
        SmtpMail.Send(mail); 
    } 
    catch(Exception ex) 
    { 
        Response.Write("Ouch! " + ex.Message); 
    } 
    
+0

Dzięki System.IO działa jak uroku, Tylko jedna mała uwaga, jodły argumentem jest adres Ciąg pliku, a drugi to bajt []. W każdym razie mam pomysł, aby zrobić serwis internetowy do wykonywania tej pracy, Czy będzie tak trudny i inny niż zrobienie tylko przykładowej strony internetowej? – adopilot

+0

Masz rację! Poprawiono odpowiedź. –

13

Zamiast zapisywania plików PDF do systemu plików po pierwsze, można spróbować użyć bajt [] zwrócone z serwera raportów i dołączyć to:

MemoryStream ms = new MemoryStream(bytes); 
mail.Attachments.Add(new Attachment(ms, "temp.pdf")); 

Dla szybkiego krówki na jednej z moich raportów Zrobiłem następujące:

WebClient client = new WebClient(); 
byte[] bytes = client.DownloadData("http://localhost/ReportServer/Pages/ReportViewer.aspx? *** report name *** &rs%3aFormat=PDF"); 
MemoryStream ms = new MemoryStream(bytes); 
mail.Attachments.Add(new Attachment(ms, "temp.pdf")); 

Nadzieja jest to pomocne

+0

Dołączanie bez zapisywania pliku w systemie plików jest, moim zdaniem, bardziej eleganckim rozwiązaniem. Dzięki za rozwiązanie. – Mozy

+1

To działa ładnie, chociaż musiałem użyć System.Net.Mail raczej tak, żebym mógł utworzyć załącznik z MemoryStream. – openshac

1

Można również użyć SSRS subskrypcji. Ma wbudowaną funkcjonalność poczty e-mail.

Wymagania:

  • Masz raport konfiguracji.
  • Masz swój serwer raportów SSRS skonfigurowany do wysyłania wiadomości e-mail.
  • Twój serwer SSRS to rok 2010 lub nowszy. Nie jestem pewien, czy w 2008 roku i przed subskrypcjami wsparcia.

Microsoft's documentation from the UI standpoint

Kod:

var service = new ReportingService2010(); 
service.Url = reportServiceURL; 
service.Credentials = new NetworkCredential(userName, password, domain); 

var reportPath = "your/report/location"; 

string report = $"{reportPath}YourReportName.rdl"; 
string fileName = $"Your Custom Report"; 

//If your report requires input parameters, specify them in an array. 
ParameterValue[] reportParameters = new ParameterValue[1]; 

reportParameters[0] = new ParameterValue(); 
reportParameters[0].Name = "ID"; 
reportParameters[0].Value = ID.ToString(); 

ParameterValue[] extensionParams = new ParameterValue[11];//Adjust this if you omit parameters. 

extensionParams[0] = new ParameterValue(); 
extensionParams[0].Name = "TO"; 
extensionParams[0].Value = "[email protected];[email protected];[email protected];" 

//CC, can be omitted. 
extensionParams[1] = new ParameterValue(); 
extensionParams[1].Name = "CC"; 
extensionParams[1].Value = "[email protected];[email protected];" 

//BCC, can be omitted. 
extensionParams[2] = new ParameterValue(); 
extensionParams[2].Name = "BCC"; 
extensionParams[2].Value = "[email protected];[email protected];" 

//Reply to, where replies should go. 
extensionParams[3] = new ParameterValue(); 
extensionParams[3].Name = "ReplyTo"; 
extensionParams[3].Value = "[email protected]" 

//Include report as an attachment, this should be TRUE. 
extensionParams[4] = new ParameterValue(); 
extensionParams[4].Name = "IncludeReport"; 
extensionParams[4].Value = "True" 

//What you want the attached file to render as. You have some options. 
extensionParams[5] = new ParameterValue(); 
extensionParams[5].Name = "RenderFormat"; 
extensionParams[5].Value = "PDF"; //pdf 
//extensionParams[5].Value = "WORD"; //doc, word 2003 - 2007 
//extensionParams[5].Value = "WORDOPENXML"; //docx, word 2010 - 2013+ 
//extensionParams[5].Value = "EXCEL"; //xls, excel 2003 - 2007 
//extensionParams[5].Value = "EXCELOPENXML"; //xlsx, excel 2010 - 2013+ 
//extensionParams[5].Value = "IMAGE"; //TIFF file 
//extensionParams[5].Value = "CSV"; //CSV file 
//extensionParams[5].Value = "XML"; //XML file 

//Optional, set the priority of the message. 
extensionParams[6] = new ParameterValue(); 
extensionParams[6].Name = "Priority"; 
extensionParams[6].Value = "High"; 
//extensionParams[6].Value = "Normal"; 
//extensionParams[6].Value = "Low"; 

//Subject Line 
extensionParams[7] = new ParameterValue(); 
extensionParams[7].Name = "Subject"; 
extensionParams[7].Value = "Your lovely report"; 

//Comment, I believe this is the "body" of the email. 
extensionParams[8] = new ParameterValue(); 
extensionParams[8].Name = "Comment"; 
extensionParams[8].Value = "Hi there, <br/><br/>I have your report. Thanks for automating me out of the job, you programmer you!"; 

//Include a hyperlink to run the report in the email body? Can be omitted. 
extensionParams[9] = new ParameterValue(); 
extensionParams[9].Name = "IncludeLink"; 
extensionParams[9].Value = "False"; 

//If you want to send it "on behalf of" someone, use this. Can be omitted. 
extensionParams[10] = new ParameterValue(); 
extensionParams[10].Name = "SendEmailToUserAlias"; 
extensionParams[10].Value = "[email protected]"; 

ExtensionSettings extSettings = new ExtensionSettings(); 
extSettings.ParameterValues = extensionParams; 
extSettings.Extension = "Report Server Email"; 

//FYI date must be in ISO 8601 format. This sets it to one minute from now, and will only run once. 
string matchData = $"<ScheduleDefinition><StartDateTime>{DateTime.Now.AddMinutes(1).ToString("s")}</StartDateTime></ScheduleDefinition>"; 

reportingService.CreateSubscription(reportName, extSettings, fileName, "TimedSubscription", matchData, reportParameters);