Der Versand von E‑Mails in SAP-Systemen ist seit langem Standard, sei es für Bestellbestätigungen, interne Benachrichtigungen oder Systemmeldungen. Mit dem Wechsel zur ABAP Cloud hat sich die Technologie für Mailversand jedoch verändert. Im folgenden Beitrag vergleichen wir den modernen ABAP Cloud Ansatz mit der „klassischen“ Variante des Mailversands.
Dies ist eine „Neuauflage“ des Blogs „ABAP-Klasse CL_BCS – Mailversand aus ABAP“ von Domi.
„Klassischer“ Mailversand (BCS)
Übersicht der benötigten Klassen/Methoden
Klasse/Methode | Nutzung |
---|---|
CL_BCS=>CREATE_PERSISTENT( ) | Erzeugung des Sendeauftrags |
CL_DOCUMENT_BCS=>CREATE_DOCUMENT( ) | Erzeugung des Office-Dokuments |
CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADRESS | Erzeugung der Mail-Adressen |
CL_BCS=>CREATE_PERSISTENT – Erzeugung des Sendeauftrags
Zuerst erzeugen wir unseren Sendeauftrag:
1 |
DATA(send_request) = cl_bcs=>create_persistent( ). |
CL_DOCUMENT_BCS – Erzeugung des Office-Documents
Als nächstes benötigen wir das „Office Document“, also den Inhalt, Empfänger, Betreff und ggf. den Anhang der Mail.
Dafür nutzen wir die Klasse cl_document_bcs und erzeugen mit der statischen Methode create_document( ) unser Office Document.
1 2 3 4 |
DATA(office_document) = cl_document_bcs=>create_document( i_type = 'HTM' i_subject = 'Test Mail from Classic ABAP' i_text = mail_text i_importance = '5' ). |
- i_type: Bestimmt den Typ der übergebenen Datei, zB. ‚HTM‘ für eine HTML Datei, ‚TXT‘ für eine Text Datei, ‚BIN‘ für binäre Dateien (wie zB. PDFs)
- i_subject: Hier setzen wir den Inhalt für die Betreff-Zeile
- i_text/i_hex: ist als Tabelle mit dem eigentlichen Text bzw. den Binärdaten zu übergeben
Mit weiteren optionalen Parametern wie zB. i_importance oder i_sensitivity lassen sich Priorität bzw. Vertraulichkeit einstellen.
Wie erwähnt muss i_text/i_hex der Inhalt als Tabelle des Typs soli_tab übergeben werden:
1 2 3 4 5 6 7 8 9 10 |
DATA(mail_text) = VALUE soli_tab( ( line = `<h2>Hello World</h2><p>This is my HTML Mail from <strong>Classic ABAP</strong>.</p>` ) ( line = `<p>Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>` ) ( line = `<p>Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris.</p>` ) ( line = `<br>` ) ( line = `<p>Duis aute irure dolor in reprehenderit in voluptate velit esse.</p>` ) ( line = `<p>Cillum dolore eu fugiat nulla pariatur.</p>` ) ( line = `<br>` ) ( line = `<p>Kind regards,</p>` ) ( line = `<p>Dävid</p>` ) ). |
E-Mail Anhang hinzufügen
Um einen Anhang hinzuzufügen müssen wir auch diesen in eine Tabelle des Typs soli_tab konvertieren. Wir gehen in diesem Beispiel davon aus, dass wir die PDF-Datei bereits als xstring zur Verfügung haben und nutzen die static Methode xstring_to_solix( ) der Klasse CL_BCS_CONVERT:
1 |
DATA(pdf_file_solix) = cl_bcs_convert=>xstring_to_solix( pdf_file_xstring ). |
Das Hinzufügen als Anhang setzen wir mit der Instanzmethode add_attachment der Klasse CL_DOCUMENT_BCS um:
1 2 3 4 |
office_document->add_attachment( i_attachment_type = 'PDF' i_attachment_subject = 'DemoReport.pdf' i_attachment_size = file_size i_att_content_hex = pdf_file_solix ). |
- i_attachment_type bestimmt den Typ der übergebenen Datei ähnlich wie i_type bei Aufruf von create_document.
- i_attachment_subject bestimmt den Namen der angehängten Datei
- i_attachment_size (optional) gibt die Dateigröße an
i_att_content_hex verlangt den Anhang als Binärdaten im Format solix_tab.
Nachdem wir unseren Mail Body und den Anhang vorbereitet haben müssen wir unser „Office Document“ im Sendeauftrag mit set_document( ) setzen:
1 |
send_request->set_document( office_document ). |
CL_CAM_ADDRESS_BCS – Vorbereiten der Sender-Empfängeradressen
Ebenso müssen wir noch Sender und Empfänger setzen. Dazu benötigen wir zuerst die statische Methode CREATE_INTERNET_ADDRESS der Klasse CL_CAM_ADDRESS_BCS um die E-Mail-Adressen korrekt zu erzeugen (Die Methode erwartet ein Objekt, welches das Interface IF_RECIPIENT_BCS implementiert) und setzen dann Sender/Empfänger in unserem Sendeauftrag:
1 2 3 4 5 6 7 8 9 10 11 12 |
CONSTANTS: c_receiver1_address TYPE string VALUE '<MAIL>', c_receiver2_address TYPE string VALUE '>MAIL>'. DATA(sender_address) = cl_sapuser_bcs=>create( cl_abap_syst=>get_user_name( ) ). send_request->set_sender( sender_address ). DATA(receiver1_address) = cl_cam_address_bcs=>create_internet_address( i_address_string = CONV #( c_receiver1_address ) ). send_request->add_recipient( i_recipient = receiver1_address i_copy = abap_false ). DATA(receiver2_address) = cl_cam_address_bcs=>create_internet_address( i_address_string = CONV #( c_receiver2_address ) ). send_request->add_recipient( i_recipient = receiver2_address i_copy = abap_true ). |
Man kann auch direkt mit dem SAP Benutzer arbeiten, so wie im Beispiel verwendet man dann CL_SAPUSER_BCS=>create ( ).
Über folgende optionale Parameter lassen sich noch weitere Einstellungen treffen:
- i_express: Ist der Empfänger ein SAP Benutzer erhält er bei der nächsten Prozessierung des PBO-Events eine Popup-Benachrichtigung mit dem Hinweis auf eine neue Nachricht
- i_copy: Empfänger erhält die Nachricht als Kopie
- i_blind_copy: Empfänger erhält die Nachricht als Blindkopie
- i_no_forward: Ist der Empänger SAP Benutzer kann die Nachricht nicht weitergeleitet werden
Senden der E-Mail
Nachdem wir den Sende-Auftrag und den Mail-Body erstellt haben, ggf. Anhänge hinzugefügt haben, die Adressen gesetzt haben und sonstige Einstellungen getroffen haben, können wir nun endlich die Methode send( ) aufrufen:
1 2 |
DATA(send_result) = send_request->send( ). COMMIT WORK. |
Wichtig: Am Ende muss ein COMMIT WORK folgen, damit die E-Mail dem Sendeprozess übergeben wird.
ABAP Cloud Mailversand
Prerequisites
Dadurch, dass die ABAP Environment normalerweise keinen eigenen Mailserver hat, muss man eine Konfiguration vornehmen, um einen Cloud SMTP Server anschließen zu können.
Wie man das zum Beispiel mit einem Office365 Server macht haben die großartigen software-heroes.com in diesem Blog erklärt: BTP Anbindung Office365
Übersicht der benötigten Klassen:
Klasse | Nutzung |
---|---|
CL_BCS_MAIL_MESSAGE=> CREATE_INSTANCE( ) | Erzeugung der Mail-Instanz |
CL_BCS_MAIL_TEXTPART=>CREATE_INSTANCE( ) | Erzeugung des Mail-Bodys |
CL_BCS_MAIL_BINARYPART=>CREATE_INSTANCE( ) | Erzeugung eines Mail-Anhangs aus Binärdaten |
Nun schauen wir uns die moderne Versand-Methode über ABAP Cloud an.
CL_BCS_MAIL_MESSAGE – Erzeugung des Mail Objekts
Die Hauptklasse die wir verwenden ist CL_BCS_MAIL_MESSAGE, sie ist tatsächlich auch (fast) die einzige die wir benötigen. Zu Beginn erstellen wir eine Instanz der Klasse:
1 |
DATA(mail) = cl_bcs_mail_message=>create_instance( ). |
Über die Methoden set_sender( ), set_subject( ) und add_recipient( ) können wir ohne große Umwege direkt Betreff, Empfänger und Sender setzen:
1 2 3 4 5 6 7 8 |
CONSTANTS: c_sender TYPE cl_bcs_mail_message=>ty_address VALUE '<MAIL ADRESS>', c_receiver1 TYPE cl_bcs_mail_message=>ty_address VALUE '<MAIL ADRESS>', c_receiver2 TYPE cl_bcs_mail_message=>ty_address VALUE '<MAIL ADRESS>'. mail->set_sender( c_sender ). mail->add_recipient( iv_address = c_receiver1 iv_copy = cl_bcs_mail_message=>to ). mail->add_recipient( iv_address = c_receiver2 iv_copy = cl_bcs_mail_message=>cc ). |
Die Enums TO, CC oder BCC ermöglichen ein einfaches einstellen von Kopien bzw. Blindkopien.
iv_address benötigt ein Objekt des Typs cl_bcs_mail_message=>ty_address
CL_BCS_MAIL_TEXTPART – Erzeugen des Mail-Bodys
Um den Mail-Body zu setzen, erzeugen wir zuerst eine Instanz der Klasse mittels CL_BCS_MAIL_TEXTPART=>create_instance( ).
Hier können wir einfach einen String übergeben und müssen nicht vorher in eine Tabelle konvertieren.
Mit set_main( ) setzen wir den Mail-Body in unserer Mail Instanz:
1 2 3 4 5 6 7 8 9 |
DATA mail_content TYPE string. mail_content = |<h2>Hello World</h2><p>This is my HTML Mail from <strong>ABAP Cloud</strong>.</p>| && |<br><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>| && |<p> Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>| && |<p>Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris.</p><br>| && |<p>Duis aute irure dolor in reprehenderit in voluptate velit esse.</p>| && |<p>Cillum dolore eu fugiat nulla pariatur.</p><br><p>Kind regards,</p><p>David</p>|. mail->set_main( cl_bcs_mail_textpart=>create_instance( iv_content = mail_content iv_content_type = 'text/html' ) ). |
iv_content_type erlaubt es hier direkt den MIME-Type (Multipurpose Internet Mail Extensions) anzugeben (zB. ‚text/html‘, ‚application/pdf‘, etc.).
Der Betreff wird über set_subject( ) gesetzt:
1 |
mail->set_subject( 'Test from ABAP Cloud' ). |
CL_BCS_MAIL_BINARYPART – Erzeugen eines Anhangs
Um einen Anhang hinzuzufügen nutzen wir die Methode add_attachment( ) unserer Mail Instanz.
Auch hier erzeugen wir zuerst eine Instanz unseres Anhangs mit CL_BCS_MAIL_BINARYPART:
1 2 3 4 |
mail->add_attachment( io_attachment = cl_bcs_mail_binarypart=>create_instance( iv_content = pdf_file iv_content_type = 'application/pdf' iv_filename = 'DemoReport.pdf' ) ). |
- iv_content: Nimmt bereits einen XString entgegen, keine Konvertierung notwendig
- iv_content_type: Verhält sich gleich wie schon bei CL_BCS_MAIL_TEXTPART=>create_instance( )
- iv_filename: setzt den Dateinamen
Senden der E-Mail
Damit haben wir bereits alles erledigt und können über den Aufruf von send( ) unsere Mail abschicken:
1 2 |
mail->send( IMPORTING et_status = DATA(recipient_status) ev_mail_status = DATA(mail_status) ). |
- et_status: liefert eine Status Tabelle für jeden einzelnen Empfänger
- ev_mail_status: gibt den Status der gesamten Mail zurück
Was vielleicht auffällt ist, dass wir in der modernen Variante über ABAP Cloud weder die Möglichkeit haben die Priorität der E-Mail, noch das Sensitivitätslevel einzustellen.
Ebenso fehlt die Möglichkeit direkt mit dem SAP Benutzer zu arbeiten, dementsprechend fehlen auch die Optionen der Popup-Benachrichtigung (i_express bei add_recipient( ) ) und des Untersagens einer Weiterleitung (i_no_forward bei add_recipient( ) ).
Zusammenfassung/Gegenüberstellung
Aspekt | Klassischer Mailversand (BCS) | ABAP Cloud Mailversand |
---|---|---|
Hauptklasse | CL_BCS | CL_BCS_MAIL_MESSAGE |
Erstellung | CL_BCS=> CREATE_PERSISTENT( ) erzeugt Sendeauftrag | CL_BCS_MAIL_MESSAGE=> CREATE_INSTANCE( ) erzeugt Mailobjekt |
Mail-Body | CL_DOCUMENT_BCS=> CREATE_DOCUMENT( ) – Inhalt als soli_tab übergeben | CL_BCS_MAIL_TEXTPART=>CREATE_INSTANCE( ) – Inhalt direkt als string übergeben |
Anhänge | ADD_ATTACHMENT( ) mit Konvertierung z. B. CL_BCS_CONVERT=> XSTRING_TO_SOLIX notwendig | ADD_ATTACHMENT( ) mit CL_BCS_MAIL_BINARYPART=>CREATE_INSTANCE( ) – nimmt direkt xstring |
Sender setzen | SET_SENDER( ) Erzeugung einer „Internet Address“ CREATE_INTERNET_ADDRESS( ) oder SAP Benutzer CL_SAPUSER_BCS=> CREATE( sy-uname ) notwendig | SET_SENDER( ) E-Mail Adresse als Type CL_BCS_MAIL_MESSAGE=> TY_ADDRESS |
Empfänger setzen | ADD_RECIPIENT( ) | ADD_RECIPIENT( iv_address = … iv_copy = TO/CC/BCC ) – nur E-Mail-Adresse möglich |
Priorität / Sensitivität | Über Parameter i_importance (Priorität) und i_sensitivity (Vertraulichkeit) im CREATE_DOCUMENT( ) möglich | Nicht verfügbar |
Weitere Optionen | i_express, i_no_forward (nur bei SAP-Benutzern wirksam) | Keine vergleichbaren Optionen |
Formatunterstützung | i_type für Dokumenttyp (HTM, TXT, BIN) | iv_content_type für MIME-Type (text/html, application/pdf, etc.) |
Einsatzgebiet | Klassisches ABAP (On-Premise, Suite, S/4HANA On-Prem) | ABAP Cloud / Steampunk / S/4HANA Cloud |
Fazit
Der klassische BCS-Mailversand in ABAP bietet nach wie vor Flexibilität, inklusive Funktionen wie Prioritäts- und Sensitivitätseinstellungen, direkter SAP-Benutzeradressierung und steuerbare Optionen für den Nachrichtentransport.
Mit dem Umstieg auf ABAP Cloud vereinfacht sich jedoch der Prozess. Weniger Klassen, kein umständliches Konvertieren von Inhalten, und eine klar strukturierte API machen den Code kürzer und leichter verständlich.
Allerdings verzichtet die moderne Variante bewusst auf bestimmte Features wie Priorität, Sensitivität oder den direkten Versand an SAP-Benutzer, um Sicherheit und Standardisierung zu gewährleisten.
Wer komplexe Mailfunktionen benötigt, muss daher in ABAP Cloud auf ergänzende Services oder APIs zurückgreifen.
Für den Großteil der Anwendungsfälle reicht jedoch die integrierte CL_BCS_MAIL_MESSAGE aus.
Weitere spannende Themen der SAP-Community
