Envio de correo mediante SAP

6
Hoy vamos a hablar de  un importante en cuanto a los desarrollos. El cual es permitir enviar correo electrónico desde un sistema Sap al exterior.

Nota: hemos de tener un servidor de correo interno (propio) o externo que permita el reenvió SMTP.

Existe dos formas de realizar el envió, en formato normal tipo texto o en formato html. Este último por ejemplo se utiliza para poder enviar imágenes como el logo de la empresa, etc.

1. Código en formato HTML
*----------------------------------------------------------------------*
* ASUNTO
*----------------------------------------------------------------------*
gs_doc_data-obj_langu  = sy-langu.
gs_doc_data-obj_name   = 'SAPRPT'.
LV_TEXT3 = 'Documento de aceptacion'.
gs_doc_data-obj_descr  = LV_TEXT3.
gs_doc_data-sensitivty = 'F'.
*----------------------------------------------------------------------*
* CUERPO DEL MENSAJE
*----------------------------------------------------------------------*
APPEND INITIAL LINE TO gt_obj_content ASSIGNING <gt_obj_content>.
<gt_obj_content>-line = '<html>'.

APPEND INITIAL LINE TO gt_obj_content ASSIGNING <gt_obj_content>.

<gt_obj_content>-line = '<head>'.

APPEND INITIAL LINE TO gt_obj_content ASSIGNING <gt_obj_content>.

<gt_obj_content>-line = '<meta http-equiv="Content-Type" content="text/html;'.

APPEND INITIAL LINE TO gt_obj_content ASSIGNING <gt_obj_content>.

<gt_obj_content>-line = '<charset="iso-8859-1">'.

APPEND INITIAL LINE TO gt_obj_content ASSIGNING <gt_obj_content>.

<gt_obj_content>-line = '</head>'.

APPEND INITIAL LINE TO gt_obj_content ASSIGNING <gt_obj_content>.

<gt_obj_content>-line = '<body>'.

APPEND INITIAL LINE TO gt_obj_content ASSIGNING <gt_obj_content>.

<gt_obj_content>-line = 'Estimado Proveedor:'.

APPEND INITIAL LINE TO gt_obj_content ASSIGNING <gt_obj_content>.

<gt_obj_content>-line = '<br>      </br>'.


LV_TEXT1 = 'La orden de servicio con N°'.

LV_TEXT2 = ', ha sido aceptado con el número de documento'.

CONCATENATE LV_TEXT1 LV_EBELN LV_TEXT2 LV_LFBNR INTO LV_MENSAJE SEPARATED BY SPACE.

CONCATENATE LV_MENSAJE '.' INTO LV_MENSAJE2.


APPEND INITIAL LINE TO gt_obj_content ASSIGNING <gt_obj_content>.

<gt_obj_content>-LINE = LV_MENSAJE2.

APPEND INITIAL LINE TO gt_obj_content ASSIGNING <gt_obj_content>.

<gt_obj_content>-LINE = ''.

APPEND INITIAL LINE TO gt_obj_content ASSIGNING <gt_obj_content>.

<gt_obj_content>-line = '<br>      </br>'.

LV_TEXT4 = 'Para efectuar la entrega de la factura, favor acercarse a la Ventanilla Única adjuntando una copia de la orden de compra, el original de la factura comercial y'.

LV_TEXT5 = 'el número de documento de aceptación.'.

CONCATENATE LV_TEXT4 LV_TEXT5 INTO LV_MENSAJE1 SEPARATED BY SPACE.

APPEND INITIAL LINE TO gt_obj_content ASSIGNING <gt_obj_content>.

<gt_obj_content>-line = LV_MENSAJE1.

APPEND INITIAL LINE TO gt_obj_content ASSIGNING <gt_obj_content>.


<gt_obj_content>-line = ''.

APPEND INITIAL LINE TO gt_obj_content ASSIGNING <gt_obj_content>.

<gt_obj_content>-line = '<br>      </br>'.

APPEND INITIAL LINE TO gt_obj_content ASSIGNING <gt_obj_content>.


<gt_obj_content>-LINE = 'El horario para recepción de facturas será de lunes a viernes.'.

APPEND INITIAL LINE TO gt_obj_content ASSIGNING <gt_obj_content>.

<gt_obj_content>-line = '<br>      </br>'.

APPEND INITIAL LINE TO gt_obj_content ASSIGNING <gt_obj_content>.


<gt_obj_content>-LINE = 'Atentamente,'.

APPEND INITIAL LINE TO gt_obj_content ASSIGNING <gt_obj_content>.


<gt_obj_content>-line = '<br>      </br>'.

APPEND INITIAL LINE TO gt_obj_content ASSIGNING <gt_obj_content>.


<gt_obj_content>-LINE = 'Departamento de Logística'.

APPEND INITIAL LINE TO gt_obj_content ASSIGNING <gt_obj_content>.


<gt_obj_content>-line = '<br>      </br>'.

DATA LV_IMAGEN TYPE STRING.


LV_IMAGEN = '<DIV> <IMG SRC="https://3vxbpa.livefilestore.com/imagen.jpg"> </IMG</DIV>'.

