SAP 메일전송 기능
1. Function : “SO_NEW_DOCUMENT_ATT_SEND_API1”
DATA: w_subject LIKE sodocchgi1, i_pack_list LIKE sopcklsti1 OCCURS 1 WITH HEADER LINE, i_objhead LIKE solisti1 OCCURS 1 WITH HEADER LINE, i_contents_text LIKE solisti1 OCCURS 10 WITH HEADER LINE, "FOR MAIL CONTENTS i_contents_bin TYPE STANDARD TABLE OF solisti1 WITH HEADER LINE, i_contents_hex TYPE STANDARD TABLE OF solix WITH HEADER LINE, "for attachment i_receiver LIKE somlreci1 OCCURS 1 WITH HEADER LINE, content_out LIKE solisti1 OCCURS 0 WITH HEADER LINE. DATA: li_contents_hex TYPE STANDARD TABLE OF solix WITH HEADER LINE. lv_hex1 = cl_abap_char_utilities=>cr_lf. *Create the body of the attachment file of the mail INTO li_contents_bin-line SEPARATED BY lc_tab. CONCATENATE li_contents_bin-line lv_hex1 INTO li_contents_bin-line. APPEND li_contents_bin. *Converting the table contents for attachment to xstring LOOP AT li_contents_bin. CALL FUNCTION 'SCMS_STRING_TO_XSTRING' EXPORTING text = li_contents_bin-line IMPORTING buffer = li_contents-line EXCEPTIONS failed = 1 OTHERS = 2. *Converting the table contents from xstring to binary CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' EXPORTING buffer = li_contents-line * APPEND_TO_TABLE = 'I_CONTENTS_HEX' TABLES binary_tab = li_contents_hex. LOOP AT li_contents_hex. APPEND li_contents_hex TO i_contents_hex . ENDLOOP. * FM called for sending the mail to the intended recipients CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1' EXPORTING document_data = w_subject put_in_outbox = 'X' commit_work = 'X' IMPORTING sent_to_all = sent_to_all TABLES packing_list = i_pack_list object_header = i_objhead contents_hex = i_contents_hex contents_txt = i_contents_text receivers = i_receiver._M#]
2. Function : “SO_DOCUMENT_SEND_API1”
[#M_소스코드 보기|접어두기..|
* *&---------------------------------------------------------------------* *& Report ZSPOOLTOPDF * *& * *&---------------------------------------------------------------------* *& Converts spool request into PDF document and emails it to * *& recipicant. * *& * *& Execution * *& --------- * *& This program must be run as a background job in-order for the write * *& commands to create a Spool request rather than be displayed on * *& screen * *&---------------------------------------------------------------------* REPORT zspooltopdf. PARAMETER: p_email1 LIKE somlreci1-receiver DEFAULT 'abap@sapdev.co.uk', p_sender LIKE somlreci1-receiver DEFAULT 'abap@sapdev.co.uk', p_delspl AS CHECKBOX. *DATA DECLARATION DATA: gd_recsize TYPE i. * Spool IDs TYPES: BEGIN OF t_tbtcp. INCLUDE STRUCTURE tbtcp. TYPES: END OF t_tbtcp. DATA: it_tbtcp TYPE STANDARD TABLE OF t_tbtcp INITIAL SIZE 0, wa_tbtcp TYPE t_tbtcp. * Job Runtime Parameters DATA: gd_eventid LIKE tbtcm-eventid, gd_eventparm LIKE tbtcm-eventparm, gd_external_program_active LIKE tbtcm-xpgactive, gd_jobcount LIKE tbtcm-jobcount, gd_jobname LIKE tbtcm-jobname, gd_stepcount LIKE tbtcm-stepcount, gd_error TYPE sy-subrc, gd_reciever TYPE sy-subrc. DATA: w_recsize TYPE i. DATA: gd_subject LIKE sodocchgi1-obj_descr, it_mess_bod LIKE solisti1 OCCURS 0 WITH HEADER LINE, it_mess_att LIKE solisti1 OCCURS 0 WITH HEADER LINE, gd_sender_type LIKE soextreci1-adr_typ, gd_attachment_desc TYPE so_obj_nam, gd_attachment_name TYPE so_obj_des. * Spool to PDF conversions DATA: gd_spool_nr LIKE tsp01-rqident, gd_destination LIKE rlgrap-filename, gd_bytecount LIKE tst01-dsize, gd_buffer TYPE string. * Binary store for PDF DATA: BEGIN OF it_pdf_output OCCURS 0. INCLUDE STRUCTURE tline. DATA: END OF it_pdf_output. CONSTANTS: c_dev LIKE sy-sysid VALUE 'DEV', c_no(1) TYPE c VALUE ' ', c_device(4) TYPE c VALUE 'LOCL'. ************************************************************************ *START-OF-SELECTION. START-OF-SELECTION. * Write statement to represent report output. Spool request is created * if write statement is executed in background. This could also be an * ALV grid which would be converted to PDF without any extra effort WRITE 'Hello World'. new-page. commit work. new-page print off. IF sy-batch EQ 'X'. PERFORM get_job_details. PERFORM obtain_spool_id. ************************************ *** Alternative way could be to submit another program and store spool *** id into memory, will be stored in sy-spono. *submit ZSPOOLTOPDF2 * to sap-spool * spool parameters %_print * archive parameters %_print * without spool dynpro * and return. ************************************ * Get spool id from program called above * IMPORT w_spool_nr FROM MEMORY ID 'SPOOLTOPDF'. PERFORM convert_spool_to_pdf. PERFORM process_email. if p_delspl EQ 'X'. PERFORM delete_spool. endif. IF sy-sysid = c_dev. wait up to 5 seconds. SUBMIT rsconn01 WITH mode = 'INT' WITH output = 'X' AND RETURN. ENDIF. ELSE. SKIP. WRITE:/ 'Program must be executed in background in-order for spool', 'request to be created.'. ENDIF. *---------------------------------------------------------------------* * FORM obtain_spool_id * *---------------------------------------------------------------------* FORM obtain_spool_id. CHECK NOT ( gd_jobname IS INITIAL ). CHECK NOT ( gd_jobcount IS INITIAL ). SELECT * FROM tbtcp INTO TABLE it_tbtcp WHERE jobname = gd_jobname AND jobcount = gd_jobcount AND stepcount = gd_stepcount AND listident <> '0000000000' ORDER BY jobname jobcount stepcount. READ TABLE it_tbtcp INTO wa_tbtcp INDEX 1. IF sy-subrc = 0. message s004(zdd) with gd_spool_nr. gd_spool_nr = wa_tbtcp-listident. MESSAGE s004(zdd) WITH gd_spool_nr. ELSE. MESSAGE s005(zdd). ENDIF. ENDFORM. *---------------------------------------------------------------------* * FORM get_job_details * *---------------------------------------------------------------------* FORM get_job_details. * Get current job details CALL FUNCTION 'GET_JOB_RUNTIME_INFO' IMPORTING eventid = gd_eventid eventparm = gd_eventparm external_program_active = gd_external_program_active jobcount = gd_jobcount jobname = gd_jobname stepcount = gd_stepcount EXCEPTIONS no_runtime_info = 1 OTHERS = 2. ENDFORM. *---------------------------------------------------------------------* * FORM convert_spool_to_pdf * *---------------------------------------------------------------------* FORM convert_spool_to_pdf. CALL FUNCTION 'CONVERT_ABAPSPOOLJOB_2_PDF' EXPORTING src_spoolid = gd_spool_nr no_dialog = c_no dst_device = c_device IMPORTING pdf_bytecount = gd_bytecount TABLES pdf = it_pdf_output EXCEPTIONS err_no_abap_spooljob = 1 err_no_spooljob = 2 err_no_permission = 3 err_conv_not_possible = 4 err_bad_destdevice = 5 user_cancelled = 6 err_spoolerror = 7 err_temseerror = 8 err_btcjob_open_failed = 9 err_btcjob_submit_failed = 10 err_btcjob_close_failed = 11 OTHERS = 12. CHECK sy-subrc = 0. * Transfer the 132-long strings to 255-long strings LOOP AT it_pdf_output. TRANSLATE it_pdf_output USING ' ~'. CONCATENATE gd_buffer it_pdf_output INTO gd_buffer. ENDLOOP. TRANSLATE gd_buffer USING '~ '. DO. it_mess_att = gd_buffer. APPEND it_mess_att. SHIFT gd_buffer LEFT BY 255 PLACES. IF gd_buffer IS INITIAL. EXIT. ENDIF. ENDDO. ENDFORM. *---------------------------------------------------------------------* * FORM process_email * *---------------------------------------------------------------------* FORM process_email. DESCRIBE TABLE it_mess_att LINES gd_recsize. CHECK gd_recsize > 0. PERFORM send_email USING p_email1. * perform send_email using p_email2. ENDFORM. *---------------------------------------------------------------------* * FORM send_email * *---------------------------------------------------------------------* * --> p_email * *---------------------------------------------------------------------* FORM send_email USING p_email. CHECK NOT ( p_email IS INITIAL ). REFRESH it_mess_bod. * Default subject matter gd_subject = 'Subject'. gd_attachment_desc = 'Attachname'. * CONCATENATE 'attach_name' ' ' INTO gd_attachment_name. it_mess_bod = 'Message Body text, line 1'. APPEND it_mess_bod. it_mess_bod = 'Message Body text, line 2...'. APPEND it_mess_bod. * If no sender specified - default blank IF p_sender EQ space. gd_sender_type = space. ELSE. gd_sender_type = 'INT'. ENDIF. * Send file by email as .xls speadsheet PERFORM send_file_as_email_attachment tables it_mess_bod it_mess_att using p_email 'Example .xls documnet attachment' 'PDF' gd_attachment_name gd_attachment_desc p_sender gd_sender_type changing gd_error gd_reciever. ENDFORM. *---------------------------------------------------------------------* * FORM delete_spool * *---------------------------------------------------------------------* FORM delete_spool. DATA: ld_spool_nr TYPE tsp01_sp0r-rqid_char. ld_spool_nr = gd_spool_nr. CHECK p_delspl <> c_no. CALL FUNCTION 'RSPO_R_RDELETE_SPOOLREQ' EXPORTING spoolid = ld_spool_nr. ENDFORM. *&---------------------------------------------------------------------* *& Form SEND_FILE_AS_EMAIL_ATTACHMENT *&---------------------------------------------------------------------* * Send email *----------------------------------------------------------------------* FORM send_file_as_email_attachment tables it_message it_attach using p_email p_mtitle p_format p_filename p_attdescription p_sender_address p_sender_addres_type changing p_error p_reciever. DATA: ld_error TYPE sy-subrc, ld_reciever TYPE sy-subrc, ld_mtitle LIKE sodocchgi1-obj_descr, ld_email LIKE somlreci1-receiver, ld_format TYPE so_obj_tp , ld_attdescription TYPE so_obj_nam , ld_attfilename TYPE so_obj_des , ld_sender_address LIKE soextreci1-receiver, ld_sender_address_type LIKE soextreci1-adr_typ, ld_receiver LIKE sy-subrc. data: t_packing_list like sopcklsti1 occurs 0 with header line, t_contents like solisti1 occurs 0 with header line, t_receivers like somlreci1 occurs 0 with header line, t_attachment like solisti1 occurs 0 with header line, t_object_header like solisti1 occurs 0 with header line, w_cnt type i, w_sent_all(1) type c, w_doc_data like sodocchgi1. ld_email = p_email. ld_mtitle = p_mtitle. ld_format = p_format. ld_attdescription = p_attdescription. ld_attfilename = p_filename. ld_sender_address = p_sender_address. ld_sender_address_type = p_sender_addres_type. * Fill the document data. w_doc_data-doc_size = 1. * Populate the subject/generic message attributes w_doc_data-obj_langu = sy-langu. w_doc_data-obj_name = 'SAPRPT'. w_doc_data-obj_descr = ld_mtitle . w_doc_data-sensitivty = 'F'. * Fill the document data and get size of attachment CLEAR w_doc_data. READ TABLE it_attach INDEX w_cnt. w_doc_data-doc_size = ( w_cnt - 1 ) * 255 + STRLEN( it_attach ). w_doc_data-obj_langu = sy-langu. w_doc_data-obj_name = 'SAPRPT'. w_doc_data-obj_descr = ld_mtitle. w_doc_data-sensitivty = 'F'. CLEAR t_attachment. REFRESH t_attachment. t_attachment[] = it_attach[]. * Describe the body of the message CLEAR t_packing_list. REFRESH t_packing_list. t_packing_list-transf_bin = space. t_packing_list-head_start = 1. t_packing_list-head_num = 0. t_packing_list-body_start = 1. DESCRIBE TABLE it_message LINES t_packing_list-body_num. t_packing_list-doc_type = 'RAW'. APPEND t_packing_list. * Create attachment notification t_packing_list-transf_bin = 'X'. t_packing_list-head_start = 1. t_packing_list-head_num = 1. t_packing_list-body_start = 1. DESCRIBE TABLE t_attachment LINES t_packing_list-body_num. t_packing_list-doc_type = ld_format. t_packing_list-obj_descr = ld_attdescription. t_packing_list-obj_name = ld_attfilename. t_packing_list-doc_size = t_packing_list-body_num * 255. APPEND t_packing_list. * Add the recipients email address CLEAR t_receivers. REFRESH t_receivers. t_receivers-receiver = ld_email. t_receivers-rec_type = 'U'. t_receivers-com_type = 'INT'. t_receivers-notif_del = 'X'. t_receivers-notif_ndel = 'X'. APPEND t_receivers. CALL FUNCTION 'SO_DOCUMENT_SEND_API1' EXPORTING document_data = w_doc_data put_in_outbox = 'X' sender_address = ld_sender_address sender_address_type = ld_sender_address_type commit_work = 'X' IMPORTING sent_to_all = w_sent_all TABLES packing_list = t_packing_list contents_bin = t_attachment contents_txt = it_message receivers = t_receivers EXCEPTIONS too_many_receivers = 1 document_not_sent = 2 document_type_not_exist = 3 operation_no_authorization = 4 parameter_error = 5 x_error = 6 enqueue_error = 7 OTHERS = 8. * Populate zerror return code ld_error = sy-subrc. * Populate zreceiver return code LOOP AT t_receivers. ld_receiver = t_receivers-retrn_code. ENDLOOP. ENDFORM. |
_M#]
3. Function : “SO_DOCUMENT_SEND_API1” 관련 파라미터
– NOTIF_DEL : 발송 성공시, 발신자에게 메일 송신.
– 기타 옵션 : http://www.se80.co.uk/saptables/s/soml/somlreci1.htm
***** Class를 이용하는 방법
1. Class CL_BCS를 활용.
[#M_소스코드 보기|접기|
CLASS CA_SAPUSER_BCS DEFINITION LOAD.
CLASS CL_CAM_ADDRESS_BCS DEFINITION LOAD.
DATA: SEND_REQUEST TYPE REF TO CL_BCS.
DATA: DOCUMENT TYPE REF TO CL_DOCUMENT_BCS.
DATA: ATTACHMENT TYPE REF TO CL_DOCUMENT_BCS.
DATA: SENDER TYPE REF TO CL_SAPUSER_BCS.
DATA: RECIPIENT TYPE REF TO IF_RECIPIENT_BCS.
DATA: EXCEPTION_INFO TYPE REF TO IF_OS_EXCEPTION_INFO,
BCS_EXCEPTION TYPE REF TO CX_BCS.
DATA: NUM_ROWS TYPE I.
DATA: TEXTLENGTH TYPE SO_OBJ_LEN.
TRY.
* Create persistent send request
SEND_REQUEST = CL_BCS=>CREATE_PERSISTENT( ).
* Create document
DATA: ROW TYPE SOLI.
DATA: L_MAILTEXT TYPE BCSY_TEXT.
CALL FUNCTION ‘SCMS_STRING_TO_FTEXT’
EXPORTING
TEXT = MAIL_CONTENTS
TABLES
FTEXT_TAB = L_MAILTEXT.
DESCRIBE TABLE L_MAILTEXT LINES NUM_ROWS.
NUM_ROWS = NUM_ROWS * 255.
MOVE NUM_ROWS TO TEXTLENGTH.
DATA: SUBJECT TYPE SO_OBJ_DES.
SUBJECT = MAIL_SUBJECT.
DOCUMENT = CL_DOCUMENT_BCS=>CREATE_DOCUMENT(
I_TYPE = ‘HTM’
I_TEXT = L_MAILTEXT
I_LENGTH = TEXTLENGTH
I_SUBJECT = SUBJECT ).
* Add document to send request
CALL METHOD SEND_REQUEST->SET_DOCUMENT( DOCUMENT ).
* Get sender object
SENDER = CL_SAPUSER_BCS=>CREATE( SY-UNAME ).
* Add sender
CALL METHOD SEND_REQUEST->SET_SENDER
EXPORTING
I_SENDER = SENDER.
* Create recipient
DATA: C_ADDRESS TYPE ADR6-SMTP_ADDR.
MOVE MAIL_REVADDR TO C_ADDRESS.
RECIPIENT = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS(
C_ADDRESS ).
* Add recipient with its respective attributes to send request
CALL METHOD SEND_REQUEST->ADD_RECIPIENT
EXPORTING
I_RECIPIENT = RECIPIENT
I_EXPRESS = ‘ ‘
I_COPY = ‘ ‘
I_BLIND_COPY = ‘ ‘.
**************TEST dh.woo…
DATA: LS_SOOS1 TYPE SOOS1.
DATA: LCL_RESULT TYPE REF TO IF_RECIPIENT_BCS.
LS_SOOS1-NOT_DELI = ‘X’.
LS_SOOS1-RECESC = ‘U’.
LS_SOOS1-DELIVER = ‘ ‘.
LS_SOOS1-READ = ‘ ‘.
LS_SOOS1-RECEXTNAM = ’email’.
LCL_RESULT = CL_SEND_REQUEST_BCS=>CREATE_RECIPIENT_FROM_SOOS1( LS_SOOS1 ).
**************
* Send document
CALL METHOD SEND_REQUEST->SEND( ).
COMMIT WORK.
DATA : MSGID TYPE SYMSGID.
CATCH CX_BCS INTO BCS_EXCEPTION.
EXIT.
ENDTRY.
_M#]