* __ __ ______ _______ __ __ _______ __ _ __ _ _______ ___ _______ * | | | | _ | | | | | | _ | | | | | | | | | | | * | |_| | | || | | |_| | |_| | |_| | |_| | ___| | | _____| * | | |_||_ | | | | | | |___| | | |_____ * | | __ | | _| | | _ | _ | ___| |___|_____ | * | _ | | | | | |_| _ | _ | | | | | | | |___| |_____| | * |__| |__|___| |_| |_______|__| |__|__| |__|_| |__|_| |__|_______|_______|_______| * platform voor Nederlandstalige HR SAP software componenten www.HRchannels.nl * *------------------------------------------------------------------------------------------- * program : ZHRCHANNELS_MAIL_FILES * title : Verstuur een email met meerdere bestanden als bijlagen * Pick up multiple files 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. * Documentation : HRchannels.nl * Previous version : This is the initial version * Developer name : Wim Maasdam * Development date : 19/11/2015 * Version : 1.0 * Translation : to English: * L01;Server path * L02;File pattern * L03;Only files younger than * L04;days * L05;Attachment type * L06;Burn after reading (remove files from server) * L07;Subject * L08;Body text * L09;Language * L10;Receiver(s) * M01;Server file open error * M02;Functionality not supported * M03;Select a standard SO10 text * M04;Message from SAP * M05;client * M10;File could not be opened * M11;An email has been created (check SOST) * M12;No email sent(folder invalid) * M13;No email sent (no files found) * M14;No email sent (more than 20 files) * M15;No email sent (over 1Mb) * S01;As text * S02;Binary *--------------------------------------------------------------------- * Change list: * Date Description * 19/11/2015 Initial release *--------------------------------------------------------------------- REPORT ZHRCHANNELS_MAIL_FILES. TABLES: stxh, sscrfields, VERMOD. "Selection screen purpose only TYPE-POOLS: VRM. *--------------------------------------------------------------------- * C L A S S D E F I N I T I O N *--------------------------------------------------------------------- CLASS LCL_folder DEFINITION. PUBLIC SECTION. TYPES: BEGIN OF ty_dir_entry, name(75), " name of entry type(15), " type of entry len(4) TYPE p DECIMALS 0, " length in bytes owner(8), " owner of the entry mtime(6) TYPE p DECIMALS 0, "seconds since 1st of Jan 1970 mode(9), " like "rwx-r-x--x": protection mode. mod_time type c length 8, mod_date type d, subrc(4), errno(3), errmsg(40), END OF ty_dir_entry. DATA: gv_folder type string, gv_total_len(9) TYPE p DECIMALS 0, gv_total_cnt type sy-dbcnt, gt_listing type standard table of ty_dir_entry. ENDCLASS. CLASS lcl_utilities DEFINITION. PUBLIC SECTION. CLASS-DATA: go_folder type ref to lcl_folder, gw_listing_entry type lcl_folder=>ty_dir_entry. 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, set_folder importing folder type string returning value(is_valid) type boolean, variabele_parser changing parse_field type string, compose_targetlist importing pattern type any age type any. ENDCLASS. 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_attachment_type TYPE C length 3, gv_burn_after_reading TYPE boolean, gt_attachment_lines TYPE STANDARD TABLE OF ty_content, gv_attachment TYPE xstring. CLASS-METHODS: set_subject IMPORTING 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, send_email. ENDCLASS. *--------------------------------------------------------------------- * S E L E C T I O N - S C R E E N *--------------------------------------------------------------------- SELECTION-SCREEN: BEGIN OF LINE, COMMENT 1(23) lbl_01 FOR FIELD pa_foldr. PARAMETERS pa_foldr TYPE string LOWER CASE VISIBLE LENGTH 70 OBLIGATORY. SELECTION-SCREEN: END OF LINE, BEGIN OF LINE, COMMENT 1(23) lbl_02 FOR FIELD pa_fpat. parameter pa_fpat type string LOWER CASE VISIBLE LENGTH 15 default '*' OBLIGATORY. selection-SCREEN: END OF LINE, SKIP, BEGIN OF LINE, COMMENT 1(23) lbl_03 FOR FIELD pa_age. PARAMETERS: pa_age TYPE n length 4 DEFAULT 5. selection-SCREEN: COMMENT 32(10) lbl_03b, END OF LINE, BEGIN OF LINE, COMMENT 1(23) lbl_04 FOR FIELD pa_attt. PARAMETERS: pa_attt TYPE C LENGTH 3 AS LISTBOX VISIBLE LENGTH 18 DEFAULT 'BIN'. selection-SCREEN: END OF LINE. selection-SCREEN BEGIN OF LINE. PARAMETERS: pa_burn AS CHECKBOX. selection-SCREEN COMMENT 3(45) lbl_05 FOR FIELD pa_burn. selection-SCREEN END OF LINE. selection-SCREEN SKIP. selection-SCREEN BEGIN OF LINE. selection-SCREEN COMMENT 1(23) lbl_06 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_07 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_08 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_09 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_foldr. CALL FUNCTION '/SAPDMC/LSM_F4_SERVER_FILE' EXPORTING DIRECTORY = pa_foldr FILEMASK = '(xxx)' "Explicitely supply dummy filemask IMPORTING SERVERFILE = pa_foldr EXCEPTIONS OTHERS = 0. 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/16-verstuur-meerder-bestanden' 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' 'Als tekst'(s01), 'BIN' 'Binair'(s02). 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 'Bestand kon niet geopend worden (server)'(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 = 'Selectteer een tekst (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 set_folder. data: lv_directory_prep type string, lv_directory type CHAR128. is_valid = abap_false. check not folder is initial and not folder co ' '. lv_directory_prep = folder. variabele_parser( changing parse_field = lv_directory_prep ). lv_directory = lv_directory_prep. shift lv_directory left DELETING LEADING space. CALL FUNCTION 'PFL_CHECK_DIRECTORY' EXPORTING DIRECTORY_LONG = lv_directory EXCEPTIONS OTHERS = 5. IF sy-subrc = 0. is_valid = abap_true. create object go_folder. go_folder->gv_folder = lv_directory. endif. ENDMETHOD. METHOD variabele_parser. DATA: lv_system TYPE c LENGTH 15, lv_system_str TYPE string, begin of lw_tokens, t1 type string, t2 type string, t3 type string, t4 type string, t5 type string, end of lw_tokens, lw_sys_parameter type SPFPFLPAR. CONCATENATE sy-sysid sy-mandt INTO lv_system SEPARATED BY '_'. CONDENSE lv_system NO-GAPS. lv_system_str = lv_system. REPLACE ALL OCCURRENCES OF '{S}' IN parse_field WITH lv_system_str. REPLACE ALL OCCURRENCES OF '{I}' IN parse_field WITH sy-sysid(3). REPLACE ALL OCCURRENCES OF '{C}' IN parse_field WITH sy-mandt(3). REPLACE ALL OCCURRENCES OF '{Y}' IN parse_field WITH sy-datum(4). REPLACE ALL OCCURRENCES OF '{H}' IN parse_field WITH sy-host. * Special processing for parameter references, which will check RSPARAM settings while parse_field cs '{P='. split parse_field at '{P=' into lw_tokens-t1 lw_tokens-t2. "\tmp\{P=INSTANCE_NAME}\more\ to \tmp\ and INSTANCE_NAME}\more\ split lw_tokens-t2 at '}' into lw_tokens-t3 lw_tokens-t4. "INSTANCE_NAME}\more\ to INSTANCE_NAME and \more\ lw_sys_parameter-PARNAME = lw_tokens-t3. CALL FUNCTION 'RSAN_SYSTEM_PARAMETER_READ' EXPORTING I_NAME = lw_sys_parameter-PARNAME IMPORTING E_VALUE = lw_sys_parameter-PVALUE EXCEPTIONS OTHERS = 4. IF SY-SUBRC <> 0. * lcl_logging=>set_error( message = 'Invalid parameter {P=&}' par1 = lw_sys_parameter-PARNAME ). concatenate lw_tokens-t1 '#ERROR#' lw_tokens-t4 into parse_field. else. concatenate lw_tokens-t1 lw_sys_parameter-PVALUE lw_tokens-t4 into parse_field. ENDIF. endwhile. ENDMETHOD. METHOD compose_targetlist. * Constants constants: co_1970 type d value '19700101', co_seconds_in_day(6) type p value 86400, " = 24 * 60 * 60 co_seconds_in_hour type p value 3600. " = 60 * 60 DATA: lv_oldest_mtime(6) type p decimals 0, lw_dir_entry TYPE lcl_folder=>ty_dir_entry, lv_directory TYPE edipo-outputdir, lv_now TYPE t, lv_pattern type string. lv_pattern = pattern. variabele_parser( changing parse_field = lv_pattern ). GET TIME FIELD lv_now. * Calculate the oldest time (new files should be ignored) lv_oldest_mtime = ( ( sy-datum - co_1970 ) * co_seconds_in_day ) + ( lv_now(2) * co_seconds_in_hour ) + ( lv_now+2(2) * 60 ) + ( lv_now+4(2) ). * If age is not set, simply assume "Now", if age is set, assume whole days. Thus * age = 1 means everything that was created yesterday is removed: if age > 0. lv_oldest_mtime = ( ( ( sy-datum - co_1970 ) - age + 1 ) * co_seconds_in_day ). endif. * Fetch the list of files. Supported for Windows and Unix systems: CLEAR: go_folder->gt_listing[], go_folder->gv_total_cnt, go_folder->gv_total_len. CALL 'C_DIR_READ_FINISH' ID 'ERRNO' FIELD lw_dir_entry-errno ID 'ERRMSG' FIELD lw_dir_entry-errmsg. lv_directory = go_folder->gv_folder. * Position the read in the directory we want CALL 'C_DIR_READ_START' ID 'DIR' FIELD lv_directory ID 'FILE' FIELD lv_pattern ID 'ERRNO' FIELD lw_dir_entry-errno ID 'ERRMSG' FIELD lw_dir_entry-errmsg. CHECK sy-subrc = 0. "If this step fails: simply stop processing * Find the files DO. CLEAR lw_dir_entry. CALL 'C_DIR_READ_NEXT' ID 'TYPE' FIELD lw_dir_entry-type ID 'NAME' FIELD lw_dir_entry-name ID 'LEN' FIELD lw_dir_entry-len ID 'OWNER' FIELD lw_dir_entry-owner ID 'MTIME' FIELD lw_dir_entry-mtime ID 'MODE' FIELD lw_dir_entry-mode ID 'ERRNO' FIELD lw_dir_entry-errno ID 'ERRMSG' FIELD lw_dir_entry-errmsg. IF sy-subrc <> 0 AND lw_dir_entry-name IS INITIAL. EXIT. "End of the listing has been reached ELSEIF sy-subrc = 3. "RC=3 File too big to fit in v_file-len CONTINUE. ELSEIF lw_dir_entry-name IS INITIAL. CONTINUE. ELSEIF lw_dir_entry-type <> 'file, regular'. "Files only CONTINUE. ELSEIF lv_oldest_mtime > lw_dir_entry-mtime. "NEW FILES ONLY CONTINUE. ELSEIF NOT lw_dir_entry-name CP lv_pattern. "< already captured in 'C_DIR_READ_START' CONTINUE. ENDIF. * Copied from an AL11 call: perform p6_to_date_time_tz in program rstr0400 using lw_dir_entry-mtime lw_dir_entry-mod_time lw_dir_entry-mod_date. APPEND lw_dir_entry TO go_folder->gt_listing. add 1 to go_folder->gv_total_cnt. add lw_dir_entry-len to go_folder->gv_total_len. ENDDO. CALL 'C_DIR_READ_FINISH' ID 'ERRNO' FIELD lw_dir_entry-errno ID 'ERRMSG' FIELD lw_dir_entry-errmsg. ENDMETHOD. 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. 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 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, lw_listing_entry TYPE lcl_folder=>ty_dir_entry, lv_buffer TYPE ty_content, lv_full_filename TYPE string, lv_objdes TYPE SOOD-OBJDES, lv_separator type c length 1. 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 attachments LOOP AT lcl_utilities=>GO_FOLDER->gt_listing INTO lw_listing_entry. CLEAR: gt_attachment_lines[], gv_attachment. lv_separator = LCL_UTILITIES=>system_path_separator( ). CONCATENATE lcl_utilities=>GO_FOLDER->gv_folder lw_listing_entry-name INTO lv_full_filename SEPARATED BY lv_separator. CASE gv_attachment_type. WHEN 'BIN'. OPEN DATASET lv_full_filename IN BINARY MODE FOR INPUT. IF sy-subrc <> 0. MESSAGE 'Bestand kon niet geopend worden'(M10) TYPE 'W'. EXIT. "<= Leave the method ENDIF. READ DATASET lv_full_filename INTO gv_attachment. WHEN OTHERS. OPEN DATASET lv_full_filename IN TEXT MODE FOR INPUT ENCODING DEFAULT. IF sy-subrc <> 0. MESSAGE 'Bestand kon niet geopend worden'(M10) TYPE 'W'. EXIT. ENDIF. WHILE sy-subrc = 0. READ DATASET lv_full_filename INTO lv_buffer. APPEND lv_buffer TO gt_attachment_lines. ENDWHILE. ENDCASE. CLOSE DATASET lv_full_filename. if gv_burn_after_reading = abap_true. DELETE DATASET lv_full_filename. endif. 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. lv_objdes = lw_listing_entry-name. * Add attachment to the document lo_document->add_attachment( EXPORTING i_attachment_type = 'BIN' "As binary (even the textlines) i_attachment_subject = lv_objdes i_attachment_size = lv_length_att i_att_content_hex = lt_solix ). ENDLOOP. * 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 'Email aangemaakt (controleer SOST)'(m11) TYPE 'S'. ENDIF. ENDMETHOD. "send_email 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 pad'(L01). lbl_02 = 'Patroon'(L02). lbl_03 = 'Alleen bestanden jonger dan'(L03). lbl_03b = 'dagen'(L04). lbl_04 = 'Bijlage type'(L05). lbl_05 = 'Burn after reading (verwijder bestanden)'(L06). lbl_06 = 'Onderwerp'(L07). lbl_07 = 'Body tekst'(L08). lbl_08 = 'Taal'(L09). lbl_09 = 'Ontvangers(s)'(L10). 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. * Prepare the mailman: email settings lcl_mailman=>gv_attachment_type = pa_attt. lcl_mailman=>gv_burn_after_reading = pa_burn. lcl_mailman=>set_subject( EXPORTING subject = pa_subj ). 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 ). * Prepare attachments: (list of files) if LCL_UTILITIES=>SET_FOLDER( pa_foldr ) = abap_false. message 'Geen email verzonden (foutieve map)'(m12) type 'S'. else. LCL_UTILITIES=>COMPOSE_TARGETLIST( pattern = pa_fpat age = pa_age ). * Some basic checks - number of files and total file size if LCL_UTILITIES=>go_folder->gv_total_cnt = 0. message 'Geen email verzonden (geen bestanden gevonden)'(m13) type 'S'. elseif LCL_UTILITIES=>go_folder->gv_total_cnt > 20. message 'Geen email verzonden (meer dan 20 bestanden)'(M14) type 'S'. elseif LCL_UTILITIES=>go_folder->gv_total_len > 1000000. message 'Geen email verzonden (meer dan 1Mb data)'(M15) type 'S'. else. lcl_mailman=>send_email( ). endif. endif.