ABAP: HTML-Mails senden mit Templates

Motivation

Will man Nutzer regelmäßig über bestimmte Prozesse im SAP System informieren, so kann es sehr nützlich sein direkt aus einem Report eine E-Mail zu versenden. Einfache Text-E-Mails sind allerdings nicht mehr zeitgemäß… das Pflegen von HTML-Inhalten direkt im Quellcode aber sehr umständlich.

Wir stellen die Möglichkeit der Verwendung von Templates vor, sodass man die Datenbeschaffung und die Formatierung der Ausgabe sauber trennen kann.

Das HTML-Template verwalten

Im SAP System kann man Dateien für die Wiederverwendung ablegen, im sogenannten SAP Web Repository (Transaktion SMW0). Dort kann man neben binären Daten (wie zum Beispiel Bilder oder PDFs) auch HTML-Templates („HTML Schablonen”) hinterlegen. Mithilfe der Suche (einschränkbar nach Paket, Name und Beschreibung) kann man sich vorhandene Objekte ansehen. Ein neues Objekt lässt sich über die Funktion „Anlegen” direkt vom Client hochladen.

Die auf diese Weise bereitgestellten Templates sind Teil der Transportverwaltung und können daher über die Systemlandschaft verteilt werden.

Ein einfaches Beispiel für ein Template könnte wie folgt aussehen.<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN”> <HTML> <HEAD> <META http-equiv=Content-Type content=”text/html; charset=iso-8859-1″ /> </HEAD> <BODY> <FONT face=”Verdana,Arial,Helvetica” size=2> <div> <span style=”font-family: Verdana; font-size: medium;”> <strong>Ein HTML-Template in SAP <br /> </strong> </span> </div> <div> </div> <div>Ein kleines Beispiel f&uuml;r ein Template. </div> <div> </div> <div>Die E-Mail wurde von Nutzer !USER! erstellt. </div> <div> </div> </FONT> </BODY> </HTML>

Platzhalter im Template ersetzen

Um ein Template richtig zu benutzen, braucht man die Möglichkeit, Platzhalter korrekt zu ersetzen. Im obigen Beispiel gibt einen Platzhalter für den Nutzernamen !USER!. Dieser Text ist prinzipiell frei wählbar, man sollte aber darauf achten, dass diese Zeichenkette nicht zufällig an einer anderen Stelle auftaucht. Dazu empfiehlt sich eine einheitliche Markierung, zum Beispiel durch Einfassen der Variablen in „!”-Zeichen.

Wie verwendet man nun das Template im Coding?

Mithilfe des Funktionsbausteins WWW_HTML_MERGER kann man sowohl das Template (Parameter TEMPLATE) laden, als auch die Platzhalter ersetzen. Um die Ersetzung zu realisieren, wird eine „merge_table” übergeben, die wie folgt aufgebaut ist:

  • Name: der Platzhaltername, der gesucht und ersetzt werden soll
  • Command: hier stehen verschiedene Optionen zur Auswahl, die gängigste ist wohl „R” (replace = ersetzen)
  • HTML: eine Tabelle mit Zeilen, die statt des Platzhalters eingefügt werden sollen

CALL FUNCTION ‘WWW_HTML_MERGER’ EXPORTING template = ‘ZMY_TEMPLATE_NAME’ IMPORTING html_table = lt_html_table[] CHANGING merge_table = lt_merge_table[].

Dieser Baustein liefert eine Tabelle mit Zeilen der Länge 255 zurück, die den HTML-Inhalt repräsentieren. Dieses Format eignet sich für die direkte Übergabe an den Funktionsbaustein für den E-Mail-Versand.

Achtung: Die für den Aufruf benötigten Strukturen/Tabellen befinden sich im Typenpool SWWW.

E-Mail versenden

Der eigentliche E-Mail-Versand erfolgt über den Standard-Funktionsbaustein SO_NEW_DOCUMENT_SEND_API1.

Für den Versand muss man mindestens folgende Parameter übergeben:

  • DOCUMENT_DATA: eine Struktur, die die Kopfinformationen für die E-Mail bereitstellt. Unter anderem zählt das der E-Mail-Betreff (DOCUMENT_DATA-OBJ_DESC).
  • DOCUMENT_TYPE: dieser optionale Parameter ist standardmäßig auf  „RAW” gesetzt, was das Versenden des HTML-Inhaltes unmöglich macht. Daher muss dieser Parameter auf „HTM” gesetzt werden.
  • OBJECT_CONTENT: die Tabelle mit den Zeilen, die im E-Mail-Body gesendet werden sollen. Hier kann die HTML_TABLE aus dem vorherigen Funktionsaufruf verwendet werden.
  • RECEIVERS: eine Tabelle mit den Empfängern der E-Mail. Hierbei können z. B. Nutzer oder E-Mail-Adressen gesetzt werden. Welche Art von Empfänger übergeben wird, wird im Feld REC_TYPE festgelegt (Wert „U” steht für eine E-Mail-Adresse). Weiterhin kann man definieren, ob der Empfänger die E-Mail als Kopie oder Blindkopie erhalten soll.

Im folgenden Beispiel-Coding werden zunächst für Geschäftspartner, die im Selektionsbild definiert werden können, die E-Mail-Adressen bestimmt. Anschließend wird noch der E-Mail-Betreff gesetzt. SELECT smtp_addr as receiver, ‘U’ as rec_type, ‘X’ as express FROM ADR6 INNER JOIN BUT020 ON but020~addrnumber = adr6~addrnumber INTO TABLE @lt_receiver WHERE but020~partner IN @s_bp. CHECK sy-subrc = 0. ls_doc_data-obj_descr = |Test-E-Mail am { sy-datum }|. CALL FUNCTION ‘SO_NEW_DOCUMENT_SEND_API1’ EXPORTING DOCUMENT_DATA = ls_DOC_DATA DOCUMENT_TYPE = ‘HTM’ IMPORTING NEW_OBJECT_ID = lv_OBJECT_ID TABLES OBJECT_CONTENT = lt_OBJCONT RECEIVERS = lt_RECEIVER EXCEPTIONS TOO_MANY_RECEIVERS = 1 DOCUMENT_NOT_SENT = 2 DOCUMENT_TYPE_NOT_EXIST = 3 OPERATION_NO_AUTHORIZATION = 4 PARAMETER_ERROR = 5 X_ERROR = 6 ENQUEUE_ERROR = 7 OTHERS = 8. IF sy-subrc NE 0. WRITE: / ‘Error’, sy-subrc, ‘while sending!’. EXIT. ENDIF. CALL FUNCTION ‘BAPI_TRANSACTION_COMMIT’.

Der Funktionsbaustein liefert die ID des angelegten Nachrichtenobjektes zurück, falls man nachträglich noch das Objekt modifizieren muss.

Wichtig: das Einstellen der E-Mail in die Warteschlange erfolgt erst nach einem erfolgreichen Commit, was mit dem Funktionsbaustein BAPI_TRANSACTION_COMMIT erreicht werden kann.

Hat alles geklappt, kann man nun die erstellte E-Mail in der Transaktion SOST sehen. Je nach Einstellungen im SAP Connect wird die E-Mail jetzt auch versendet.