Frage

Unsere WinForms-Anwendung lange eine Option "Drucken" erlaubt hat, die RDLC grundsätzlich verwendet.

Der Kunde hat darum gebeten, dass wir eine Funktion hinzufügen, so dass Anwender die „gedruckt“ Ausgabe per E-Mail senden.

Jetzt wissen wir, dass eine EMF-Datei (im TEMP-Ordner) erstellt wird, als eine Art versteckte Nebenprodukt unserer aktuellen Druckverfahren.

Es scheint uns können wir einfach diese EMF-Datei packen und schließen Sie es an eine neue E-Mail und die Arbeit erledigt ist.

  1. Ist dies die beste Option?
  2. Kann setzen wir auf eine EMF-Datei von jedem Windows-Rechner geöffnet werden?
  3. Wie man die EMF-Datei identifizieren? ... scheint nur genannt werden %TEMP%\DiaryGrid_1.emf zur Zeit. OK so DiaryGrid ist der Name unserer RDLC Datei aber die _1 wird irgendwo auf dem Weg gegeben.
War es hilfreich?

Lösung

Ich habe es vor. Ich habe es programmatisch den Bericht als pdf an einen bestimmten Ort zu exportieren, wir die pdf-Datei dann eine E-Mail und löschen. Ich werde versuchen, den Code für Sie zu finden (nicht im Hause jetzt) ??

EDITED:

Sorry für die später. Jetzt bin ich im Haus und ich werde Ihnen einige Code-Blöcke geben, dass ich geben denken Sie etwas Hilfe Ihre Aufgabe zu erledige. Ich werde einige Kommentare zu dem Code enthalten, so dass Sie einige Dinge verstehen, die spezifisch in meinem Projekt sind. Dieser Code getestet und funktioniert gut in meinen Kunden, aber ich bin sicher, dass es verbessert werden kann. Bitte, lassen Sie mich wissen, wenn Sie diesen Code verbessern kann;)

Zunächst einmal werden wir den Bericht in PDF exportieren.

private string ExportReportToPDF(string reportName)
{
   Warning[] warnings;
   string[] streamids;
   string mimeType;
   string encoding;
   string filenameExtension;
   byte[] bytes = ReportViewer1.LocalReport.Render(
      "PDF", null, out mimeType, out encoding, out filenameExtension,
       out streamids, out warnings);

   string filename = Path.Combine(Path.GetTempPath(), reportName);
   using (var fs = new FileStream(filename, FileMode.Create))
   {
      fs.Write(bytes, 0, bytes.Length);
      fs.Close();
   }

   return filename;
}

Nun müssen wir eine Klasse, die das Mail-System zu steuern. Jedes Mail-System ihre eigenen caracteristics hat, vielleicht müssen Sie diese Klasse ändern. Das Verhalten der Klasse ist einfach. Sie müssen nur die Eigenschaften füllen, und die Send-Methode aufrufen. In meinem Fall, Fenster lassen mich die pdf-Datei nicht löschen, sobald ich es senden (Windows sagt die Datei verwendet wird), so programmiere ich die Datei in dem nächsten Neustart gelöscht werden. Werfen Sie einen Blick auf die Löschmethode. Bitte beachten Sie, dass die Sendemethode eine cutom Klasse verwendet namens MailConfig. Dies ist eine kleine Klasse, die einige Config-Strings wie Host, User-Name und Passwort hat. Die E-Mail wird unter Verwendung dieser params gesendet.

public class Mail
{
   public string Title { get; set; }
   public string Text { get; set; }
   public string From { get; set; }
   public bool RequireAutentication { get; set; }
   public bool DeleteFilesAfterSend { get; set; }

   public List<string> To { get; set; }
   public List<string> Cc { get; set; }
   public List<string> Bcc { get; set; }
   public List<string> AttachmentFiles { get; set; }

   #region appi declarations

   internal enum MoveFileFlags
   {
      MOVEFILE_REPLACE_EXISTING = 1,
      MOVEFILE_COPY_ALLOWED = 2,
      MOVEFILE_DELAY_UNTIL_REBOOT = 4,
      MOVEFILE_WRITE_THROUGH = 8
   }

   [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
   static extern bool MoveFileEx(string lpExistingFileName,
                                 string lpNewFileName,
                                 MoveFileFlags dwFlags);

   #endregion

   public Mail()
   {
      To = new List<string>();
      Cc = new List<string>();
      Bcc = new List<string>();
      AttachmentFiles = new List<string>();
      From = MailConfig.Username;
   }

   public void Send()
   {
      var client = new SmtpClient
      {
         Host = MailConfig.Host,
         EnableSsl = false,
      };

      if (RequireAutentication)
      {
         var credentials = new NetworkCredential(MailConfig.Username, 
                                                 MailConfig.Password);
         client.Credentials = credentials;
      }

      var message = new MailMessage
      {
         Sender = new MailAddress(From, From),
         From = new MailAddress(From, From)
      };

      AddDestinataryToList(To, message.To);
      AddDestinataryToList(Cc, message.CC);
      AddDestinataryToList(Bcc, message.Bcc);

      message.Subject = Title;
      message.Body = Text;
      message.IsBodyHtml = false;
      message.Priority = MailPriority.High;

      var attachments = AttachmentFiles.Select(file => new Attachment(file));
      foreach (var attachment in attachments)
         message.Attachments.Add(attachment);

      client.Send(message);

      if (DeleteFilesAfterSend)
         AttachmentFiles.ForEach(DeleteFile);
   }

   private void AddDestinataryToList(IEnumerable<string> from,
      ICollection<MailAddress> mailAddressCollection)
   {
      foreach (var destinatary in from)
         mailAddressCollection.Add(new MailAddress(destinatary, destinatary));
   }

   private void DeleteFile(string filepath)
   {
      // this should delete the file in the next reboot, not now.
      MoveFileEx(filepath, null, MoveFileFlags.MOVEFILE_DELAY_UNTIL_REBOOT);
   }
}

Jetzt können Sie ein Formular erstellen, für die destinataries zu fragen, fügen Sie einige Validierung, etc, Rückkehr zu einer Instanz der Mail-Klasse ... oder Sie können „harte Code“ einfach die Werte und die Klasse füllen.

Hier ist der Code, dass ich in einer Schaltfläche verwenden diese Form zu nennen, in meinem Beispiel es benannt ist SendMailView.

private void BtnSendByMail_Click(object sender, EventArgs e)
{
   SendMailView sendMailView = new SendMailView();

   if (sendMailView.ShowDialog()== DialogResult.OK)
   {
      Mail mail = sendMailView.CurrentItem;
      mail.AttachmentFiles.Add(ExportReportToPDF("Invoice.pdf"));
      mail.DeleteFilesAfterSend = true;
      mail.RequireAutentication = true;
      mail.Send();
   }
   sendMailView.Dispose();
}

In diesem Beispiel senMailView.CurrentItem ist die Instanz der Mail-Klasse. Wir müssen einfach Aufruf an die Send Methis und die Arbeit getan ist.

Dies ist die größte Antwort, die ich jemals in SO geschrieben ... Ich hoffe, dass es Ihnen helfen: D Wenn Sie irgendein Problem haben Sie es verwenden, rufen Sie mich an. By the way, ich bin nicht sehr stolz auf mein Englisch, so vergib mir, wenn der Text einen Fehler hat.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top