RAP - E-Mail versenden
Nachdem wir im letzten Artikel die Konfiguration vorgenommen haben, senden wir dieses Mal eine Mail und schauen uns die Besonderheiten mit RAP an.
Inhaltsverzeichnis
Letzte Woche haben wir die Grundkonfiguration für den Mailversand definiert und die Anbindung an Office 365 im ABAP Environment eingerichtet. Im nächsten Schritt wollen wir einmal eine Mail versenden und einen Mailversand in unsere RAP Anwendung implementieren.
Versenden
Um den Mailversand durchzuführen, greifen wir auf die freigegebenen APIs von SAP zu, die uns diesen Versand ermöglichen. Mit den Klassen unter "CL_BCS_MAIL*" haben wir alle nötigen Komponenten, um eine erste Testmail zu versenden. Im ersten Schritt benötigen wir eine Mail-Instanz, die wir mit den entsprechenden Daten vorbereiten können.
DATA(lo_mail) = cl_bcs_mail_message=>create_instance( ).
Im zweiten Schritt definieren wir den Absender und setzen mögliche Empfänger, die im Anschluss die Mail erhalten sollen:
lo_mail->set_sender( 'BTP-noreply@CONNECT.com' ).
lo_mail->add_recipient( 'test-me@CONNECT.com' ).
Im dritten Schritt setzen wir den Betreff und befüllen die E-Mail mit einem Body. In unserem Beispiel setzen wir auf eine HTML Mail, die wir noch entsprechend gestalten können. Dabei definieren wir im Text eine H1 Überschrift und einen Paragraph mit etwas Text.
lo_mail->set_subject( 'Test Mail' ).
lo_mail->set_main( cl_bcs_mail_textpart=>create_instance(
iv_content = '<h1>Hello</h1><p>Hello world send from RAP!</p>'
iv_content_type = 'text/html' ) ).
Im letzten Schritt können wir den eigentlichen Versand starten. Hier muss keine Commit durchgeführt werden, dieser wird durch die Klasse ausgelöst und damit der Mailversand gestartet. Im Anschluss erhalten wir eine Tabelle mit dem Status der Empfänger, so können wir den Ausgang prüfen, ob alle Empfänger die E-Mail erhalten haben.
lo_mail->send( IMPORTING et_status = DATA(lt_status) ).
Nach Ausführung wird die E-Mail erstellt und landet bei uns im Posteingang, hier noch der entsprechenden Preview der E-Mail:
Die vollständige ausführbare Klasse findest du hier, ein entsprechendes Fehlerhandling und Ausgaben in die Console wurden ebenfalls implementiert:
CLASS zcl_bs_demo_crap_mail DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_oo_adt_classrun.
ENDCLASS.
CLASS zcl_bs_demo_crap_mail IMPLEMENTATION.
METHOD if_oo_adt_classrun~main.
TRY.
DATA(lo_mail) = cl_bcs_mail_message=>create_instance( ).
lo_mail->set_sender( 'BTP-noreply@CONNECT.com' ).
lo_mail->add_recipient( 'test-me@CONNECT.com' ).
lo_mail->set_subject( 'Test Mail' ).
lo_mail->set_main( cl_bcs_mail_textpart=>create_instance(
iv_content = '<h1>Hello</h1><p>Hello world send from RAP!</p>'
iv_content_type = 'text/html' ) ).
lo_mail->send( IMPORTING et_status = DATA(lt_status) ).
out->write( lt_status ).
CATCH cx_bcs_mail INTO DATA(lo_err).
out->write( lo_err->get_longtext( ) ).
ENDTRY.
ENDMETHOD.
ENDCLASS.
Monitoring
Im ABAP Environment findest du für den Mailversand auch eine entsprechende App, um den Mailausgang zu prüfen und den entsprechenden Status einzusehen. Dazu findest du über die Suche die Anwendung "Monitor Email Transmissions".
Es besteht weiterhin die Möglichkeit, tiefer zu navigieren, um den Status für jeden Empfänger zu prüfen und so weitere Fehlermeldungen zu analysieren.
RAP
Implementieren wir nun noch einen Mailversand in unser komplexes RAP Objekt in dem wir eine Aktion zur Verfügung stellen. Diese Aktion soll ein Popup anzeigen, in das wir einen entsprechenden Empfänger eintragen können. Die selektierten Einträge sollen als Dateianhang per Mail verschickt werden. Wie man eine Aktion mit Popup implementiert, findest du in einem anderen Artikel, deshalb hier nur kurz zusammengefasst:
- Definition der abstrakten CDS Entität für das Popup
- Definition der Aktion in der Verhaltensdefinition
- Freigabe der Aktion in der Projektion
- Erweiterung der Metadaten zur Anzeige der Aktion
- Implementierung der Logik
Bei der Implementierung erzeugen wir zuerst einmal für alle selektierten Einträge den Dateiinhalt, um diesen dann gesammelt in die E-Mail zu übernehmen:
READ ENTITIES OF ZBS_R_RAPCInvoice IN LOCAL MODE
ENTITY Invoice
ALL FIELDS WITH CORRESPONDING #( keys )
RESULT DATA(lt_invoice).
DATA(ld_mail_content) = ``.
LOOP AT lt_invoice INTO DATA(ls_invoice).
ld_mail_content &&= |Doc: { ls_invoice-Document }, From: { ls_invoice-Partner }
|.
ENDLOOP.
Im nächsten Schritt ermitteln wir den Empfänger, dieser wurde über das Popup der Aktion mitgegeben und ist somit variabel. Die eingegebenen Parameter erhalten wir über einen Eintrag der KEYS Tabelle:
keys[ 1 ]-%param-ReceiverMail
Den Anhang können wir nun mit der entsprechenden Methode an die E-Mail hängen und das entsprechende Format und den Dateinamen bestimmen:
lo_mail->add_attachment( cl_bcs_mail_textpart=>create_instance( iv_content = id_mail_content
iv_content_type = 'text/plain'
iv_filename = 'Attachment.txt' ) ).
Im Anschluss können wir die E-Mail wieder versenden und erhalten sie nach kurzer Zeit in unserem Postfach:
Hinweis: Möchtest du eine Mail aus einer RAP Aktion verschicken, funktioniert dies maximal bis STRICT MODE 1. Bei höheren Modi erfolgt eine striktere Prüfung und es kommt beim Versand zu einem Dump im System, es wird auch keine E-Mail mehr versendet. Hintergrund ist die gewahrte Datenintegrität, da Commits während der RAP Verarbeitung und außerhalb der Save-Sequence verboten sind.
Validierung
Um eine E-Mail Adresse im ABAP Environment zu validieren, gibt es die Klasse CL_MAIL_ADDRESS mit der Methode VALIDATE. Weiter Informationen kannst du der offiziellen Dokumentation entnehmen.
GitHub
Im aktuellen Commit unseres GitHub Projektes zum Blog, findest du die Änderungen am RAP Objekt und den gezeigten Beispiel-Code, um die Anpassungen nachzuvollziehen. Da viele kleine Änderungen gemacht wurden, verzichten wir auf die Darstellung in diesem Blog.
Fazit
Du weißt nun, wie man eine E-Mail aus dem ABAP Environment senden kann und auf was man dabei achten sollte. Ebenso solltest du nun die Integration in RAP kennen und welche Besonderheiten man beachten sollte.