Archivo
Adjuntar y enviar archivo Excel (XLS) por Mail
Caso: se desea adjuntar un archivo Excel y enviarlo por E-Mail.
Solución:
REPORT zmail_con_excel. DATA: it_message TYPE STANDARD TABLE OF solisti1 INITIAL SIZE 0 WITH HEADER LINE. DATA: it_attach TYPE STANDARD TABLE OF solisti1 INITIAL SIZE 0 WITH HEADER LINE. DATA: gv_email TYPE somlreci1-receiver VALUE 'eduardo@eduardo.com'. 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, gd_error TYPE sy-subrc, gd_reciever TYPE sy-subrc. TYPES: BEGIN OF tty_salida, sociedad TYPE bukrs, " Sociedad documento TYPE belnr_d, " Nro. documento ejercicio TYPE gjahr, " Ejercicio periodo TYPE monat, " Período fecha_doc TYPE bldat, " Fecha doc. fecha_contable TYPE budat, " Fecha cont. clase_doc TYPE blart, " Clase doc. importe_ml TYPE dmbtr, " Importe ML usuario TYPE sy-uname. " Usuario TYPES: END OF tty_salida. DATA: gt_salida TYPE STANDARD TABLE OF tty_salida, gs_salida TYPE tty_salida. START-OF-SELECTION. * Registro de prueba gs_salida-sociedad = '1000'. gs_salida-documento = '1600000393'. gs_salida-ejercicio = '2014'. gs_salida-periodo = '10'. gs_salida-fecha_doc = '20141022'. gs_salida-fecha_contable = '20141022'. gs_salida-clase_doc = 'AB'. gs_salida-importe_ml = '150000'. gs_salida-usuario = sy-uname. APPEND gs_salida TO gt_salida. END-OF-SELECTION. PERFORM armar_mail. *&---------------------------------------------------------------------* *& Form ARMAR_MAIL – Rutina Principal *&---------------------------------------------------------------------* FORM armar_mail . * Populate table with details to be entered into .xls file PERFORM build_xls_data_table. * Populate message body text PERFORM populate_email_message_body. * Send file by email as .xls speadsheet PERFORM send_file_as_email_attachment TABLES it_message it_attach USING gv_email 'Asunto del mail!' 'XLS' 'Reporte' 'Reporte' ' ' ' ' CHANGING gd_error gd_reciever. * Instructs mail send program for SAPCONNECT to send email(rsconn01) PERFORM initiate_mail_execute_program. ENDFORM. " ARMAR_MAIL *&---------------------------------------------------------------------* *& Form BUILD_XLS_DATA_TABLE * Las etiquetas no pueden superar los 255 caracteres en una línea, esa es * una limitante pero al parecer hay formas de solucionarlo. Además todos * los tipos de datos deben ser caracteres. *&---------------------------------------------------------------------* FORM build_xls_data_table . DATA: lv_importe_ml_char TYPE char15, lv_importe_md_char TYPE char15, lv_tc_cab_char TYPE char11, lv_tc_pos_char TYPE char11, lv_dif_tc_reg_char TYPE char13, lv_dif_porcentaje_char TYPE char11, lv_tc_obs_char TYPE char11, lv_dif_tc_reg_b_char TYPE char13, lv_dif_porcentaje_b_char TYPE char11. CONSTANTS: con_tab TYPE c VALUE cl_abap_char_utilities=>horizontal_tab, con_cret TYPE c VALUE cl_abap_char_utilities=>cr_lf. CONCATENATE 'Sociedad' 'Nro Documento' 'Ejer.' 'Periodo' 'Fecha Doc.' 'Fecha Cont.' 'Clase Doc.' 'Importe ML' 'User' INTO it_attach SEPARATED BY con_tab. CONCATENATE con_cret it_attach INTO it_attach. APPEND it_attach. LOOP AT gt_salida INTO gs_salida. MOVE gs_salida-importe_ml TO lv_importe_ml_char. CONDENSE lv_importe_ml_char NO-GAPS. CONCATENATE gs_salida-sociedad gs_salida-documento gs_salida-ejercicio gs_salida-periodo gs_salida-fecha_doc gs_salida-fecha_contable gs_salida-clase_doc lv_importe_ml_char gs_salida-usuario INTO it_attach SEPARATED BY con_tab. CONCATENATE con_cret it_attach INTO it_attach. APPEND it_attach. ENDLOOP. ENDFORM. " BUILD_XLS_DATA_TABLE *&---------------------------------------------------------------------* *& Form POPULATE_EMAIL_MESSAGE_BODY *&---------------------------------------------------------------------* FORM populate_email_message_body . REFRESH it_message. it_message = 'Cuerpo del mensaje (body)!'. APPEND it_message. ENDFORM. " POPULATE_EMAIL_MESSAGE_BODY *&---------------------------------------------------------------------* *& Form SEND_FILE_AS_EMAIL_ATTACHMENT *&---------------------------------------------------------------------* FORM send_file_as_email_attachment TABLES pit_message pit_attach USING gv_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 = gv_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[] = pit_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. " SEND_FILE_AS_EMAIL_ATTACHMENT *&---------------------------------------------------------------------* *& Form INITIATE_MAIL_EXECUTE_PROGRAM *&---------------------------------------------------------------------* FORM initiate_mail_execute_program . WAIT UP TO 3 SECONDS. SUBMIT rsconn01 WITH mode = 'INT' WITH output = 'X' AND RETURN. ENDFORM. " INITIATE_MAIL_EXECUTE_PROGRAM
Enviar Mail simple con SO_DOCUMENT_SEND_API1
Caso: Se desea enviar un mail en formato HTML.
Solución: se define un form ENVIAR_MAIL, que recibe como parámetros una lista de destinatarios y un texto adicional para incluir en el cuerpo del mensaje.
*&———————————————————————*
*& Form ENVIAR_MAIL
*&———————————————————————*
* Envía un aviso al usuario que ejecutó el reporte indicando que el proceso terminó
*———————————————————————-*
FORM enviar_mail USING p_mails TYPE char100 » Destinatarios
p_texto TYPE char255. » Texto dinámico para el cuerpo del mail
DATA: lt_docs TYPE TABLE OF docs,
ls_doc_chng LIKE sodocchgi1,
ld_tab_lines LIKE sy-tabix,
lt_objtxt LIKE solisti1 OCCURS 0 WITH HEADER LINE,
lt_objpack LIKE sopcklsti1 OCCURS 6 WITH HEADER LINE,
ls_body TYPE solisti1,
lt_body TYPE TABLE OF solisti1,
lt_recipients TYPE TABLE OF somlreci1 WITH HEADER LINE,
ls_recipients TYPE somlreci1.
DATA ld_subject(50) TYPE c VALUE ‘Asunto del mail!!!’.
DATA ld_body(255) TYPE c.
DATA lv_sender TYPE soextreci1-receiver.
DATA lv_len TYPE i.
DATA lv_ofset TYPE i.
DATA lv_char(1).
CLEAR: ls_doc_chng, ls_body, lt_recipients, ld_tab_lines, lv_sender.
REFRESH: lt_body, lt_recipients, lt_objpack, lt_objtxt.
*———————————————————————-*
* CONTROL DATA (Datos de cabecera del mail)
*———————————————————————-*
ls_doc_chng-obj_name = ‘URGENT’.
ls_doc_chng-sensitivty = ‘P’.
ls_doc_chng-no_change = ‘X’.
ls_doc_chng-priority = ‘1’.
ls_doc_chng-obj_prio = ‘1’.
ls_doc_chng-obj_langu = sy-langu.
ls_doc_chng-no_change = ‘X’.
*———————————————————————-*
* SUBJECT (Asunto del mail)
*———————————————————————-*
** Email Subject
ls_doc_chng-obj_descr = ld_subject. » Ver variable definida con valor constante arriba
*———————————————————————-*
* BODY (Cuerpo del mail, en HTML)
*———————————————————————-*
CLEAR ls_body.
MOVE ‘<html><body>’ TO ls_body-line.
APPEND ls_body TO lt_body.
CLEAR ls_body.
CONCATENATE ‘<p>’ ‘Resultados de la ejecución del reporte</p>’
INTO ls_body-line.
APPEND ls_body TO lt_body.
CLEAR ls_body.
APPEND ls_body TO lt_body.
CLEAR ls_body.
CONCATENATE ‘<p>’ p_texto ‘</p>’
INTO ls_body-line SEPARATED BY space.
APPEND ls_body TO lt_body.
CLEAR ls_body.
APPEND ls_body TO lt_body.
CLEAR ls_body.
CONCATENATE ‘<p>’ ‘Este correo se ha generado en forma automática, por favor no responder</p>’
INTO ls_body-line SEPARATED BY space.
APPEND ls_body TO lt_body.
CLEAR ls_body.
MOVE ‘</body></html>’ TO ls_body-line.
APPEND ls_body TO lt_body.
* Armo el HTML
lt_objtxt[] = lt_body[].
CLEAR lt_objtxt.
DESCRIBE TABLE lt_objtxt LINES ld_tab_lines.
IF ld_tab_lines GT 0.
READ TABLE lt_objtxt INDEX ld_tab_lines.
ls_doc_chng-doc_size = ( ld_tab_lines – 1 ) * 255 + STRLEN( lt_objtxt ).
CLEAR lt_objpack-transf_bin.
lt_objpack-head_start = 1.
lt_objpack-head_num = 0.
lt_objpack-body_start = 1.
lt_objpack-body_num = ld_tab_lines.
lt_objpack-doc_type = ‘HTM’.
APPEND lt_objpack.
ENDIF.
*———————————————————————-*
*RECIPIENTS (Destinatarios del mail separados por 😉
*———————————————————————-*
lv_sender = ‘aaaa@aaaaa.com’. » Indicar el mail origen
CLEAR lt_recipients.
lv_len = STRLEN( p_mails ). » p_mails tiene direcciones de correo separadas por «;»
DO lv_len TIMES.
lv_ofset = sy-index – 1.
lv_char = p_mails+lv_ofset(1).
CHECK lv_char IS NOT INITIAL.
IF lv_char = ‘;’.
CONDENSE lt_recipients-receiver.
lt_recipients-rec_type = ‘U’.
lt_recipients-rec_date = sy-datum.
APPEND lt_recipients.
CLEAR lt_recipients.
CONTINUE.
ENDIF.
CONCATENATE lt_recipients-receiver lv_char INTO lt_recipients-receiver.
IF lv_len = sy-index.
CONDENSE lt_recipients-receiver.
lt_recipients-rec_type = ‘U’.
lt_recipients-rec_date = sy-datum.
APPEND lt_recipients.
ENDIF.
ENDDO.
CALL FUNCTION ‘SO_DOCUMENT_SEND_API1’
EXPORTING
document_data = ls_doc_chng
put_in_outbox = ‘X’
sender_address = lv_sender
sender_address_type = ‘SMTP’
commit_work = ‘X’
TABLES
packing_list = lt_objpack
contents_txt = lt_objtxt
receivers = lt_recipients
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.
FORMAT: COLOR COL_POSITIVE, INTENSIFIED ON.
WRITE: /1 ‘El mail fue enviado con éxito’.
ELSE.
FORMAT: COLOR COL_NEGATIVE, INTENSIFIED ON.
WRITE: /1 ‘No se pudo enviar mail’.
ENDIF.
ENDFORM. » ENVIAR_MAIL
[end]