* _______ _______ _______ _______ _______ _______ ______ _______ _______ ______ _______ * | _ | _ | _ | | | _ | || _ | _ | _ | | _ | * | |_| | |_| | |_| | _ | | |_| | _ | |_| | |_| | | || | |_| | * | | | | |_| | | | | | | | | |_||_| | * | | _ || | ___| _| | |_| | | _ || __ | | * | _ | |_| | _ | | | |_| _ | | _ | |_| | | | | _ | * |__| |__|_______|__| |__|___| |_______|__| |__|______||__| |__|_______|___| |_|__| |__| * www.abapcadabra.com * *------------------------------------------------------------------------------------------- * program : ZABAPCADABRA_MAIL_A_FILE * title : 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 for "Mail-a-file" on AbapcadabrA.com * 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 * 15/08/2016 Mail-about-a-file, add a status message {MESSAGE} and * add some options to cater for "send an email about a * file (without adding it)" *--------------------------------------------------------------------- REPORT ZABAPCADABRA_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, gv_message type string, gv_filename type string. 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, enrich, 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 BEGIN OF LINE. PARAMETERS: pa_noatt AS CHECKBOX. selection-SCREEN COMMENT 3(45) lbl_05 FOR FIELD pa_noatt. 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_abca USER-COMMAND ABAPCADABRA 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 'ABAPCADABRA'. CALL FUNCTION 'CALL_BROWSER' EXPORTING URL = 'http://abapcadabra.com/index.php/interfacing/525-mail-a-file' 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 file open error' TYPE 'E'. ENDCASE. else. MESSAGE 'Functionality not supported' 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 = 'Select a standard SO10 text' 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 'Message from SAP' sy-sysid 'client' 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 = 'ST' LANGUAGE = tdspras NAME = tdname OBJECT = 'TEXT' 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 'This email was created in SAP' sy-sysid 'client' 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[]. gv_filename = filename. CASE gv_attachment_type. WHEN 'BIN'. OPEN DATASET filename IN BINARY MODE FOR INPUT. IF sy-subrc <> 0. MESSAGE 'File could not be opened' TYPE 'I'. gv_message = '(Binary) file NOT available'. EXIT. "<= Leave the method ENDIF. gv_message = '(Binary) file available'. READ DATASET filename INTO gv_attachment. WHEN OTHERS. OPEN DATASET filename IN TEXT MODE FOR INPUT ENCODING DEFAULT. IF sy-subrc <> 0. MESSAGE 'File could not be opened' TYPE 'I'. gv_message = '(Text) file NOT available'. EXIT. "<= Leave the method ENDIF. gv_message = '(Text) file available'. WHILE sy-subrc = 0. READ DATASET filename INTO lv_buffer. APPEND lv_buffer TO gt_attachment_lines. ENDWHILE. ENDCASE. CLOSE DATASET filename. ENDMETHOD. METHOD enrich. DATA: lv_system TYPE c LENGTH 15, lv_system_str TYPE string. field-symbols type SOLI. CONCATENATE sy-sysid sy-mandt INTO lv_system SEPARATED BY '_'. CONDENSE lv_system NO-GAPS. lv_system_str = lv_system. REPLACE '{MESSAGE}' WITH gv_message INTO gv_subject. REPLACE '{MSG}' WITH gv_message INTO gv_subject. REPLACE '{FILENAME}' WITH gv_filename INTO gv_subject. REPLACE '{S}' WITH lv_system_str INTO gv_subject. loop at gt_email_body assigning . REPLACE '{MESSAGE}' WITH gv_message INTO . REPLACE '{MSG}' WITH gv_message INTO . REPLACE '{FILENAME}' WITH gv_filename INTO . REPLACE '{S}' WITH lv_system_str INTO . endloop. 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( ). * Update variables in the longtext (email body) or subject: enrich( ). * 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 if pa_noatt = space. 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 ). endif. * 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 'An email has been created (check SOST)' 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_abca = '@N5\QMore on AbapcadabrA.com@'. lbl_01 = 'Server file'. lbl_02 = 'Alt. Attachment name'. lbl_03 = 'Attachment type'. lbl_04 = 'Burn after reading (remove file from server)'. lbl_05 = 'Do not attach the file'. lbl_10 = 'Subject'. lbl_11 = 'Body text'. lbl_12 = 'Language'. lbl_13 = 'Receiver(s)'. 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 or pa_noatt = abap_true. lcl_mailman=>send_email( ). else. message 'No email sent(no attachment available)' type 'S'. endif.