Enviar mails desde R/3

Introducción

Enviar correos electrónicos desde R/3 es una tarea sencilla… si sabes cómo. Si no, puede ser algo muy lioso.

El requisito básico es configurar, en la transacción SCOT, un servidor SMTP. Debemos añadir al árbol INT (internet) un objeto SMTP y posteriormente configurarlo: basta con darle un nombre, activar la casilla “Nodo en operación” y especificar en Host y Puerta el nombre o IP del servidor SMTP y el puerto (normalmente el 25).

Pon también, en los tipos de dirección soportados, un * dentro del botón adyacente a la casilla “Internet”. Nada de esto servirá si en el menú de la SCOT > Opciones > Dominio por defecto no ponemos el nombre del dominio desde donde queremos que figure el remitente.

El servidor de correo, por otra parte, deberá estar correctamente configurado y con una adecuada política de permisos, que en ocasiones, dentro de las empresas, es muy restrictivo. De hecho, no me detengo mucho en esto porque esto es responsabilidad de Sistemas y no nuestra, meros picacódigos.

El proceso de enviar el mail en sí admite un montón de parámetros: pero, en aras de la simplicidad, he creado una función que debería funcionar en prácticamente cualquier sistema y que tiene sólo 3 parámetros: destinatario, título y contenido. Control de errores y demás están reducidos al mínimo, pero se pueden añadir a voluntad del programador.

El código

FUNCTION z_send_text_mail.
*"----------------------------------------------------------------------
*"*"Interfase local
*"  IMPORTING
*"     VALUE(EMAIL) TYPE  STRING
*"     VALUE(SUBJECT) TYPE  STRING
*"     VALUE(TEXT) TYPE  STRING
*"----------------------------------------------------------------------
  "as seen on http://cranf.com

  DATA it_packing_list TYPE TABLE OF sopcklsti1 WITH HEADER LINE.
  DATA it_receivers TYPE TABLE OF somlreci1 WITH HEADER LINE.
  DATA it_contents_txt TYPE TABLE OF solisti1 WITH HEADER LINE.
  DATA document_data TYPE sodocchgi1.
  DATA sent_to_all.

  "pasamos el string a tabla
  PERFORM string2table TABLES it_contents_txt USING text.

  "atributos del mensaje
  document_data-obj_langu = sy-langu.
  document_data-obj_name = 'SAPRPT'.
  document_data-obj_descr = subject.
  document_data-sensitivty = 'S'.
  document_data-no_change = space.

  " descripción del body
  CLEAR it_packing_list.
  REFRESH it_packing_list.
  it_packing_list-transf_bin = space.
  it_packing_list-head_start = 1.
  it_packing_list-head_num = 0.
  it_packing_list-body_start = 1.
  DESCRIBE TABLE it_contents_txt LINES it_packing_list-body_num.
  it_packing_list-doc_type = 'TXT'.
  APPEND it_packing_list.

  " destinatario
  CLEAR it_receivers.
  REFRESH it_receivers.
  it_receivers-receiver = email.
  it_receivers-rec_type = 'U'.
  it_receivers-com_type = 'INT'.
  APPEND it_receivers.

  CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
    EXPORTING
      document_data              = document_data
      put_in_outbox              = 'X'
      commit_work                = 'X'
    IMPORTING
      sent_to_all                = sent_to_all
    TABLES
      packing_list               = it_packing_list
      contents_txt               = it_contents_txt
      receivers                  = it_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.

ENDFUNCTION.

*     _        _             ____  _        _     _
* ___| |_ _ __(_)_ __   __ _|___ \| |_ __ _| |__ | | ___
*/ __| __| '__| | '_ \ / _` | __) | __| _` | '_ \| |/ _ \
*\__ \ |_| |  | | | | | (_| |/ __/| |_ (_| | |_) | |  __/
*|___/\__|_|  |_|_| |_|\__, |_____|\__|__,_|_.__/|_|\___|
*       ASCII Art made |___/ at http://ascii.cranf.net
FORM string2table TABLES ptable USING pstring TYPE string.
  DATA lstring TYPE string.
  DATA loffset TYPE i.
  DATA lofflen TYPE i.
  DATA llimlen TYPE i.
  DATA lchunks TYPE i.
  DATA ltablength TYPE i.
  DATA lstrlength TYPE i.

  lstring = pstring.
  lstrlength = STRLEN( lstring ).

  DESCRIBE FIELD ptable LENGTH ltablength IN CHARACTER MODE.
  lofflen = ltablength.

  lchunks = lstrlength / ltablength.

  WHILE loffset < lstrlength.
    llimlen = ltablength + loffset.
    IF llimlen > lstrlength.
      lofflen = lstrlength - loffset.
    ENDIF.
    ptable = lstring+loffset(lofflen).
    APPEND ptable.
    loffset = loffset + ltablength.
  ENDWHILE.
  CLEAR ptable.

ENDFORM.                    "string2table

Observaciones

El texto puede incluir saltos de línea siempre que se haga uso de saltos de línea adecuados.

Es importante tener en cuenta que la función por sí sola no manda el mail. Debemos invocar un report estándar que se encarga de liberar la cola de correo. En principio esto está, o debería estar configurado, como job periódico. Pero podemos dar un empujoncito creando la siguiente función, que no tiene parámetros, para que los mails se hagan efectivos.

FUNCTION z_mail_launch.

  SUBMIT rsconn01 WITH mode = 'INT' WITH output = '' AND RETURN.

ENDFUNCTION.
Publicado en: SAP Sin comentarios ▼

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

*

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

[c] Alberto Viñuela Miranda / Cranfcom 2013-2014

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.