SAP ABAP - Send e-mail with excel file ( Simple )
Updated: Aug 29, 2022
PARAMETERS: p_email TYPE somlreci1-receiver
DEFAULT 'test@test.com.tr'.
TYPES: BEGIN OF ty_mara,
matnr TYPE mara-matnr,
maktx TYPE makt-maktx,
meins TYPE mara-meins,
mtart TYPE mara-mtart,
END OF ty_mara.
DATA: gt_mara TYPE TABLE OF ty_mara.
DATA: gt_message TYPE TABLE OF solisti1.
DATA: gt_attach TYPE TABLE OF solisti1.
DATA: gt_packing_list TYPE TABLE OF sopcklsti1,
gt_contents TYPE TABLE OF solisti1,
gt_receivers TYPE TABLE OF somlreci1,
gt_attachment TYPE TABLE OF solisti1,
gt_object_header TYPE TABLE OF solisti1,
gv_cnt TYPE i,
gv_sent_all(1) TYPE c,
gs_doc_data LIKE sodocchgi1,
gv_error TYPE sy-subrc,
gv_reciever TYPE sy-subrc.
START-OF-SELECTION.
PERFORM data_retrieval.
PERFORM build_xls_data_table.
END-OF-SELECTION.
* Populate message body text
PERFORM populate_email_message_body.
* Send file by email as .xls speadsheet
PERFORM send_file_as_email_attachment
TABLES gt_message
gt_attach
USING p_email
'Example .xls doc attachment'
'XLS'
'EXCEL FILENAME'
' '
' '
' '
CHANGING gv_error
gv_reciever.
PERFORM initiate_mail_execute_program.
*&---------------------------------------------------------------------*
*& Form DATA_RETRIEVAL
*&---------------------------------------------------------------------*
* Retrieve data form EKPO table and populate itab it_ekko
*----------------------------------------------------------------------*
FORM data_retrieval.
SELECT mara~matnr,
makt~maktx,
mara~meins,
mara~mtart
FROM mara
INNER JOIN makt
ON mara~matnr = makt~matnr
AND makt~spras = @sy-langu
INTO TABLE @gt_mara.
ENDFORM. " DATA_RETRIEVAL
*&---------------------------------------------------------------------*
*& Form BUILD_XLS_DATA_TABLE
*&---------------------------------------------------------------------*
* Build data table for .xls document
*----------------------------------------------------------------------*
FORM build_xls_data_table.
APPEND INITIAL LINE TO gt_attach REFERENCE INTO DATA(lr_attach).
CONCATENATE 'MATNR' 'MAKTX' 'MEINS' 'MTART'
INTO lr_attach->* SEPARATED BY cl_abap_char_utilities=>horizontal_tab.
CONCATENATE cl_abap_char_utilities=>cr_lf lr_attach->* INTO lr_attach->*.
LOOP AT gt_mara REFERENCE INTO DATA(lr_mara).
APPEND INITIAL LINE TO gt_attach REFERENCE INTO lr_attach.
CONCATENATE lr_mara->matnr
lr_mara->maktx
lr_mara->meins
lr_mara->mtart
INTO lr_attach->* SEPARATED BY cl_abap_char_utilities=>horizontal_tab.
CONCATENATE cl_abap_char_utilities=>cr_lf lr_attach->* INTO lr_attach->*.
ENDLOOP.
ENDFORM. " BUILD_XLS_DATA_TABLE
*&---------------------------------------------------------------------*
*& Form SEND_FILE_AS_EMAIL_ATTACHMENT
*&---------------------------------------------------------------------*
* Send email
*----------------------------------------------------------------------*
FORM send_file_as_email_attachment TABLES pit_message
pit_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.
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.
gs_doc_data-doc_size = 1.
* Fill the document data and get size of attachment
CLEAR gs_doc_data.
gv_cnt = lines( gt_attach ).
READ TABLE gt_attach REFERENCE INTO data(lr_attach) INDEX gv_cnt.
gs_doc_data-doc_size =
( gv_cnt - 1 ) * 255 + strlen( lr_attach->* ).
gs_doc_data-obj_langu = sy-langu.
gs_doc_data-obj_name = 'SAPRPT'.
gs_doc_data-obj_descr = ld_mtitle.
gs_doc_data-sensitivty = 'F'.
CLEAR gt_attachment[].
gt_attachment[] = pit_attach[].
* Describe the body of the message
CLEAR gt_packing_list[].
APPEND INITIAL LINE TO gt_packing_list REFERENCE INTO data(lr_packing_list).
lr_packing_list->transf_bin = space.
lr_packing_list->head_start = 1.
lr_packing_list->head_num = 0.
lr_packing_list->body_start = 1.
DESCRIBE TABLE gt_message LINES lr_packing_list->body_num.
lr_packing_list->doc_type = 'RAW'.
* Create attachment notification
APPEND INITIAL LINE TO gt_packing_list REFERENCE INTO lr_packing_list.
lr_packing_list->transf_bin = 'X'.
lr_packing_list->head_start = 1.
lr_packing_list->head_num = 1.
lr_packing_list->body_start = 1.
DESCRIBE TABLE gt_attachment LINES lr_packing_list->body_num.
lr_packing_list->doc_type = ld_format.
lr_packing_list->obj_descr = ld_attdescription.
lr_packing_list->obj_name = ld_attfilename.
lr_packing_list->doc_size = lr_packing_list->body_num * 255.
* Add the recipients email address
CLEAR gt_receivers.
APPEND INITIAL LINE TO gt_receivers REFERENCE INTO data(lr_receivers).
lr_receivers->receiver = ld_email.
lr_receivers->rec_type = 'U'.
lr_receivers->com_type = 'INT'.
lr_receivers->notif_del = 'X'.
lr_receivers->notif_ndel = 'X'.
CALL FUNCTION 'SO_DOCUMENT_SEND_API1'
EXPORTING
document_data = gs_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 = gv_sent_all
TABLES
packing_list = gt_packing_list
contents_bin = gt_attachment
contents_txt = gt_message
receivers = gt_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 gt_receivers REFERENCE INTO data(lr_receiver).
ld_receiver = lr_receiver->retrn_code.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form INITIATE_MAIL_EXECUTE_PROGRAM
*&---------------------------------------------------------------------*
* Instructs mail send program for SAPCONNECT to send email.
*----------------------------------------------------------------------*
FORM initiate_mail_execute_program.
WAIT UP TO 2 SECONDS.
SUBMIT rsconn01 WITH mode = 'INT'
WITH output = 'X'
AND RETURN.
ENDFORM. " INITIATE_MAIL_EXECUTE_PROGRAM
*&---------------------------------------------------------------------*
*& Form POPULATE_EMAIL_MESSAGE_BODY
*&---------------------------------------------------------------------*
* Populate message body text
*----------------------------------------------------------------------*
FORM populate_email_message_body.
REFRESH gt_message.
append INITIAL LINE TO gt_message REFERENCE INTO data(lr_msg).
lr_msg->* = 'Please find attached a list test mara records'.
ENDFORM.