* https://www.sapnuts.com/tutorials/Sending-email-with-attachment-in-SAP-ABAP/singlepage.html
* http://www.sapwiki.cl/wiki/index.php?title=SAP_ABAP_CORREO
* http://www.berater-wiki.de/index.php?title=PDF_per_Mail/Fax_verschicken
* https://wiki.scn.sap.com/wiki/display/ABAP/Sending+Mails+-+Home+Page?original_fqdn=wiki.sdn.sap.com#SendingMails-HomePage-CL_BCS
* http://www.apentia-forum.de/viewtopic.php?f=2&t=74925&start=0
PARAMETERS: p_email TYPE adr6-smtp_addr OBLIGATORY DEFAULT 'email@email.com'. " Email-Adr. des Empfängers
PARAMETERS: p_subj TYPE string DEFAULT 'Testmail.'. " Email-Subject
PARAMETERS: p_bdytxt TYPE soli DEFAULT 'Testtext.'. " eine Mailtext-Zeile
PARAMETERS: p_pdf TYPE file_table-filename OBLIGATORY DEFAULT 'C:\Temp\Test.pdf'. " PDF-Anhang
* wenn die F4-Hilfe für den Dateinamen aufgerufen wird
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_pdf.
DATA: lv_rc TYPE i.
DATA: it_files TYPE filetable.
DATA: lv_action TYPE i.
* File-Tabelle leeren, da hier noch alte Einträge von vorherigen
* Aufrufen drin stehen können
CLEAR: it_files.
* FileOpen-Dialog aufrufen
TRY.
cl_gui_frontend_services=>file_open_dialog( EXPORTING
file_filter = |PDF (*.pdf)\|*.pdf\|{ cl_gui_frontend_services=>filetype_all }|
CHANGING
file_table = it_files " ausgewählte Dateien
rc = lv_rc " Anzahl ausgewählte Dateien, -1 bei Fehler
user_action = lv_action ).
IF lv_action = cl_gui_frontend_services=>action_ok.
* wenn Datei ausgewählt wurde
IF lines( it_files ) > 0.
* ersten Tabelleneintrag lesen
p_pdf = it_files[ 1 ]-filename.
ENDIF.
ENDIF.
CATCH cx_root INTO DATA(e_text).
MESSAGE e_text->get_text( ) TYPE 'S'.
ENDTRY.
START-OF-SELECTION.
DATA: lv_pdf_size TYPE i.
DATA: it_pdf_data_tab TYPE solix_tab.
TRY.
* PDF-Datei vom lokalen Rechner auf den Appl.-Server hochladen
cl_gui_frontend_services=>gui_upload( EXPORTING
filename = |{ p_pdf }|
filetype = 'BIN'
IMPORTING
filelength = lv_pdf_size
CHANGING
data_tab = it_pdf_data_tab ).
IF sy-subrc = 0.
* it_body_txt beinhaltet die Zeilen des Body-Textes
* die Zeilen sind jeweils char255 Zeichen lang
* eine Zeile (line) ist vom Typ SOLI
DATA(it_body_txt) = VALUE soli_tab( ( line = p_bdytxt ) ).
* Document (Mail) erzeugen
* Email-Subject (i_subject) darf hier max. 50 Zeichen lang sein (Subject-Darstellung in der SOST)
* die "richtige" Übergabe des Email-Subjects erfolgt weiter unten in der Funktion set_message_subject( )
DATA(o_document) = cl_document_bcs=>create_document( i_type = 'RAW'
i_text = it_body_txt
i_subject = CONV so_obj_des( p_subj ) ).
* Attachement hinzufügen -> Typen siehe Tabelle TSOTD
* siehe auch: http://www.apentia-forum.de/viewtopic.php?f=2&t=74925&start=0
o_document->add_attachment( i_attachment_type = 'EXT'
i_attachment_subject = |{ p_pdf }|
i_att_content_hex = it_pdf_data_tab ).
* Sendrequest erzeugen
DATA(o_send_request) = cl_bcs=>create_persistent( ).
* Email-Subject festlegen, ip_subject ist vom Typ String
o_send_request->set_message_subject( ip_subject = p_subj ).
* Die Mail an den Sendrequest hängen
o_send_request->set_document( o_document ).
* Sender
* SAP-User als Sender
DATA(o_sender) = cl_sapuser_bcs=>create( sy-uname ).
* Email-Adresse als Sender
* DATA(o_sender) = cl_cam_address_bcs=>create_internet_address( i_address_string = 'email@email.com' ).
o_send_request->set_sender( o_sender ).
* Empfänger -> beachte: u.U. sind Email-Adressen mit Umlauten nicht zulässig -> Exception
DATA(o_recipient) = cl_cam_address_bcs=>create_internet_address( p_email ).
o_send_request->add_recipient( i_recipient = o_recipient
i_express = abap_true
" i_copy = abap_true " CC
" i_blind_copy = abap_true " BCC
).
* Sofort senden
o_send_request->set_send_immediately( abap_true ).
* Dokument senden
IF o_send_request->send( i_with_error_screen = abap_true ) = abap_true.
WRITE: / 'Email gesendet.'.
ELSE.
WRITE: / 'Fehler beim Email-Versand.'.
ENDIF.
DATA: lv_in_update_task TYPE sy-subrc.
* Überprüft, ob das Programm im Verbucher abläuft
CALL FUNCTION 'TH_IN_UPDATE_TASK'
IMPORTING
in_update_task = lv_in_update_task.
IF lv_in_update_task EQ 0.
* Persistenzdienste des Objektes starten, sonst wird ggf. die Mail nicht gesendet
COMMIT WORK.
ENDIF.
ENDIF.
CATCH cx_root INTO DATA(e_text).
WRITE: / e_text->get_text( ).
ENDTRY.