Willkommen zu unserem How-to-Beitrag, der Ihnen Schritt für Schritt zeigt, wie Sie eine CSV-Datei per E-Mail direkt aus dem SAP-System mittels ABAP versenden können. Diese Anleitung richtet sich an Entwickler und IT-Fachkräfte, die bereits grundlegende Kenntnisse in ABAP besitzen und nun lernen möchten, wie Daten per Mail über das SAP-System verschickt werden können.
Wir führen Sie anhand eines Codebeispiels durch den kompletten Prozess, von der Vorbereitung und Formatierung Ihrer Daten in einer CSV-Datei, über das Einlesen und Konvertieren dieser Daten in ein geeignetes Format für den E-Mail-Versand, bis hin zur Konfiguration und Ausführung des Versende-Vorgangs selbst. Dabei werden Standardtexte für die E-Mail-Inhalte genutzt, die CSV-Datei der E-Mail angehängt und Empfängerlisten genutzt. Fehlermeldungen werden über Textbausteine in diesem Beispiel umgesetzt.
Aufbau des Programms
Das Beispielprogramm, das wir besprechen werden, enthält mehrere Schritte von der Definition von Bildschirmelementen zur Eingabe von E-Mail-Daten bis schließlich zum Senden der E-Mail mit CSV-Anhang. Hier ist der Aufbau des Programms:
1. Definition der Eingabefelder
Zunächst definieren wir die notwendigen Eingabefelder auf dem Bildschirm. Dies geschieht im sogenannten “SELECTION-SCREEN” Block. Hier werden verschiedene Parameter und Selektionsoptionen definiert, die der Benutzer ausfüllen muss.
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE TEXT–003.
SELECT-OPTIONS: s_rec FOR lv_rec NO INTERVALS MODIF ID b3,
s_recl FOR lv_recl NO INTERVALS MODIF ID b3.
PARAMETERS: p_sub TYPE c LENGTH 50 MODIF ID b3,
p_sen TYPE ad_smtpadr MODIF ID b3,
p_mailt TYPE tdobname MODIF ID b3,
p_maill TYPE lang MODIF ID b3 DEFAULT sy–langu.
SELECTION-SCREEN END OF BLOCK b3.
2. Überprüfung der Eingabedaten
Bevor die E-Mail gesendet wird, müssen wir sicherstellen, dass alle erforderlichen Felder ausgefüllt sind. Das Coding im FORM-Abschnitt emailcsv.
*&———————————————————————*
*& Form emailcsv
*&———————————————————————*
* text
*———————————————————————-*
FORM emailcsv.
*check if necessary fields are filled
IF s_rec IS INITIAL AND s_recl IS INITIAL.
MESSAGE TEXT–008 TYPE ‘I’.
EXIT.
ENDIF.
IF p_sub IS INITIAL.
MESSAGE TEXT–010 TYPE ‘I’.
EXIT.
ENDIF.
IF p_sen IS INITIAL.
MESSAGE TEXT–011 TYPE ‘I’.
EXIT.
ENDIF.
IF p_mailt IS INITIAL.
MESSAGE TEXT–012 TYPE ‘I’.
EXIT.
ENDIF.
IF p_maill IS INITIAL.
MESSAGE TEXT–013 TYPE ‘I’.
EXIT.
ENDIF.
TRY.
3. Lesen des Standardtextes
Der Inhalt der E-Mail kann aus einem im System gespeicherten Standardtext bestehen. Dieser wird mit dem Funktionsbaustein READ_TEXT gelesen.
*read standard text
CALL FUNCTION ‘READ_TEXT’
EXPORTING
id = ‘ST’
language = p_maill
name = p_mailt
object = ‘TEXT’
TABLES
lines = lt_tlines
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
OTHERS = 8.
IF sy–subrc <> 0.
MESSAGE TEXT–009 TYPE ‘I’.
EXIT.
ENDIF.
*clear column tlines-tdformat so just the text from the standard text gets passed as a mailtext
LOOP AT lt_tlines INTO ls_tlines.
ls_tlines–tdformat = ”.
APPEND ls_tlines TO lt_body_txt.
ENDLOOP.
4. Erstellen des E-Mail-Dokuments
Das E-Mail-Dokument wird erstellt und ein Anhang in CSV-Format hinzugefügt. Hierzu wird der Text zunächst in einen xstring und dann in ein Binärformat umgewandelt.
*create document (email)
lo_document = cl_document_bcs=>create_document( i_type = ‘RAW’
i_text = lt_body_txt
i_subject = p_sub
).
*for adding a attachment to an email the csv has to be converted to binary format
*first table to string
*then string to xstring
*finally xstring to binary
LOOP AT lt_csv INTO lv_line.
CONCATENATE lv_csv_string lv_line lv_separator INTO lv_csv_string.
ENDLOOP.
CALL FUNCTION ‘SCMS_STRING_TO_XSTRING’
EXPORTING
text = lv_csv_string
IMPORTING
buffer = lv_csv_xstring
EXCEPTIONS
OTHERS = 1.
CALL FUNCTION ‘SCMS_XSTRING_TO_BINARY’
EXPORTING
buffer = lv_csv_xstring
TABLES
binary_tab = lt_attachment
EXCEPTIONS
OTHERS = 1.
*add attachement
lo_document->add_attachment(
i_attachment_type = ‘CSV’
i_attachment_subject = lv_filenamemail
i_att_content_hex = lt_attachment
).
IF sy–subrc <> 0.
MESSAGE TEXT–005 TYPE ‘I’.
EXIT.
ENDIF.
5. Senden der E-Mail
Nachdem das Dokument und der Anhang erstellt wurden, wird die E-Mail zusammen mit den Empfängern über die Klasse cl_bcs gesendet.
*create send request
lv_subject = p_sub.
lo_send_request = cl_bcs=>create_persistent( ).
lo_send_request->set_message_subject( ip_subject = lv_subject ).
lo_send_request->set_document( lo_document ).
*set sender
lo_sender = cl_cam_address_bcs=>create_internet_address( i_address_string = p_sen ).
lo_send_request->set_sender( lo_sender ).
IF s_recl IS NOT INITIAL.
LOOP AT s_recl.
lv_recl = s_recl–low.
CALL FUNCTION ‘SO_DLI_READ_API1’
EXPORTING
dli_name = lv_recl “Unique name of distribution list to be viewed
shared_dli = ‘X’ “Flag: Shared distribution list
TABLES
dli_entries = lt_dli_tab
EXCEPTIONS
dli_not_exist = 1
operation_no_authorization = 2
parameter_error = 3
x_error = 4.
*only select email adresses from distribution list type = A
LOOP AT lt_dli_tab INTO ls_dli_tab.
IF ls_dli_tab–member_typ = ‘A’.
lv_rec = ls_dli_tab–member_adr.
lo_recipient = cl_cam_address_bcs=>create_internet_address( lv_rec ).
lo_send_request->add_recipient(
i_recipient = lo_recipient
i_express = abap_true
).
CLEAR lv_rec.
ENDIF.
ENDLOOP.
ENDLOOP.
ENDIF.
*set recipient and send email
LOOP AT s_rec.
lv_rec = s_rec–low.
lo_recipient = cl_cam_address_bcs=>create_internet_address( lv_rec ).
lo_send_request->add_recipient(
i_recipient = lo_recipient
i_express = abap_true
).
CLEAR lv_rec.
ENDLOOP.
lo_send_request->set_send_immediately( abap_false ).
IF lo_send_request->send( i_with_error_screen = abap_true ) = abap_true.
MESSAGE TEXT–006 TYPE ‘I’.
ELSE.
MESSAGE TEXT–007 TYPE ‘I’.
ENDIF.
COMMIT WORK.
CATCH cx_root INTO lo_text.
lv_error_text = lo_text->get_text( ).
WRITE: / lv_error_text.
ENDTRY.
ENDFORM. “emailcsv
Wenn Sie lernen möchten, wie Sie CSV-Dateien in Ihren ABAP Report einbinden und diese hoch- oder herunterladen können, lesen Sie doch unsere Anleitung zum Download und Upload von CSV-Dateien unter ABAP durch.