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.