Für das Versenden von Mails gibt es im SSIS eine spezialisierte Task, die das übernehmen kann. Sie ist sehr einfach zu konfigurieren und leistete in der Vergangenheit auch in Kundenprojekten gute Dienste, wenn es zum Beispiel darum ging, mal schnell eine Info in die Welt zu senden und mitzuteilen, dass ein Import nicht erfolgreich gelaufen ist. Kürzlich fragte einer der Mailempfänger, ob mit der Fehlermeldung nicht auch gleich der Inhalt einer Log-Tabelle mit gesendet werden kann. Dann könnte er als Administrator auf einen Blick sehen was los ist und müsste nicht erst selbst die Log-Tabelle abfragen, um zu sehen, was denn schief gegangen ist.
Eigentlich ein guter Gedanke – aber auch gleichzeitig ein Problem: Mit dem SSIS-Task für das Versenden von Mails kann nur reiner Text versendet werden. Um eine Tabelle mit in den Mailtext zu packen, müsste man aber schon die Möglichkeit haben, den Text im HTML-Format zu senden. Und hier kommt ein Lösungsansatz, der dies möglich macht.
Ein Script-Task zum verschicken
Microsoft liefert in der .NET-Klassenbibliothek einen eigenen Namespace für das Versenden von Mails: System.Net.Mail. Mit den Klassen aus System.Net.Mail lässt sich das Versenden von Mails sehr einfach in einem Script-Task programmieren. Um mit möglichst wenigen Änderungen im Script-Task auszukommen, sollten alle nötigen Parameter für das Versenden der Mail in Paket-Variablen im SSIS-Paket gesammelt und gefüllt werden:
- Liste der Empfänger: Mail_SendTo (String)
- Absenderadresse: Mail_SendFrom (String)
- Die Betreffzeile: Mail_Subject (String)
- Der Mailtext: Mail_Body (String)
- Adresse des Mailservers: Mail_Server (String)
- Optional Anmeldename: Mail_Username (String)
- Optional Passwort: Mail_Password (String)
Mit diesen sieben Variablen – übergeben an die Script-Task – ist das Versenden einer Mail ganz einfach.
Zuerst muss natürlich eine Script-Task in das SSIS-Paket eingefügt werden. Anschließend kann über einen Doppelklick auf dieses Paket der Skripttask-Editor geöffnet werden. Beim ersten Öffnen ist es möglich, die ScriptLanguage auszuwählen – wir haben uns für C# entschieden. Außerdem kann man gleich die Variablen angeben, die an den Script-Task übergeben werden sollen. Da die oben genannten Variablen im Script-Task nicht verändert werden, erfolgt die Zuordnung in der Zeile “Read-only Variables”.
Nach einem Klick auf “Skript bearbeiten…” wird das Grundgerüst eines C#-Scripts geöffnet. Im Kopfbereich des Scripts müssen noch zwei Namespaces eingefügt werden, deren Klassen später benötigt werden: System.Net und System.Net.Mail.
In der Folge steht im ScriptTask einiges an automatisch generiertem Code, das nicht verändert wer-den sollte! Weiter geht es bei der Main-Methode, die standardmäßig als Einstiegspunkt bei der Scriptausführung verwendet wird. Die gesamte Methode kann durch den folgenden Code ersetzt werden:
Wie unschwer zu erkennen, wurde das Versenden der Mail in einer eigenen Methode gekapselt. Somit lässt sich der Code auch schnell mal in andere C#-Programme “transferieren”. Ansonsten steckt eigentlich nicht viel dahinter – in der Main()-Methode werden zuerst die übergegebenen Wer-te aus den Paketvariablen ausgelesen und beim Aufruf der Methode SendMailMessage() als Parame-ter übergeben. Diese übernimmt dann den Teil des Mailversands – wichtig ist hier, dass die Eigen-schaft “IsBodyHtml” auf TRUE gesetzt werden muss, damit der Nachrichtentext (MailBody) als HTML-Text interpretiert wird. Der Nachrichtentext muss damit dann aber auch komplett als HTML formatiert sein. Nach dem Ausführen der SendMail()-Methode wird dann aus der Main()-Methode heraus nur noch die Script-Taskausführung mit einer Erfolgsmeldung (Taskresult = Success) beendet.
Hier nun ein kleines Beispiel, wie der MailBody-Text aussehen muss:
Im zweiten Teil dieses Beitrags werden wir zeigen, wie man die Ergebnisse einer Select-Abfrage als Tabelle in den Nachrichtentext integrieren kann.