E-Mail

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.

E-Mail

Zurück zur Blog-Übersicht