SEND EMAIL IN ABAP PROGRAM (PART 2)
TABLE AND EXCEL FILE ATTACHMENT
One modification that we can make from this is how to send internal table and compile it into excel file then send it as attachment in email.
Below is the sample code :
1. a. Data Declaration
DATA: t_mailrecipients LIKE somlreci1 OCCURS 1 WITH HEADER LINE,
t_mailtxt TYPE STANDARD TABLE OF soli WITH HEADER LINE,
t_attachment TYPE STANDARD TABLE OF solisti1 WITH HEADER LINE,
t_mailsubject TYPE sodocchgi1,
t_packing_list TYPE STANDARD TABLE OF sopcklsti1 WITH HEADER LINE,
t_scarr TYPE TABLE OF scarr WITH HEADER LINE,
d_cnt TYPE i,
d_nama_xls(12) TYPE c.
t_mailtxt TYPE STANDARD TABLE OF soli WITH HEADER LINE,
t_attachment TYPE STANDARD TABLE OF solisti1 WITH HEADER LINE,
t_mailsubject TYPE sodocchgi1,
t_packing_list TYPE STANDARD TABLE OF sopcklsti1 WITH HEADER LINE,
t_scarr TYPE TABLE OF scarr WITH HEADER LINE,
d_cnt TYPE i,
d_nama_xls(12) TYPE c.
2. b. Input Parameter
SELECTION-SCREEN BEGIN OF BLOCK blok1 WITH FRAME TITLE text-001.
PARAMETERS: p_email TYPE so_recname DEFAULT 'mas.trias@gmail.com'.
PARAMETERS: p_user TYPE so_recname DEFAULT 'GUEST01'.
PARAMETERS: p_excel(8) DEFAULT 'SCARR'.
SELECTION-SCREEN END OF BLOCK blok1.
PARAMETERS: p_email TYPE so_recname DEFAULT 'mas.trias@gmail.com'.
PARAMETERS: p_user TYPE so_recname DEFAULT 'GUEST01'.
PARAMETERS: p_excel(8) DEFAULT 'SCARR'.
SELECTION-SCREEN END OF BLOCK blok1.
3. c. Set Email Recipients
REFRESH t_mailrecipients.
CLEAR t_mailrecipients.
MOVE: p_user TO t_mailrecipients-receiver,
'X' TO t_mailrecipients-express,
'B' TO t_mailrecipients-rec_type.
APPEND t_mailrecipients.
CLEAR t_mailrecipients.
MOVE: p_email TO t_mailrecipients-receiver,
'U' TO t_mailrecipients-rec_type.
APPEND t_mailrecipients.
CLEAR t_mailrecipients.
MOVE: p_user TO t_mailrecipients-receiver,
'X' TO t_mailrecipients-express,
'B' TO t_mailrecipients-rec_type.
APPEND t_mailrecipients.
CLEAR t_mailrecipients.
MOVE: p_email TO t_mailrecipients-receiver,
'U' TO t_mailrecipients-rec_type.
APPEND t_mailrecipients.
Example, we want to send data from SCARR.
* Get data.
SELECT * FROM scarr INTO TABLE t_scarr.
* content email
t_mailtxt = 'Try to make attachment in .XLS with data is below:'.
APPEND t_mailtxt. CLEAR t_mailtxt.
CONCATENATE 'CARRID' 'CARRNAME'
INTO t_mailtxt-line SEPARATED BY space.
APPEND t_mailtxt.CLEAR t_mailtxt.
LOOP AT t_scarr.
CONCATENATE t_scarr-carrid t_scarr-carrname
INTO t_mailtxt-line SEPARATED BY space.
APPEND t_mailtxt.CLEAR t_mailtxt.
ENDLOOP.
SELECT * FROM scarr INTO TABLE t_scarr.
* content email
t_mailtxt = 'Try to make attachment in .XLS with data is below:'.
APPEND t_mailtxt. CLEAR t_mailtxt.
CONCATENATE 'CARRID' 'CARRNAME'
INTO t_mailtxt-line SEPARATED BY space.
APPEND t_mailtxt.CLEAR t_mailtxt.
LOOP AT t_scarr.
CONCATENATE t_scarr-carrid t_scarr-carrname
INTO t_mailtxt-line SEPARATED BY space.
APPEND t_mailtxt.CLEAR t_mailtxt.
ENDLOOP.
5. e. Set to Excel File
Using Class : CL_ABAP_CHAR_UTILITIES
* excel data
LOOP AT t_scarr.
CONCATENATE t_scarr-carrid t_scarr-carrname
INTO t_attachment SEPARATED BY
cl_abap_char_utilities=>horizontal_tab.
CONCATENATE cl_abap_char_utilities=>newline t_attachment
INTO t_attachment.
APPEND t_attachment. CLEAR t_attachment.
ENDLOOP.
LOOP AT t_scarr.
CONCATENATE t_scarr-carrid t_scarr-carrname
INTO t_attachment SEPARATED BY
cl_abap_char_utilities=>horizontal_tab.
CONCATENATE cl_abap_char_utilities=>newline t_attachment
INTO t_attachment.
APPEND t_attachment. CLEAR t_attachment.
ENDLOOP.
t_packing_list-transf_bin = space.
t_packing_list-head_start = 1.
t_packing_list-head_num = 0.
t_packing_list-body_start = 1.
t_packing_list-body_num = LINES( t_mailtxt ).
t_packing_list-doc_type = 'RAW'.
APPEND t_packing_list.
CLEAR t_packing_list.
CONCATENATE p_excel '.xls' INTO d_nama_xls.
t_packing_list-transf_bin = 'X'.
t_packing_list-head_start = 1.
t_packing_list-head_num = 1.
t_packing_list-body_start = 1.
t_packing_list-body_num = LINES( t_attachment ).
t_packing_list-doc_type = 'XLS'. " You can give RAW incase if you want just a txt file.
t_packing_list-obj_name = d_nama_xls.
t_packing_list-obj_descr = d_nama_xls.
t_packing_list-doc_size = t_packing_list-body_num * 255.
APPEND t_packing_list.
CLEAR t_packing_list.
t_packing_list-head_num = 0.
t_packing_list-body_start = 1.
t_packing_list-body_num = LINES( t_mailtxt ).
t_packing_list-doc_type = 'RAW'.
APPEND t_packing_list.
CLEAR t_packing_list.
CONCATENATE p_excel '.xls' INTO d_nama_xls.
t_packing_list-transf_bin = 'X'.
t_packing_list-head_start = 1.
t_packing_list-head_num = 1.
t_packing_list-body_start = 1.
t_packing_list-body_num = LINES( t_attachment ).
t_packing_list-doc_type = 'XLS'. " You can give RAW incase if you want just a txt file.
t_packing_list-obj_name = d_nama_xls.
t_packing_list-obj_descr = d_nama_xls.
t_packing_list-doc_size = t_packing_list-body_num * 255.
APPEND t_packing_list.
CLEAR t_packing_list.
7. f. Set Email Subject
t_mailsubject-obj_name = 'MAILATTACH'.
t_mailsubject-obj_langu = sy-langu.
t_mailsubject-obj_descr = 'Message with excel file attached'.
t_mailsubject-sensitivty = 'F'.
d_cnt = LINES( t_attachment ).
t_mailsubject-doc_size = ( d_cnt - 1 ) * 255 + STRLEN( t_attachment ).
t_mailsubject-obj_langu = sy-langu.
t_mailsubject-obj_descr = 'Message with excel file attached'.
t_mailsubject-sensitivty = 'F'.
d_cnt = LINES( t_attachment ).
t_mailsubject-doc_size = ( d_cnt - 1 ) * 255 + STRLEN( t_attachment ).
8. Call FM SO_NEW_DOCUMENT_ATT_SEND_API1
CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
EXPORTING
document_data = t_mailsubject
put_in_outbox = 'X'
commit_work = 'X'
TABLES
packing_list = t_packing_list
contents_bin = t_attachment
contents_txt = t_mailtxt
receivers = t_mailrecipients
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.
EXPORTING
document_data = t_mailsubject
put_in_outbox = 'X'
commit_work = 'X'
TABLES
packing_list = t_packing_list
contents_bin = t_attachment
contents_txt = t_mailtxt
receivers = t_mailrecipients
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.
IF sy-subrc EQ 0.
COMMIT WORK.
SUBMIT rsconn01 WITH mode = 'INT' AND RETURN.
MESSAGE i003(aq) WITH 'Message Sent Succesfully'.
ELSE.
MESSAGE i003(aq) WITH 'Message Not Sent'.
ENDIF.
EXECUTE REPORT