Hallo ich suche einen Funktionsbaustein( äquivalent zu :SSF_FUNCTION_MODULE_NAME )
der ein PDF Formular, was ich vorher erstellt habe, als eMail versendet.
Bisher habe ich nur ein Programm, das ein PDF hochlädt vom PC und diese dann versendet. Hat jemand eine Idee oder Lösung?
Vielen Dank
Herbert
------------------------------
Coding meines Programms:
( REPORT Z_DBM_IA_DEMO_1.
PARAMETERS: p_email TYPE adr6-smtp_addr OBLIGATORY DEFAULT 'eMail adress'. " Email-Adr. des Empfängers
PARAMETERS: p_subj TYPE string DEFAULT 'Testmail Prototyp Angebot.'. " Email-Subject
PARAMETERS: p_bdytxt TYPE soli DEFAULT 'SIEHE pdf.'. " eine Mailtext-Zeile
PARAMETERS: p_pdf TYPE file_table-filename OBLIGATORY DEFAULT 'C:\Temp\ANGEBOT.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.
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
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.