APPEND INITIAL LINE TO gt_obj_content ASSIGNING <gt_obj_content>.


<gt_obj_content>-LINE = LV_IMAGEN.

APPEND INITIAL LINE TO gt_obj_content ASSIGNING <gt_obj_content>.


<gt_obj_content>-line = '</body>'.

APPEND INITIAL LINE TO gt_obj_content ASSIGNING <gt_obj_content>.


<gt_obj_content>-line = '</html>'.

*----------------------------------------------------------------------*
* DESTINATARIOS
*----------------------------------------------------------------------*
*A
APPEND INITIAL LINE TO gt_receivers ASSIGNING <gt_receivers>.
<gt_receivers>-receiver    = LV_SMTP_ADDR.        "Nombre de destinatario mensaje.
<gt_receivers>-rec_type    = 'U'.                 "Tipo de destinatario, en caso de se                                                                                   "envía a un correo convencional.            
 <gt_receivers>-express    = 'X'.                 "Enviar: En forma de documento urgente.
 <gt_receivers>-notif_ndel = 'X'.                 "Acuse de Recibo.

*CC
 APPEND INITIAL LINE TO gt_receivers ASSIGNING <gt_receivers>.
 <gt_receivers>-receiver   = LV_SMTP_ADDR1.       "Nombre de destinatario mensaje.
 <gt_receivers>-rec_type   = 'U'.                 "Tipo de destinatario, en caso de se                                                                                  
                                                        "envía a un correo convencional.
 <gt_receivers>-express    = 'X'.                 "Enviar: En forma de documento urgente.
 <gt_receivers>-notif_ndel = 'X'.                 "Acuse de Recibo.
 <gt_receivers>-copy       = 'X'.                 "Con copia al siguiente destinatario

*----------------------------------------------------------------------------*
* EJECUTANDO: SO_NEW_DOCUMENT_SEND_API1
*----------------------------------------------------------------------------*
 CALL FUNCTION 'SO_NEW_DOCUMENT_SEND_API1'

 EXPORTING
 document_data                    = gs_doc_data    "Asunto del mensaje
 document_type                    = 'HTM'
 put_in_outbox                    = 'X'            "Deja una copia en la salida’
 commit_work                      = 'X'

 TABLES

 object_content                   = gt_obj_content "Cuerpo del mensaje
 receivers                        = gt_receivers   "Destinatarios
 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.

 WAIT UP TO 2 SECONDS.

 IF sy-subrc EQ 0.

 WRITE: 'e-mail enviado exitósamente'.

 ELSE.
 WRITE: 'error en envió de e-mail'.
 ENDIF.
2. Código en formato de texto
*----------------------------------------------------------------------*
* ASUNTO
*----------------------------------------------------------------------*
 gs_doc_data-obj_langu  = sy-langu.
 gs_doc_data-obj_name   = 'SAPRPT'.
 LV_TEXT3 = 'Documento de aceptacion'.
 gs_doc_data-obj_descr  = LV_TEXT3.
 gs_doc_data-sensitivty = 'F'.

*----------------------------------------------------------------------*
* CUERPO DEL MENSAJE
*----------------------------------------------------------------------*
APPEND INITIAL LINE TO gt_obj_content ASSIGNING <gt_obj_content>.
<gt_obj_content>-line = 'Estimado Proveedor:'.

LV_TEXT1 = 'La orden de servicio con N°'.

LV_TEXT2 = ', ha sido aceptado con el número de documento'.

CONCATENATE LV_TEXT1 LV_EBELN LV_TEXT2 LV_LFBNR INTO LV_MENSAJE SEPARATED BY SPACE.

CONCATENATE LV_MENSAJE '.' INTO LV_MENSAJE2.

APPEND INITIAL LINE TO gt_obj_content ASSIGNING <gt_obj_content>.

<gt_obj_content>-LINE = LV_MENSAJE2.

APPEND INITIAL LINE TO gt_obj_content ASSIGNING <gt_obj_content>.

<gt_obj_content>-LINE = ' '.

LV_TEXT4 = 'Para efectuar la entrega de la factura, favor acercarse a la Ventanilla Única adjuntando una copia de la orden de compra, el original de la factura comercial y'.

LV_TEXT5 = 'el número de documento de aceptación.'.

CONCATENATE LV_TEXT4 LV_TEXT5 INTO LV_MENSAJE1 SEPARATED BY SPACE.

APPEND INITIAL LINE TO gt_obj_content ASSIGNING <gt_obj_content>.

<gt_obj_content>-line = LV_MENSAJE1.

APPEND INITIAL LINE TO gt_obj_content ASSIGNING <gt_obj_content>.

<gt_obj_content>-line = ' '.

APPEND INITIAL LINE TO gt_obj_content ASSIGNING <gt_obj_content>.

<gt_obj_content>-LINE = 'El horario para recepción de facturas será de lunes a viernes.'.

APPEND INITIAL LINE TO gt_obj_content ASSIGNING <gt_obj_content>.

<gt_obj_content>-LINE = 'Atentamente,'.

