Cómo enviar un mail desde SAP a tu correo electrónico.
Primero creamos en la transacción SE37 la función ZHR_CONVERTIDOR:
Los parámetros son los siguientes:
Copiamos en el código fuente:
FUNCTION zhr_convertidor.
*"----------------------------------------------------------------------
*"*"Interfase local
*" IMPORTING
*" VALUE(SUBJECT) TYPE SO_OBJ_DES
*" VALUE(SENDER) TYPE ADR6-SMTP_ADDR
*" VALUE(FLAG_COMMIT) TYPE CHAR1 DEFAULT 'X'
*" VALUE(FLAG_SEND_IMMEDIATELY) TYPE CHAR1 DEFAULT 'X'
*" VALUE(ATTACH) TYPE CHAR1 OPTIONAL
*" VALUE(L_LEN) TYPE I OPTIONAL
*" VALUE(L_HEAD) TYPE SOLI OPTIONAL
*" VALUE(LT_BIN) TYPE SOLIX_TAB OPTIONAL
*" VALUE(LT_HEAD) TYPE SOLI_TAB OPTIONAL
*" TABLES
*" EMAIL_TEXT STRUCTURE SOLI
*" RECEIVERS STRUCTURE SOOS1
*" EXCEPTIONS
*" FAILED
*"----------------------------------------------------------------------
DATA l_rcl_send_req TYPE REF TO cl_bcs.
DATA l_text TYPE bcsy_text.
DATA l_rcl_doc TYPE REF TO cl_document_bcs.
DATA l_rcl_sender TYPE REF TO cl_cam_address_bcs.
DATA l_rcl_recipient TYPE REF TO if_recipient_bcs.
DATA l_rcx_bcs TYPE REF TO cx_bcs.
DATA l_rcx_addr TYPE REF TO cx_address_bcs.
DATA: recipient TYPE adr6-smtp_addr.
DATA: wi_receivers TYPE soos1.
DATA l_smtp_addr TYPE adr6-smtp_addr.
DATA l_subject TYPE so_obj_des.
DATA l_tab_soli TYPE soli_tab.
DATA l_soli TYPE soli.
**************************************************
DATA: l_olen TYPE so_obj_len.
DATA: l_otype TYPE so_obj_tp.
DATA: l_subj TYPE so_obj_des.
**************************************************
TRY.
l_rcl_send_req = cl_bcs=>create_persistent( ).
TRY.
l_smtp_addr = sender.
CALL METHOD cl_cam_address_bcs=>create_internet_address
EXPORTING
i_address_string = l_smtp_addr
i_address_name = l_smtp_addr
RECEIVING
result = l_rcl_sender.
CATCH cx_address_bcs INTO l_rcx_addr.
RAISE failed.
ENDTRY.
CALL METHOD l_rcl_send_req->set_sender
EXPORTING
i_sender = l_rcl_sender.
*********************************************************
** new - 28-01-10
LOOP AT receivers INTO wi_receivers.
* Create recipient with E-Mail address
l_smtp_addr = wi_receivers-adr_name.
l_rcl_recipient = cl_cam_address_bcs=>create_internet_address(
l_smtp_addr ).
* Add recipient with its respective attributes to send request
CALL METHOD l_rcl_send_req->add_recipient
EXPORTING
i_recipient = l_rcl_recipient
i_copy = wi_receivers-sndcp. "copia
ENDLOOP.
*******************************************************
* Prepare the E-Mail document
APPEND LINES OF email_text TO l_tab_soli.
l_subject = subject.
l_rcl_doc = cl_document_bcs=>create_document(
i_type = 'RAW'
i_text = l_tab_soli
i_length = '10000'
i_subject = l_subject ).
**********************************************************
CALL METHOD l_rcl_doc->set_importance
EXPORTING
i_importance = wi_receivers-sndpri.
CALL METHOD l_rcl_doc->set_sensitivity
EXPORTING
i_sensitivity = wi_receivers-sndex.
**********************************************************************************
IF attach = 'X'.
l_olen = l_len.
l_len = STRLEN( l_head ) - 4.
IF l_len GT 0 AND l_head+l_len(1) EQ '.'.
l_subj = l_head(l_len).
l_len = l_len + 1.
l_otype = l_head+l_len(3).
TRANSLATE l_otype TO UPPER CASE. "#EC TRANSLANG
ELSE.
l_subj = l_head.
ENDIF.
CALL METHOD l_rcl_doc->add_attachment(
i_attachment_type = l_otype
i_attachment_subject = l_subj
i_attachment_size = l_olen
i_att_content_hex = lt_bin
i_attachment_header = lt_head ).
ENDIF.
***********************************************************************************
* Add document to send request
CALL METHOD l_rcl_send_req->set_document( l_rcl_doc ).
IF NOT flag_send_immediately IS INITIAL.
l_rcl_send_req->set_send_immediately( 'X' ).
ENDIF.
l_rcl_send_req->set_status_attributes( 'A' ).
l_rcl_send_req->send( ).
IF NOT flag_commit IS INITIAL.
TRY.
COMMIT WORK.
CATCH cx_root.
ENDTRY.
ENDIF.
CATCH cx_bcs INTO l_rcx_bcs.
RAISE failed.
CATCH cx_root.
ENDTRY.
ENDFUNCTION.
** como necesitamos una estructura excel, la creamos:
hasta el campo99 type char255.
Además creamos su tipo tabla. ztyexcel y el ZTYDD03L, tipo tabla de DD03L.
** Luego, nos disponemos a crear una clase que le vamos a llamar zcl_excel.
** Ya que la idea es enviar un mail, pero en este caso, también le vamos agregar un archivo en excel.
Luego copiamos en Impl -> Sección Pública:
class ZCL_EXCEL definition
public
final
create public .
*"* public components of class ZCL_EXCEL
*"* do not include other source files here!!!
public section.
class-methods FILL_CAB_FILE_EXCEL
importing
!PW_NOMBRE_ESTRUCTURA type TABNAME
!PT_TABLA type STANDARD TABLE
exporting
!TI_XLS type ZTYEXCEL .
class-methods FILL_FILE_EXCEL
importing
!PW_NOMBRE_ESTRUCTURA type TABNAME
!PT_TABLA type STANDARD TABLE
exporting
!TI_XLS type ZTYEXCEL .
class-methods GET_TABLE_FIELDS
importing
!PS_TABNAME type TABNAME
!NO_EXCLUDE_INCLUDES type FLAG default SPACE
exporting
!PT_TABLE_FIELDS type ZTYDD03L .
class-methods GET_FIELD_TEXT
importing
!PS_TABNAME type TABNAME
!PS_FIELDNAME type FIELDNAME
exporting
!PS_TEXT type STRING
exceptions
NOT_FOUND .
class-methods BEFORE_CONVERSION2
exporting
!L_LEN type I
!L_HEAD type SOLI
!LT_BIN type SOLIX_TAB
!LT_HEAD type SOLI_TAB .
Luego creamos los métodos:
METHOD fill_cab_file_excel.
DATA: numero TYPE numc2.
DATA: xetiq TYPE string.
DATA: lt_campos_tabla TYPE TABLE OF dd03l,
lt_campos_tabla2 TYPE TABLE OF dd04t,
ls_resultado TYPE string,
ls_valor TYPE string.
DATA: wi_lt_campos_tabla TYPE dd03l.
DATA: wi_lt_campos_tabla2 TYPE dd04t.
DATA: ind TYPE i.
FIELD-SYMBOLS:
FIELD-SYMBOLS:
FIELD-SYMBOLS:
FIELD-SYMBOLS:
FIELD-SYMBOLS
FIELD-SYMBOLS
*dynamic structure
DATA: w_estructura TYPE REF TO data.
CREATE DATA w_estructura TYPE (pw_nombre_estructura).
ASSIGN w_estructura->* TO
DATA: etiq1 TYPE string.
DATA: wi_xls TYPE zwexcel.
DATA: texto TYPE string.
***************************************************
REFRESH lt_campos_tabla.
REFRESH lt_campos_tabla2.
CALL METHOD zcl_excel=>get_table_fields
EXPORTING
ps_tabname = pw_nombre_estructura
IMPORTING
pt_table_fields = lt_campos_tabla.
LOOP AT lt_campos_tabla INTO wi_lt_campos_tabla.
CLEAR texto.
CALL METHOD zcl_excel=>get_field_text
EXPORTING
ps_tabname = pw_nombre_estructura
ps_fieldname = wi_lt_campos_tabla-fieldname
IMPORTING
ps_text = texto
EXCEPTIONS
not_found = 1
OTHERS = 2.
wi_lt_campos_tabla2-ddtext = texto.
APPEND wi_lt_campos_tabla2 TO lt_campos_tabla2.
ENDLOOP.
CLEAR wi_xls.
READ TABLE pt_tabla INDEX 1 ASSIGNING
IF sy-subrc <= 2.
numero = 0.
ind = 0.
DO 99 TIMES.
ind = ind + 1.
READ TABLE lt_campos_tabla2 INDEX ind ASSIGNING
IF sy-subrc <= 2.
numero = numero + 1.
CONCATENATE 'WI_XLS-CAMPO' numero INTO xetiq.
ASSIGN (xetiq) TO
ENDIF.
ENDDO.
APPEND wi_xls TO ti_xls.
ENDIF.
ENDMETHOD.
METHOD fill_file_excel.
DATA: numero TYPE numc2.
DATA: xetiq TYPE string.
DATA: lt_campos_tabla TYPE TABLE OF dd03l,
ls_resultado TYPE string,
ls_valor TYPE string.
DATA: ind TYPE i.
FIELD-SYMBOLS:
FIELD-SYMBOLS:
FIELD-SYMBOLS:
FIELD-SYMBOLS
FIELD-SYMBOLS
*dynamic structure
DATA: w_estructura TYPE REF TO data.
CREATE DATA w_estructura TYPE (pw_nombre_estructura).
ASSIGN w_estructura->* TO
DATA: etiq1 TYPE string.
DATA: wi_xls TYPE zwexcel.
***************************************************
CALL METHOD zcl_excel=>get_table_fields
EXPORTING
ps_tabname = pw_nombre_estructura
IMPORTING
pt_table_fields = lt_campos_tabla.
CLEAR wi_xls.
LOOP AT pt_tabla ASSIGNING
numero = 0.
ind = 0.
DO 99 TIMES.
ind = ind + 1.
READ TABLE lt_campos_tabla INDEX ind ASSIGNING
IF sy-subrc <= 2.
CONCATENATE '
ASSIGN (etiq1) TO
numero = numero + 1.
CONCATENATE 'WI_XLS-CAMPO' numero INTO xetiq.
ASSIGN (xetiq) TO
ENDIF.
ENDDO.
APPEND wi_xls TO ti_xls.
ENDLOOP.
ENDMETHOD.
METHOD get_table_fields.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE pt_table_fields
FROM dd03l
WHERE tabname = ps_tabname
AND as4local = 'A'.
IF no_exclude_includes = space.
DELETE pt_table_fields WHERE fieldname = '.INCLUDE '.
ENDIF.
SORT pt_table_fields BY position ASCENDING.
ENDMETHOD.
METHOD get_field_text.
DATA: lw_dd03l TYPE dd03l.
SELECT SINGLE *
INTO CORRESPONDING FIELDS OF lw_dd03l
FROM dd03l
WHERE tabname = ps_tabname
AND as4local = 'A'
AND fieldname = ps_fieldname
AND as4vers = '0'.
IF sy-subrc NE 0.
RAISE not_found.
ENDIF.
DATA: lw_dd04t TYPE dd04t.
DATA: lw_dd40t TYPE dd40t.
CASE lw_dd03l-comptype.
WHEN 'E'.
SELECT SINGLE *
INTO CORRESPONDING FIELDS OF lw_dd04t
FROM dd04t
WHERE rollname = lw_dd03l-rollname
AND ddlanguage = sy-langu
AND as4local = 'A'
AND as4vers = '0'.
IF sy-subrc NE 0.
RAISE not_found.
ENDIF.
ps_text = lw_dd04t-ddtext.
WHEN 'L'.
SELECT SINGLE *
INTO CORRESPONDING FIELDS OF lw_dd40t
FROM dd40t
WHERE typename = lw_dd03l-rollname
AND ddlanguage = sy-langu
AND as4local = 'A'.
IF sy-subrc NE 0.
RAISE not_found.
ENDIF.
ps_text = lw_dd40t-ddtext.
ENDCASE.
ENDMETHOD.
method BEFORE_CONVERSION2.
DATA:
l_file TYPE file_table,
l_rc TYPE i,
l_act TYPE i,
l_sfile TYPE string.
CHECK l_act = cl_gui_frontend_services=>action_ok.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = 'C:\ARCHIV.XLS'
filetype = 'BIN'
* HAS_FIELD_SEPARATOR = ' '
* HEADER_LENGTH = 0
IMPORTING
filelength = l_len
* HEADER =
TABLES
data_tab = lt_bin
EXCEPTIONS
file_open_error = 1
file_read_error = 2
no_batch = 3
gui_refuse_filetransfer = 4
invalid_type = 5
no_authority = 6
unknown_error = 7
bad_data_format = 8
header_not_allowed = 9
separator_not_allowed = 10
header_too_long = 11
unknown_dp_error = 12
access_denied = 13
dp_out_of_memory = 14
disk_full = 15
dp_timeout = 16
OTHERS = 17
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
CLEAR lt_head.
CALL FUNCTION 'SO_SPLIT_FILE_AND_PATH'
EXPORTING
full_name = 'C:\ARCHIV.XLS'
IMPORTING
stripped_name = l_head
* FILE_PATH =
EXCEPTIONS
x_error = 1
OTHERS = 2
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
EXIT.
ENDIF.
APPEND l_head TO lt_head.
ENDIF.
endmethod.
*****************************************************************************************************
" AHORA DESDE AQUI INVOCAMOS LA FUNCIÓN: (EN ESTE CASO DESDE UN PROGRAMA TENEMOS ESTE CODIGO)"
*****************************************************************************************************
DATA: pw_email_subject TYPE so_obj_des.
DATA: pw_email_body_line TYPE so_text255.
DATA: pt_email_body TYPE soli_tab.
DATA: pt_receivers TYPE zty_soos1.
DATA: wi_receivers TYPE soos1.
DATA: pw_return TYPE bapiret2.
DATA: ti_xls TYPE ztyexcel.
DATA: ti_xls_cab TYPE ztyexcel.
DATA: ti_xls_inicio TYPE ztyexcel.
DATA: wi_xls_inicio TYPE zwexcel.
DATA: ti_xls_res TYPE ztyexcel.
DATA: wi_xls TYPE zwexcel.
CLEAR pw_email_body_line.
REFRESH pt_email_body.
REFRESH pt_receivers.
*********************************************************************************
** Descripción del mail
pw_email_subject = 'EL EMPLEADO 18122 FUE DADO DE BAJA'.
pw_email_body_line =
'DESCRIPCION : El aviso de baja fue dado después del proceso de asignación. Revise el archivo adjunto'.
APPEND pw_email_body_line TO pt_email_body.
** En el ejemplo vamos a enviarle un mail a un remitente. Se pueden agregar n remitentes
CLEAR wi_receivers.
wi_receivers-adr_name = 'cynthia_sol@segnav.com'. "Mail
wi_receivers-sndcp = 'X'. "Si es como Copia ó no
wi_receivers-sndpri = 1. "Prioridad desde 1 hasta 5 (1 la mas alta)
En este caso, le colocamos 'F'.
wi_receivers-sndex = 'F'.
APPEND wi_receivers TO pt_receivers.
REFRESH ti_xls.
REFRESH ti_xls_cab.
REFRESH ti_xls_res.
REFRESH ti_xls_inicio.
CALL METHOD zcl_excel=>fill_cab_file_excel
EXPORTING
pw_nombre_estructura = 'ZWHRASIG' "nombre de la estructura de la tabla interna
pt_tabla = ti_zthrasign "nuestra tabla interna de datos previamente llenadas
IMPORTING
ti_xls = ti_xls_cab.
CALL METHOD zcl_excel=>fill_file_excel
EXPORTING
pw_nombre_estructura = 'ZWHRASIG'
pt_tabla = ti_zthrasign
IMPORTING
ti_xls = ti_xls.
** aqui le voy a colocar unas lineas antes de que salga todas las filas en el excel
** mas una linea en blanco.
** esto es opcional
wi_xls_inicio-campo09 = pw_email_subject.
APPEND wi_xls_inicio TO ti_xls_inicio.
CLEAR wi_xls_inicio-campo09.
CONCATENATE 'Fecha : ' sy-datum INTO wi_xls_inicio-campo09 .
APPEND wi_xls_inicio TO ti_xls_inicio.
wi_xls_inicio-campo09 = '------------------------------------------------------------------------'.
APPEND wi_xls_inicio TO ti_xls_inicio.
wi_xls_inicio-campo09 = space.
APPEND wi_xls_inicio TO ti_xls_inicio.
*******************************
INSERT LINES OF ti_xls_inicio INTO TABLE ti_xls_res.
INSERT LINES OF ti_xls_cab INTO TABLE ti_xls_res.
INSERT LINES OF ti_xls INTO TABLE ti_xls_res.
** como deseo bajarme desde la novena columna hacia adelante, aplico la máscara
CALL METHOD cl_gui_frontend_services=>gui_download
EXPORTING
filename = 'C:\ARCHIV.XLS'
filetype = 'DAT'
col_select = 'X'
col_select_mask = ' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
CHANGING
data_tab = ti_xls_res
EXCEPTIONS
file_write_error = 1
no_batch = 2
gui_refuse_filetransfer = 3
invalid_type = 4
no_authority = 5
unknown_error = 6
header_not_allowed = 7
separator_not_allowed = 8
filesize_not_allowed = 9
header_too_long = 10
dp_error_create = 11
dp_error_send = 12
dp_error_write = 13
unknown_dp_error = 14
access_denied = 15
dp_out_of_memory = 16
disk_full = 17
dp_timeout = 18
file_not_found = 19
dataprovider_exception = 20
control_flush_error = 21
not_supported_by_gui = 22
error_no_gui = 23
OTHERS = 24.
DATA: l_len TYPE i.
DATA: l_head TYPE soli.
DATA: lt_bin TYPE solix_tab.
DATA: lt_head TYPE soli_tab.
DATA: tdatafile TYPE STANDARD TABLE OF char2048.
CALL METHOD zcl_excel=>before_conversion2
IMPORTING
l_len = l_len
l_head = l_head
lt_bin = lt_bin
lt_head = lt_head.
CALL FUNCTION 'ZHR_CONVERTIDOR'
EXPORTING
subject = pw_email_subject
sender = 'raulsol@segnav.com' "se pone la dirección del que envía
* recipient = ''
* FLAG_COMMIT = 'X'
* FLAG_SEND_IMMEDIATELY = 'X'
attach = 'X'
l_len = l_len
l_head = l_head
lt_bin = lt_bin
lt_head = lt_head
TABLES
email_text = pt_email_body
receivers = pt_receivers
EXCEPTIONS
failed = 1
OTHERS = 2.
ENDIF.
ENDIF.
*************************************************************************************************************
EL CASO QUE VIMOS NO APLICA, SI EL PROCESO ES A TRAVES DE UN JOB.
No hay comentarios:
Publicar un comentario