* __ __ ______ _______ __ __ _______ __ _ __ _ _______ ___ _______ * | | | | _ | | | | | | _ | | | | | | | | | | | * | |_| | | || | | |_| | |_| | |_| | |_| | ___| | | _____| * | | |_||_ | | | | | | |___| | | |_____ * | | __ | | _| | | _ | _ | ___| |___|_____ | * | _ | | | | | |_| _ | _ | | | | | | | |___| |_____| | * |__| |__|___| |_| |_______|__| |__|__| |__|_| |__|_| |__|_______|_______|_______| * platform voor Nederlandstalige HR SAP software componenten www.HRchannels.nl *------------------------------------------------------------------------------------------- * program : ZHRCHANNELS_MAIL_A_FILE * title : Verstuur een email met een (server) bestand als bijlage * Pick up a file from the server and email it to a receiver * functional area : Cross modules * environment : 4.7 * program Function : A simple add-on that can be used to port file-based output * to an email receiver. Subject, email body and receivers * can be set via the report selection screen. * If it's output of a report you would like to send, use * the Report to File report, search AbapcarabrA.com for * "Report output to a file". Also check out the "Download * tool" on AbapcadabrA, with which you can prepare a file * and place it on the server - any selection can be * defined via the selection screens. * Documentation : Search HRchannels.nl * Installation : Turn-key report (create executable Abap source code and start) * Translation to English: * L01;Server file * L02;Alt. Attachment name * L03;Attachment type * L04;Burn after reading (remove file from server) * L05;Subject * L06;Body text * L07;Language * L08;Receiver(s) * M01;Server file open error * M02;Functionality not supported * M03;Select a standard SO10 text * M04;Message from SAP * M05;client * M06;File could not be opened * M07;An email has been created (check SOST) * M08;No email sent(no attachment available) * Previous version : This is the initial version * Developer name : Wim Maasdam * Development date : 27/05/2015 * Version : 0.1 *--------------------------------------------------------------------- * Change list: * Date Description * 27/05/2015 Initial release * 10/06/2015 Test defect:attachment type not filled = no response * 19/06/2015 Issue with TXT attachment type - attachments w/o content * 26/01/2016 Beschikbaar maken voor HRchannels.nl, Nederlandse vertaling *--------------------------------------------------------------------- REPORT ZHRCHANNELS_MAIL_A_FILE. TABLES: stxh, sscrfields. "Selection screen purpose only TYPE-POOLS: VRM. *--------------------------------------------------------------------- * C L A S S D E F I N I T I O N *--------------------------------------------------------------------- CLASS lcl_utilities DEFINITION. PUBLIC SECTION. CLASS-METHODS: set_listbox_static, f4_server_file CHANGING filepath TYPE ANY, f4_so10_texts CHANGING tdname TYPE stxh-tdname, call_so10_editor IMPORTING tdname TYPE stxh-tdname tdspras TYPE stxh-tdspras, system_path_separator returning value(slash) type char01, extract_filename importing full_name type any returning value(filename) type string, prep_filename CHANGING filename type any. ENDCLASS. "lcl_f4_processing DEFINITION CLASS lcl_mailman DEFINITION. PUBLIC SECTION. TYPES: BEGIN OF ty_receiver, email TYPE ad_smtpadr, name TYPE ad_smtpadr, END OF ty_receiver, BEGIN OF ty_content, line type char255, END OF ty_content. CLASS-DATA: gt_receivers TYPE STANDARD TABLE OF ty_receiver, gt_email_body TYPE BCSY_TEXT, gv_subject TYPE SOOD-OBJDES, gv_att_subject TYPE SOOD-OBJDES, gv_attachment_type TYPE C length 3, gt_attachment_lines TYPE STANDARD TABLE OF ty_content, gv_attachment TYPE xstring. CLASS-METHODS: set_subject IMPORTING subject TYPE ANY att_subject TYPE ANY, read_body_text IMPORTING tdname TYPE stxh-tdname tdspras TYPE stxh-tdspras, set_receivers IMPORTING r1 TYPE ANY r2 TYPE ANY r3 TYPE ANY r4 TYPE ANY r5 TYPE ANY, read_attachment_file IMPORTING filename TYPE ANY, send_email, burn_after_reading. ENDCLASS. *--------------------------------------------------------------------- * S E L E C T I O N - S C R E E N *--------------------------------------------------------------------- selection-SCREEN BEGIN OF LINE. selection-SCREEN COMMENT 1(23) lbl_01 FOR FIELD pa_file. PARAMETERS: pa_file TYPE C length 100 LOWER CASE visible length 50 OBLIGATORY. selection-SCREEN END OF LINE. selection-SCREEN BEGIN OF LINE. selection-SCREEN COMMENT 1(23) lbl_02 FOR FIELD pa_atsu. PARAMETERS: pa_atsu TYPE C length 50 LOWER CASE. selection-SCREEN END OF LINE. selection-SCREEN BEGIN OF LINE. selection-SCREEN COMMENT 1(23) lbl_03 FOR FIELD pa_attt. PARAMETERS: pa_attt TYPE C LENGTH 3 AS LISTBOX VISIBLE LENGTH 18. selection-SCREEN END OF LINE. selection-SCREEN BEGIN OF LINE. PARAMETERS: pa_burn AS CHECKBOX. selection-SCREEN COMMENT 3(45) lbl_04 FOR FIELD pa_burn. selection-SCREEN END OF LINE. selection-SCREEN SKIP. selection-SCREEN BEGIN OF LINE. selection-SCREEN COMMENT 1(23) lbl_10 FOR FIELD pa_subj. PARAMETERS: pa_subj TYPE C length 100 LOWER CASE visible length 56. selection-SCREEN END OF LINE. selection-SCREEN BEGIN OF LINE. selection-SCREEN COMMENT 1(23) lbl_11 FOR FIELD pa_body. PARAMETERS: pa_body TYPE stxh-tdname. SELECTION-SCREEN PUSHBUTTON (4) but_01 USER-COMMAND SO10. selection-SCREEN END OF LINE. selection-SCREEN BEGIN OF LINE. selection-SCREEN COMMENT 1(23) lbl_12 FOR FIELD pa_langu. PARAMETERS: pa_langu TYPE stxh-tdspras DEFAULT sy-langu. selection-SCREEN END OF LINE. selection-SCREEN SKIP. selection-SCREEN BEGIN OF LINE. selection-SCREEN COMMENT 1(23) lbl_13 FOR FIELD pa_rec1. PARAMETERS: pa_rec1 TYPE C length 100 LOWER CASE visible length 50 OBLIGATORY. selection-SCREEN END OF LINE. selection-SCREEN BEGIN OF LINE. selection-SCREEN POSITION 25. PARAMETERS: pa_rec2 TYPE C length 100 LOWER CASE visible length 50. selection-SCREEN END OF LINE. selection-SCREEN BEGIN OF LINE. selection-SCREEN POSITION 25. PARAMETERS: pa_rec3 TYPE C length 100 LOWER CASE visible length 50. selection-SCREEN END OF LINE. selection-SCREEN BEGIN OF LINE. selection-SCREEN POSITION 25. PARAMETERS: pa_rec4 TYPE C length 100 LOWER CASE visible length 50. selection-SCREEN END OF LINE. selection-SCREEN BEGIN OF LINE. selection-SCREEN POSITION 25. PARAMETERS: pa_rec5 TYPE C length 100 LOWER CASE visible length 50. selection-SCREEN END OF LINE. selection-SCREEN SKIP. selection-SCREEN BEGIN OF LINE. SELECTION-SCREEN PUSHBUTTON (70) lbl_link USER-COMMAND HRCHANNELS VISIBLE LENGTH 5. selection-SCREEN END OF LINE. AT selection-SCREEN ON VALUE-request FOR pa_file. lcl_utilities=>f4_server_file( CHANGING filepath = pa_file ). AT selection-SCREEN ON VALUE-request FOR pa_body. lcl_utilities=>f4_so10_texts( CHANGING tdname = pa_body ). AT SELECTION-SCREEN. CASE sscrfields-ucomm. WHEN 'SO10'. lcl_utilities=>call_so10_editor( EXPORTING tdname = pa_body tdspras = pa_langu ). WHEN 'HRCHANNELS'. CALL FUNCTION 'CALL_BROWSER' EXPORTING URL = 'http://www.hrchannels.nl/index.php/bibliotheek/14-infotype-bewerker-interface-2' EXCEPTIONS OTHERS = 0. ENDCASE. *--------------------------------------------------------------------- * C L A S S I M P L E M E N T A T I O N *--------------------------------------------------------------------- CLASS lcl_utilities IMPLEMENTATION. METHOD set_listbox_static. DATA: lt_list TYPE vrm_values, lw_list LIKE LINE OF lt_list. DEFINE set_format. lw_list-KEY = &1. IF &2 IS INITIAL. lw_list-TEXT = &1. ELSE. lw_list-TEXT = &2. ENDIF. APPEND lw_list TO lt_list. END-OF-DEFINITION. CLEAR lt_list[]. set_format: 'TXT' 'As text', 'BIN' 'Binary'. CALL FUNCTION 'VRM_SET_VALUES' EXPORTING ID = 'PA_ATTT' values = lt_list. ENDMETHOD. METHOD f4_server_file. DATA: lv_old_filepath TYPE string. lv_old_filepath = filepath. if system_path_separator( ) = '/'. CALL FUNCTION '/SAPDMC/LSM_F4_SERVER_FILE' EXPORTING directory = filepath filemask = ' ' IMPORTING serverfile = filepath EXCEPTIONS canceled_by_user = 1 OTHERS = 2. CASE sy-subrc. WHEN 1. filepath = lv_old_filepath. WHEN 2. MESSAGE 'Server bestand - kon bestand niet openen'(M01) TYPE 'E'. ENDCASE. else. MESSAGE 'Functionaliteit niet ondersteund'(M02) TYPE 'S'. endif. ENDMETHOD. "f4_server_file METHOD f4_so10_texts. TYPES: BEGIN OF lty_columns, * List the fields you want to show in the F4 popup tdname TYPE stxh-tdname, END OF lty_columns. DATA: lt_columns TYPE STANDARD TABLE OF lty_columns. CLEAR: lt_columns[]. * Set selection values / note this is just for example purpose: SELECT tdname FROM stxh INTO TABLE lt_columns WHERE TDOBJECT = 'TEXT' AND TDID = 'ST ' AND TDSPRAS = pa_langu. CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST' EXPORTING retfield = 'TDNAME' dynpprog = SY-REPID dynpnr = '1000' dynprofield = 'PA_BODY' WINDOW_TITLE = 'Selecteer een text (SO10)'(M03) value_org = 'S' TABLES value_tab = lt_columns. ENDMETHOD. METHOD call_so10_editor. DATA: lt_bdcdata TYPE STANDARD TABLE OF bdcdata, lw_bdcdata TYPE bdcdata. * bdc_add 'X' 'PROGRAM_NAME' 'SCREEN NUMBER'. * bdc_add ' ' 'FIELDNAME' 'FIELDVALUE'. DEFINE bdc_add. CLEAR lw_bdcdata. lw_bdcdata-dynbegin = &1. IF &1 EQ 'X'. lw_bdcdata-PROGRAM = &2. lw_bdcdata-DYNPRO = &3. ELSE. lw_bdcdata-fnam = &2. lw_bdcdata-fval = &3. ENDIF. APPEND lw_bdcdata TO lt_bdcdata. END-OF-DEFINITION. CLEAR lt_bdcdata. bdc_add: 'X' 'SAPMSSCE' '1100', ' ' 'RSSCE-TDNAME' tdname, ' ' 'RSSCE-TDSPRAS' tdspras. CALL TRANSACTION 'SO10' USING lt_bdcdata MODE 'E'. ENDMETHOD. METHOD system_path_separator. DATA: lw_pars TYPE spfpflpar. lw_pars-parname = 'DIR_HOME'. CALL FUNCTION 'RSAN_SYSTEM_PARAMETER_READ' EXPORTING i_name = lw_pars-parname IMPORTING e_value = lw_pars-pvalue EXCEPTIONS OTHERS = 0. slash = lw_pars-pvalue(1). if slash <> '/'. slash = '\'. endif. ENDMETHOD. METHOD extract_filename. data: lt_tokens type STANDARD TABLE OF string, lv_string type string, lv_slash type char01. lv_slash = system_path_separator( ). split full_name at lv_slash into table lt_tokens. loop at lt_tokens into lv_string. endloop. filename = lv_string. ENDMETHOD. METHOD prep_filename. DATA: lv_system TYPE c LENGTH 15, lv_system_str TYPE string. CONCATENATE sy-sysid sy-mandt INTO lv_system SEPARATED BY '_'. CONDENSE lv_system NO-GAPS. lv_system_str = lv_system. REPLACE '{S}' WITH lv_system_str INTO filename. REPLACE '{D}' WITH sy-datum INTO filename. REPLACE '{T}' WITH sy-uzeit INTO filename. REPLACE '{H}' WITH sy-uzeit(2) INTO filename. REPLACE '{M}' WITH sy-uzeit+2(2) INTO filename. REPLACE '{C}' WITH sy-mandt(3) INTO filename. ENDMETHOD. "prep_filename ENDCLASS. "lcl_f4_processing IMPLEMENTATION CLASS lcl_mailman IMPLEMENTATION. METHOD set_subject. IF NOT subject IS INITIAL. gv_subject = subject. ELSE. CONCATENATE 'Bericht uit SAP'(M04) sy-sysid 'mandant'(M05) sy-mandt INTO gv_subject SEPARATED BY space. ENDIF. * The attachment name - determined from the full filename or from * a selection screen parameter: IF NOT att_subject IS INITIAL. gv_att_subject = att_subject. ELSE. gv_att_subject = LCL_UTILITIES=>EXTRACT_FILENAME( pa_file ). ENDIF. ENDMETHOD. METHOD read_body_text. DATA: lt_lines TYPE STANDARD TABLE OF TLINE, lw_tline TYPE TLINE. IF NOT tdname IS INITIAL. * Read the standard SO10 longtext CLEAR: lt_lines[]. CALL FUNCTION 'READ_TEXT' EXPORTING ID = 'TEXT' LANGUAGE = tdspras NAME = tdname OBJECT = 'ST ' TABLES LINES = lt_lines EXCEPTIONS OTHERS = 0. LOOP AT lt_lines INTO lw_tline. APPEND lw_tline-tdline TO gt_email_body. ENDLOOP. ENDIF. CONCATENATE 'Bericht uit SAP'(M04) sy-sysid 'mandant'(M05) sy-mandt INTO lw_tline-tdline SEPARATED BY space. APPEND space TO gt_email_body. APPEND lw_tline-tdline TO gt_email_body. ENDMETHOD. METHOD set_receivers. DATA: lw_receiver TYPE ty_receiver. lw_receiver-email = r1. APPEND lw_receiver TO gt_receivers. IF NOT R2 IS INITIAL. lw_receiver-email = r2. APPEND lw_receiver TO gt_receivers. ENDIF. IF NOT R3 IS INITIAL. lw_receiver-email = r3. APPEND lw_receiver TO gt_receivers. ENDIF. IF NOT R4 IS INITIAL. lw_receiver-email = r4. APPEND lw_receiver TO gt_receivers. ENDIF. IF NOT R5 IS INITIAL. lw_receiver-email = r5. APPEND lw_receiver TO gt_receivers. ENDIF. ENDMETHOD. METHOD read_attachment_file. DATA: lv_buffer TYPE ty_content. CLEAR gt_attachment_lines[]. CASE gv_attachment_type. WHEN 'BIN'. OPEN DATASET filename IN BINARY MODE FOR INPUT. IF sy-subrc <> 0. MESSAGE 'Bestand kon niet worden geopend'(M06) TYPE 'W'. EXIT. "<= Leave the method ENDIF. READ DATASET filename INTO gv_attachment. WHEN OTHERS. OPEN DATASET filename IN TEXT MODE FOR INPUT ENCODING DEFAULT. IF sy-subrc <> 0. MESSAGE 'Bestand kon niet worden geopend'(M06) TYPE 'W'. EXIT. "<= Leave the method ENDIF. WHILE sy-subrc = 0. READ DATASET filename INTO lv_buffer. APPEND lv_buffer TO gt_attachment_lines. ENDWHILE. ENDCASE. CLOSE DATASET filename. ENDMETHOD. METHOD send_email. * local objects - referencing classes DATA: lo_send_request TYPE REF TO cl_bcs, lo_document TYPE REF TO cl_document_bcs, lo_receiver TYPE REF TO cl_cam_address_bcs, lo_sender TYPE REF TO cl_sapuser_bcs, * pool of help variables lv_status TYPE os_boolean, lv_length_hlp TYPE I, lv_length_att TYPE sood-objlen, lt_solix TYPE solix_tab, lw_receiver TYPE ty_receiver. TRY. * Create a request handler lo_send_request = cl_bcs=>create_persistent( ). * Link the body text to the email (document type RAW, importance 0 * and sensitivity F, all defaults) cl_document_bcs=>create_from_text( EXPORTING i_text = gt_email_body i_subject = gv_subject RECEIVING result = lo_document ). * Set the document on the request lo_send_request->set_document( EXPORTING i_document = lo_document ). * Add attachment CASE gv_attachment_type. WHEN 'BIN'. * Make attachment content available as attachment CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' EXPORTING BUFFER = gv_attachment "xstring IMPORTING output_length = lv_length_hlp TABLES binary_tab = lt_solix EXCEPTIONS OTHERS = 0. WHEN OTHERS. CALL FUNCTION 'SCMS_TEXT_TO_BINARY' IMPORTING OUTPUT_LENGTH = lv_length_hlp TABLES TEXT_TAB = gt_attachment_lines BINARY_TAB = lt_solix EXCEPTIONS OTHERS = 0. ENDCASE. lv_length_att = lv_length_hlp. * Add attachment to the document lo_document->add_attachment( EXPORTING i_attachment_type = 'BIN' "As binary (even the textlines) i_attachment_subject = gv_att_subject i_attachment_size = lv_length_att i_att_content_hex = lt_solix ). * Set the receivers LOOP AT gt_receivers INTO lw_receiver. cl_cam_address_bcs=>create_internet_address( EXPORTING i_address_string = lw_receiver-email i_address_name = lw_receiver-name RECEIVING result = lo_receiver ). lo_send_request->add_recipient( EXPORTING i_recipient = lo_receiver ). ENDLOOP. * Set the sender lo_sender = cl_sapuser_bcs=>create( sy-uname ). lo_send_request->set_sender( EXPORTING i_sender = lo_sender ). * Set the priority (to medium) scale 1 to 9 lo_send_request->set_priority( '5' ). * Send the email lv_status = lo_send_request->send( ). CATCH cx_send_req_bcs. CATCH cx_document_bcs. CATCH cx_address_bcs. ENDTRY. IF lv_status = 'X'. *------------------------------ COMMIT WORK. *------------------------------ message 'E-mail verzonden (controleer SOST)'(M07) type 'S'. burn_after_reading( ). ENDIF. ENDMETHOD. "send_email METHOD burn_after_reading. check not pa_burn is initial. delete dataset pa_file. ENDMETHOD. ENDCLASS. *--------------------------------------------------------------------- * I N I T I T A L I Z A T I O N *--------------------------------------------------------------------- INITIALIZATION. * All texts for this report have been set up as hard-coded texts (no use * of the report text-pool). Reason: easy copying of report source code. lbl_link = '@N5\QMeer op HRchannels.nl@'. lbl_01 = 'Server bestand'(L01). lbl_02 = 'Alt. bijlage naam'(L02). lbl_03 = 'Type bijlage'(L03). lbl_04 = 'Bestand verwijderen van de server'(L04). lbl_10 = 'Onderwerp'(L05). lbl_11 = 'Inhoud (tekst)'(L06). lbl_12 = 'Taal'(L07). lbl_13 = 'Ontvanger(s)'(L08). but_01 = '@3I@'. lcl_utilities=>set_listbox_static( ). *--------------------------------------------------------------------- * S T A R T - O F - S E L E C T I O N *--------------------------------------------------------------------- start-OF-selection. lcl_utilities=>prep_filename( changing filename = pa_file ). lcl_mailman=>gv_attachment_type = pa_attt. lcl_mailman=>set_subject( EXPORTING subject = pa_subj att_subject = pa_atsu ). lcl_mailman=>read_body_text( EXPORTING tdname = pa_body tdspras = pa_langu ). lcl_mailman=>set_receivers( EXPORTING r1 = pa_rec1 r2 = pa_rec2 r3 = pa_rec3 r4 = pa_rec4 r5 = pa_rec5 ). lcl_mailman=>read_attachment_file( EXPORTING filename = pa_file ). if not lcl_mailman=>gv_attachment is initial or not lcl_mailman=>gt_attachment_lines[] is initial. lcl_mailman=>send_email( ). else. message 'Geen email verzonden (geen bijlage beschikbaar)'(M08) type 'S'. endif.