HTML E-Mail inklusive Bild versenden
Wie du mit ABAP ein Bild direkt aus dem MIME-Repository in eine HTML-E-Mail einbindest – mit vollständigem Beispielprogramm, Schritt-für-Schritt-Erklärung und BCS-Versand.
Das Versenden von HTML-E-Mails aus ABAP ist mit der Klasse cl_gbt_multirelated_service gut dokumentiert. Weniger offensichtlich ist, wie sich dabei ein Bild direkt aus dem MIME-Repository einbinden lässt – ohne externe URL und ohne manuelle Dateiablage. Dieser Beitrag zeigt den vollständigen Ablauf: vom Laden des Bildobjekts über die Datenvorbereitung bis zum fertigen E-Mail-Versand mit eingebettetem Bild.
Programm
Das folgende ABAP-Programm demonstriert den vollständigen Ablauf in einem eigenständigen Report. Es kann als Vorlage für eigene Implementierungen verwendet werden – etwa in Klassen, Formularen oder Hintergrundprogrammen.
Programm anzeigen (68 Zeilen)
REPORT zstkoes_send_html_mail.
DATA(lo_mime_helper) = NEW cl_gbt_multirelated_service( ).
" Get MIME-Repository Object
DATA(gv_filename) = |ABDOC_SOC_bad_DE.jpg|.
cl_mime_repository_api=>get_api( )->get(
EXPORTING
i_url = |SAP/PUBLIC/BC/ABAP/{ gv_filename }|
i_check_authority = abap_true
IMPORTING
e_content = DATA(gv_content)
e_mime_type = DATA(gv_mime_type)
EXCEPTIONS
parameter_missing = 1
error_occured = 2
not_found = 3
permission_failure = 4
OTHERS = 5 ).
IF sy-subrc EQ 0 AND gv_content IS NOT INITIAL.
*... split xstring into lt_solix table (which is need for email)
DATA(lt_solix) = VALUE solix_tab( LET lv_total_length = xstrlen( gv_content ) lv_max_off = lv_total_length - 255 IN
FOR lv_off = 0 THEN lv_off + 255 UNTIL lv_off GT lv_total_length
( line = COND #( WHEN lv_off LE lv_max_off
THEN gv_content+lv_off(255)
ELSE gv_content+lv_off ) ) ).
*Attach image to HTML body
DATA(gv_obj_len) = xstrlen( gv_content ).
lo_mime_helper->add_binary_part( content = lt_solix
content_type = CONV #( gv_mime_type )
length = CONV #( gv_obj_len )
content_id = gv_filename ).
ENDIF.
*... create the HTML content for the body of the email
DATA(lt_soli) = VALUE soli_tab(
( |<html xmlns="http://www.w3.org/1999/xhtml" xmlns:xfa="http://www.xfa.org/schema/xfa-template/2.1/"><head></head>| )
( |<body>| )
( |<p>Manchmal ist es notwendig ein Bild in eine E-Mail einzubinden.</p>| )
( COND #( WHEN lt_solix IS NOT INITIAL
THEN |<p><img alt="logo" src="cid:{ gv_filename }" /></p>| ) )
( |<p>Und hier ist, wie es funktioniert.</p>| )
( |</body></html>| ) ).
*... set the HTML with description
lo_mime_helper->set_main_html( content = lt_soli
filename = 'message.htm' " filename for HMTL form
description = 'Email message' ). " Title
"Create HTML using BCS class and attach html and image part to it.
DATA(lo_doc_bcs) = cl_document_bcs=>create_from_multirelated( i_subject = 'E-Mail mit MIME-Repository Bild'
i_multirel_service = lo_mime_helper ).
DATA(lo_bcs) = cl_bcs=>create_persistent( ).
"Create Document
lo_bcs->set_document( i_document = lo_doc_bcs ).
* Set sender
lo_bcs->set_sender( cl_cam_address_bcs=>create_internet_address( 'abap@koester-consulting.eu' ) ).
"Set Recipient
lo_bcs->add_recipient( cl_cam_address_bcs=>create_internet_address( 'abap@koester-consulting.eu' ) ).
lo_bcs->send( ).
COMMIT WORK.
Ablauf im Detail
Bild aus dem MIME-Repository laden
Über die Klasse cl_mime_repository_api wird das gewünschte Bildobjekt anhand seines Pfads im MIME-Repository geladen. Die Methode gibt sowohl den binären Inhalt (de>gv_content als XSTRING) als auch den zugehörigen MIME-Typ zurück – z. B. image/jpeg. Beide Werte werden für das spätere Einbinden in die E-Mail benötigt.
Datenvorbereitung: XSTRING in SOLIX konvertieren
Der BCS-Versandweg erwartet den Bildinhalt im Format solix_tab – einer internen Tabelle mit Zeilen von je 255 Bytes. Der XSTRING-Inhalt wird daher in Einzelstücke aufgeteilt und Zeile für Zeile in die Tabelle übertragen. Dieser Konvertierungsschritt ist zwingend erforderlich, damit das Bild korrekt als Binary Part an die E-Mail angehängt werden kann.
Content-ID: Schlüssel zur Bildverknüpfung
Beim Hinzufügen des Bildes als Binary Part wird eine Content-ID content_id) vergeben – in diesem Beispiel der Dateiname des Bildes. Diese ID ist der Schlüssel, um das Bild im HTML-Body referenzieren zu können. Im HTML-Tag erfolgt die Verknüpfung über das cid:-Präfix:
<img src="cid:ABDOC_SOC_bad_DE.jpg">
Stimmen content_id und der cid-Wert im HTML überein, wird das Bild direkt in der E-Mail angezeigt – ohne externe Verlinkung.
Versand mit BCS
Das fertige Multirelated-Dokument wird über cl_document_bcs erstellt und in eine BCS-Instanz eingebunden. Nach der Konfiguration von Absender und Empfänger löst lo_bcs->send() den Versand aus. Wichtig: Erst das abschließende COMMIT WORK überträgt die E-Mail tatsächlich an den SAP-Mailserver.