Dieses Skript zeigt, wie ein generiertes Dokument über einen SMTP-Server versendet werden kann.
Konfiguration
Es handelt sich um einen Exporter der ein Dokument generiert (Word, Excel, Text).
Das Skript wird als AfterClosingDocument ausgeführt.
Ideen
Im AfterClosingDocument-Event ist das Dokument fertig generiert und abgespeichert und geschlossen. Es kann daher einfach via SMTP versendet werden.
In diesem Beispiel wird eine feste Text-Vorlage verwendet.
Grundsätzlich kann dies durch einen Text-Exporter erweitert werden, dann müsste zuerst das Dokument generiert werden und in einem Dokumentfeld hinterlegt werden.
Im Anschluss daran könnte via Text-Exporter eine personifizierte Mail generiert werden.
Skript mit Standard-Authentifizierung mit Username und Passwort
// Version 5
namespace Ruthardt.PrintPlus.Skripting
{
using System;
using System.Net;
using System.Net.Mail;
using Ruthardt.CobraBase.Functions.Access.Ado;
using Ruthardt.PrintPlus.Model.Interfaces;
/// <summary>
/// Versendet das aktuelle Dokument im Anhang einer Mail via SMTP.
/// "ActionType": "AfterClosingDocument"
/// </summary>
public class DokumentPerSMTP : IScriptAction
{
public void Execute(IPrintContext printContext, ICurrentContext currentContext, IChildContext childContext)
{
try
{
// AdoView ist hier Adresse
var adresse = currentContext.Data;
// Empfänger aus der Adresse auslesen
var receiver = adresse.GetStringValue("TODO Emailfeld");
// Mailversand
using (var message = new MailMessage
{
Subject = "TODO Betreff",
Body = "TODO HTML Mailtext",
From = new MailAddress("TODO Absender"),
IsBodyHtml = true
})
{
message.To.Add(receiver);
message.Attachments.Add(new Attachment(currentContext.DocumentFileName.FullName));
var smtpServer = "TODO SMTP Server";
var smtpPort = 25; //"TODO SMTP Port";
var smtpUser = "TODO SMTP User";
var password = "TODO SMTP Password";
using (var smtpClient = new SmtpClient(smtpServer)
{
EnableSsl = true,
Port = smtpPort,
Credentials = new NetworkCredential(smtpUser, password)
})
{
var securityProtocol = (int)System.Net.ServicePointManager.SecurityProtocol;
// 0 = SystemDefault in .NET 4.7+
if (securityProtocol != 0)
{
// Auch in älteren .NET Versionen nur noch TLS 1.2 verwenden; ältere TLS-Versionen machen Probleme
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
}
smtpClient.Send(message);
}
}
}
catch (Exception ex)
{
// Fehler anzeigen
printContext.WaitFormManager.ShowMessageBox("Es ist ein Fehler aufgetreten: " + ex.Message);
}
}
}
}
Skript mit moderner Authentifizierung mit OAuth2
// Version 6
namespace Ruthardt.PrintPlus.Skripting
{
using System;
using System.IO;
using Ruthardt.PrintPlus.Model.Interfaces;
using Ruthardt.CobraBase.Functions.Access.Ado;
using MailKit.Net.Smtp;
using MailKit.Security;
using Microsoft.Identity.Client;
using MimeKit;
public class ExampleScript : IScriptAction
{
public void Execute(IPrintContext printContext, ICurrentContext currentContext, IChildContext childContext)
{
// Zugriff auf den aktuellen Datensatz
var adresse = currentContext.Data;
// Empfänger aus der Adresse auslesen
InternetAddress receiverMail = InternetAddress.Parse(adresse.GetStringValue("TODO Emailfeld"));
// Settings für die Authentifikation egänzen:
var accountEmailAddress = "TODO Account E-Mailadresse (Absender)"
InternetAddress senderMail = InternetAddress.Parse(accountEmailAddress);
var clientId = "TODO ClientID/ApplicationID";
var tenantId = "TODO TenantID";
var clientSecret = "TODO ClientSecret";
var host = "smtp.office365.com"; //"TODO host";
var port = 587; //"TODO port";
var secureSocketOption = SecureSocketOptions.StartTls; //"TODO SecureSocketOption";
// Nachricht zusammenbauen mit Anhang
var builder = new BodyBuilder();
builder.TextBody = "TODO Plaintext-Nachricht";
builder.HtmlBody = "TODO HTML-Nachricht";
// Anhang erstellen
var attachment = new MimePart()
{
Content = new MimeContent(File.OpenRead(currentContext.DocumentFileName.FullName)),
ContentDisposition = new ContentDisposition(ContentDisposition.Attachment),
ContentTransferEncoding = ContentEncoding.Base64,
FileName = Path.GetFileName(currentContext.DocumentFileName.FullName)
};
// Anhang zum BodyBuilder hinzufügen
builder.Attachments.Add(attachment);
//Nachricht erstellen
MimeMessage message = new MimeMessage();
message.To.Add(receiverMail);
message.From.Add(senderMail);
message.Subject = "TODO Betreff";
message.Body = builder.ToMessageBody();
//Authentifizierung, Verbindung und Nachricht versenden
var confidentialClientApplication = ConfidentialClientApplicationBuilder.Create(clientId)
.WithAuthority($"https://login.microsoftonline.com/{tenantId}/v2.0")
.WithClientSecret(clientSecret)
.Build();
var scopes = new[] {
"https://outlook.office365.com/.default"
};
var task = confidentialClientApplication.AcquireTokenForClient(scopes).ExecuteAsync();
task.Wait();
var authToken = task.Result;
var oauth2 = new SaslMechanismOAuth2(accountEmailAddress, authToken.AccessToken);
using (var client = new SmtpClient())
{
client.Connect(host, port, secureSocketOption);
client.Authenticate(oauth2);
client.Send(message);
client.Disconnect(true);
}
}
}
}