ABAP Cloud - Mails
Mails mit ABAP Cloud versenden? Eigentlich so leicht wie immer, nur mit kleinen Unterschieden, die wir in diesem Artikel klären wollen.
Inhaltsverzeichnis
In diesem Artikel wirst du etwas mehr zu den Gemeinsamkeiten und den Unterschieden beim Erstellen und Versenden von E-Mails erfahren. Dabei werden wir auf die beiden Welten On-Premise und das ABAP Environment eingehen. Vor allem bei der Konfiguration unterscheiden sich die beiden Umgebungen.
Einleitung
Der Versand von E-Mails wird für unterschiedliche Zwecke im System verwendet. Egal ob du deinem Kollegen den aktuellen Finanzreport zukommen lassen, selbst eine Benachrichtigung über den letzten ABAP Unit Test bekommen oder einfach nur bei Fehlern informiert werden möchtest. In sehr vielen Fällen wird auf die klassische Mail gesetzt.
Diese kannst du nun sehr klassisch als Plain-Text verschicken oder als HTML Dokument aufbereiten, um dich von den Mails der Kollegen zu unterscheiden. Für alles stehen dir verschiedene Klassen im System zur Verfügung.
Vergleich
In diesem Abschnitt werden wir uns einmal die klassische Welt anschauen und auf die neue Welt mit ABAP Cloud eingehen.
Konfiguration
Für die Konfiguration des Mailservers On-Premise kann über die Transaktion SCOT die entsprechende Einstellung im System vorgenommen werden und der Mailserver hinterlegt werden.
Für die neue Versandmethode muss eine neue Konfiguration hinterlegt werden. Je nach System gibt es hier unterschiedliche Möglichkeiten der Konfiguration. Wie du im ABAP Environment die Mailanbindung machst, erfährst du in diesem Artikel. On-Premise muss dazu die Transaktion SBCS_MAIL_CONFIGSMTP aufgerufen werden. Am Ende sollte eine Default-Konfiguration in der Tabelle BCS_MSG_SMTPCONF zu finden sein.
Erstellung
Im klassischen ABAP setzen wir vor allem auf die Klassen CL_BCS und CL_DOCUMENT_BCS, um unsere Mail zu erstellen und zum Abschluss zu versenden. Zuerst einmal erstellen wir dazu eine Anfrage, im Anschluss übergeben wir das Dokument und Informationen zu Sender und Empfänger. Wichtig ist dabei, dass am Ende ein COMMIT WORK folgt, damit die E-Mail an den Sendeprozess übergeben wird.
DATA(lo_request) = cl_bcs=>create_persistent( ).
DATA(lt_text) = VALUE soli_tab(
( line = `<h2>Hello World</h2><p>This is my HTML Mail from <strong>Classic ABAP</strong>.</p>` ) ).
DATA(lo_document) = cl_document_bcs=>create_document( i_type = 'HTM'
i_subject = 'Test from Classic ABAP'
i_text = lt_text
i_importance = '5' ).
lo_request->set_document( lo_document ).
DATA(lo_address) = cl_cam_address_bcs=>create_internet_address( CONV #( c_sender ) ).
lo_request->set_sender( lo_address ).
DATA(lo_receiver1) = cl_cam_address_bcs=>create_internet_address( CONV #( c_receiver1 ) ).
lo_request->add_recipient( i_recipient = lo_receiver1
i_copy = abap_false ).
DATA(lo_receiver2) = cl_cam_address_bcs=>create_internet_address( CONV #( c_receiver2 ) ).
lo_request->add_recipient( i_recipient = lo_receiver2
i_copy = abap_true ).
COMMIT WORK.
In ABAP Cloud ist die Hauptklasse für die Erstellung der E-Mails CL_BCS_MAIL_MESSAGE, welche alle nötigen Funktionen zum Erstellen und Versenden im Bauch hat. Dazu gibt es die Klasse CL_BCS_MAIL_BODYPART um Texte und Anhänge für die E-Mail zu erzeugen. Neben der Body Klasse, gibt es auch die beiden Unterklassen CL_BCS_MAIL_TEXTPART für reine Texte und CL_BCS_MAIL_BINARYPART für Binärformate.
DATA(lo_mail) = cl_bcs_mail_message=>create_instance( ).
lo_mail->set_sender( c_sender ).
lo_mail->add_recipient( iv_address = c_receiver1
iv_copy = cl_bcs_mail_message=>to ).
lo_mail->add_recipient( iv_address = c_receiver2
iv_copy = cl_bcs_mail_message=>cc ).
lo_mail->set_subject( 'Test from ABAP Cloud' ).
DATA(ld_content) = `<h2>Hello World</h2><p>This is my HTML Mail from <strong>ABAP Cloud</strong>.</p>`.
lo_mail->set_main( cl_bcs_mail_textpart=>create_instance( iv_content = ld_content
iv_content_type = 'text/html' ) ).
lo_mail->send( IMPORTING et_status = DATA(lt_status)
ev_mail_status = DATA(ld_mail_status) ).
Im Beispiel erzeugen wir die Instanz der Mail-Klasse, setzen den Sender, die Empfänger und die Texte und Senden die Nachricht. Als Ergebnis erhalten wir pro Empfänger einen Status, sowie einen Gesamtstatus der E-Mail.
Monitoring
In der SAP GUI gibt es die Transaktion SOST, SOSG oder SOSB, um sich die Sendeaufträge anzuschauen und wie der aktuelle Status dazu ist. In der Transaktion kannst du auch nach verschiedenen Einstellungen filtern, um das gewünschte Ergebnis zu erhalten.
Alle E-Mails, die über die neue Cloud API versendet werden, können nur über die entsprechende Fiori App angeschaut werden. Eine entsprechende Meldung erscheint auch, wenn du die SOST öffnest und das Cloud Szenario aktiviert ist. Die Fiori App ist "Monitor Email Transmissions" (F5442).
Komplettes Beispiel
Hier das komplette Beispiel zum Versand von E-Mails aus dem System, einmal über den klassischen Weg und einmal über ABAP Cloud. Entsprechende Konfigurationen müssen bereits durchgeführt sein, damit der Versand funktioniert.
CLASS zcl_bs_demo_mail DEFINITION
PUBLIC FINAL
CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_oo_adt_classrun.
PRIVATE SECTION.
CONSTANTS c_sender TYPE cl_bcs_mail_message=>ty_address VALUE '<MAIL>'.
CONSTANTS c_receiver1 TYPE cl_bcs_mail_message=>ty_address VALUE '<MAIL>'.
CONSTANTS c_receiver2 TYPE cl_bcs_mail_message=>ty_address VALUE '<MAIL>'.
METHODS classic_mail
IMPORTING io_out TYPE REF TO if_oo_adt_classrun_out.
METHODS cloud_mail
IMPORTING io_out TYPE REF TO if_oo_adt_classrun_out.
ENDCLASS.
CLASS zcl_bs_demo_mail IMPLEMENTATION.
METHOD if_oo_adt_classrun~main.
classic_mail( out ).
cloud_mail( out ).
ENDMETHOD.
METHOD classic_mail.
DATA(lo_request) = cl_bcs=>create_persistent( ).
DATA(lt_text) = VALUE soli_tab(
( line = `<h2>Hello World</h2><p>This is my HTML Mail from <strong>Classic ABAP</strong>.</p>` ) ).
DATA(lo_document) = cl_document_bcs=>create_document( i_type = 'HTM'
i_subject = 'Test from Classic ABAP'
i_text = lt_text
i_importance = '5' ).
lo_request->set_document( lo_document ).
DATA(lo_address) = cl_cam_address_bcs=>create_internet_address( CONV #( c_sender ) ).
lo_request->set_sender( lo_address ).
DATA(lo_receiver1) = cl_cam_address_bcs=>create_internet_address( CONV #( c_receiver1 ) ).
lo_request->add_recipient( i_recipient = lo_receiver1
i_copy = abap_false ).
DATA(lo_receiver2) = cl_cam_address_bcs=>create_internet_address( CONV #( c_receiver2 ) ).
lo_request->add_recipient( i_recipient = lo_receiver2
i_copy = abap_true ).
io_out->write( lo_request->send( ) ).
COMMIT WORK.
ENDMETHOD.
METHOD cloud_mail.
DATA(lo_mail) = cl_bcs_mail_message=>create_instance( ).
lo_mail->set_sender( c_sender ).
lo_mail->add_recipient( iv_address = c_receiver1
iv_copy = cl_bcs_mail_message=>to ).
lo_mail->add_recipient( iv_address = c_receiver2
iv_copy = cl_bcs_mail_message=>cc ).
lo_mail->set_subject( 'Test from ABAP Cloud' ).
DATA(ld_content) = `<h2>Hello World</h2><p>This is my HTML Mail from <strong>ABAP Cloud</strong>.</p>`.
lo_mail->set_main( cl_bcs_mail_textpart=>create_instance( iv_content = ld_content
iv_content_type = 'text/html' ) ).
lo_mail->send( IMPORTING et_status = DATA(lt_status)
ev_mail_status = DATA(ld_mail_status) ).
io_out->write( lt_status ).
io_out->write( |Mail status: { ld_mail_status }| ).
ENDMETHOD.
ENDCLASS.
Am Ende erhalten wir eine formatierte E-Mail im HTML Format. Bei der Formatierung der E-Mail sind dir damit zum Großteil keine Grenzen gesetzt.
Verfügbarkeit
Die E-Mail Klassen stehen ab S/4 HANA 2022 zur Verfügung und können wie beschrieben genutzt werden. Der asynchrone Versand von E-Mails (Methode SEND_ASYNC) steht allerdings erst mit S/4 HANA 2023 zur Verfügung, da die Methode auf das Framework bgPF setzt.
Fazit
Mit ABAP Cloud gibt es beim Mailversand auch einige Änderungen im System und der Konfiguration. Beim Thema Aufbereitung der Dokumente wird sich wahrscheinlich wenig ändern, wie Dokumente versandt werden allerdings schon.