APPEND INITIAL LINE TO gt_obj_content ASSIGNING <gt_obj_content>.

<gt_obj_content>-LINE = 'Departamento de Logística'.

*----------------------------------------------------------------------*
* DESTINATARIOS
*----------------------------------------------------------------------*
*A
APPEND INITIAL LINE TO gt_receivers ASSIGNING <gt_receivers>.

<gt_receivers>-receiver    = LV_SMTP_ADDR.        "Nombre de destinatario mensaje.
<gt_receivers>-rec_type    = 'U'.                 "Tipo de destinatario, en caso de se                                                                                   "envía a un correo convencional.            
 <gt_receivers>-express    = 'X'.                 "Enviar: En forma de documento urgente.
 <gt_receivers>-notif_ndel = 'X'.                 "Acuse de Recibo.

*CC
APPEND INITIAL LINE TO gt_receivers ASSIGNING <gt_receivers>.

<gt_receivers>-receiver   = LV_SMTP_ADDR1.       "Nombre de destinatario mensaje.

<gt_receivers>-rec_type   = 'U'.                 "Tipo de destinatario, en caso de se                                                                                   "envía a un correo convencional.

<gt_receivers>-express    = 'X'.                 "Enviar: En forma de documento urgente.
<gt_receivers>-notif_ndel = 'X'.                 "Acuse de Recibo.
<gt_receivers>-copy       = 'X'.                 "Con copia al siguiente destinatario

*----------------------------------------------------------------------------*
* EJECUTANDO: SO_NEW_DOCUMENT_SEND_API1
*----------------------------------------------------------------------------*
CALL FUNCTION 'SO_NEW_DOCUMENT_SEND_API1'

EXPORTING
document_data                = gs_doc_data    "Asunto del mensaje
document_type                = 'RAW'
put_in_outbox                = 'X'                  "Deja una copia en la salida’
commit_work                  = 'X'

TABLES

object_content               = gt_obj_content "Cuerpo del mensaje
receivers                    = gt_receivers   "Destinatarios

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.

WAIT UP TO 2 SECONDS.

IF sy-subrc EQ 0.
WRITE: 'e-mail enviado exitósamente'.
ELSE.
WRITE: 'error en envió de e-mail'.
ENDIF.

Luego de insertar el siguiente código, para verificar que el correo electrónico salió del R3 ingresamos a la transacción SOST. En ella debe aparecer, el correo electrónico el cual enviaste desde el programa, luego se selecciona el mismo y se presiona el botón que se indica en la imagen para luego escoger la opción: Iniciar proceso de envió para selección.

Con ello se envía el correo a la persona indicada. Cuando llegamos a esta transacción, hasta ahi acaba la parte SAP si el mail no se llega enviar revisar el servidor SMTP.

Nota. el proceso de la SOST se puede programa con un job que corra cada cierto tiempo y envié los correos constantemente.
Tags

Publicar un comentario

6Comentarios
  1. Me gusto mucho el post acerca del envio de Correos, esta bien explicado.

    ResponderBorrar
    Respuestas
    1. Gracias, trato de ser bien específico en el proceso, para que no quede dudas en su ejecución.

      Borrar
  2. Se puede recibir la respuesta de los mails en sap

    ResponderBorrar
    Respuestas
    1. Te refieres, si el correo fue enviado? Te recomiendo que ingreses a la transaccion SOST. Con ella, puedes ver el estado de tu correo si se envio o hubo problemas.

      Además, te sugiero la tx SCOT que analiza todo el estado.

      Borrar
  3. Tengo una consulta que puede tener que ver con este tema, tengo un smartforms que solo se envía por correo solo al primer destinatario y no al resto. Cómo crees que pueda solucionarlo de manera tal que se envíe a todos los destinatarios?

    ResponderBorrar
    Respuestas
    1. Tu problema puede deberse a la función que estas usando para enviar el correo. Te recomiendo SO_NEW_DOCUMENT_ATT_SEND_API1 permite cargar varios destinatarios.

      Te envió una sentencia de código como ejemplo:

      CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
      EXPORTING
      document_data = doc_chng
      put_in_outbox = 'X'
      commit_work = 'X'
      TABLES
      packing_list = lt_objpack
      object_header = lt_objhead
      contents_bin = lt_objbin
      contents_txt = lt_objtxt
      receivers = lt_reclist
      EXCEPTIONS
      too_many_receivers = 1
      document_not_sent = 2
      operation_no_authorization = 4
      OTHERS = 99.


      IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ENDIF.


      donde en la tabla LT_RECLIST le paso los destinatarios
      (la completé de esta manera). Seguramente vas a tener qe cambiar el campo REC_TYPE proqe yo use una lista de distribución.

      LOOP AT lt_mails INTO le_mails.
      lt_reclist-receiver = le_mails-grupo. "NOMBRE DE LA LISTA
      lt_reclist-express = 'X'.
      lt_reclist-rec_type = 'C'. "Usa lista de distribución.
      lt_reclist-copy = 'X'.
      APPEND lt_reclist.
      ENDLOOP.

      Me avisas.

      Borrar
Publicar un comentario