SAP ABAP EMAIL

From SapWiki

EJEMPLO 1

r_subrc = zcl_hcm_class=>send_mail( i_correouser = lt_correos[]
                                    i_text = lt_text[]
                                    i_subject = l_subject
                                    i_sender = 'Remuneraciones@sapwiki.cl'
                                    i_copy = lt_copy
                                  ).

METHOD send_mail.
*I_CORREOUSER  Importing Type BCSY_SMTPA
*I_TEXT        Importing Type BCSY_TEXT
*I_SUBJECT     Importing Type SO_OBJ_DES
*I_MAILHEX     Importing Type SOLIX_TAB       op
*I_ATTACH_NAME Importing Type STRING          op
*I_SENDER      Importing Type AD_SMTPADR      op
*I_COPY        Importing Type BCSY_SMTPA      op
*R_SUBRC       Returning Type SYST_SUBRC
**********************************************************************
    DATA: send_request   TYPE REF TO cl_bcs,
          text           TYPE bcsy_text,
          binary_content TYPE solix_tab,
          document       TYPE REF TO cl_document_bcs,
          sender         TYPE REF TO cl_sapuser_bcs,
          recipient      TYPE REF TO if_recipient_bcs,
          bcs_exception  TYPE REF TO cx_bcs,
          sent_to_all    TYPE os_boolean,
          document_data  TYPE sofolenti1,
          doc_id         TYPE sofolenti1-doc_id,
          cont_text      TYPE soli_tab,
          attachment     TYPE REF TO if_document_bcs,
          lv_attach_name TYPE sood-objdes,
          l_sender       TYPE REF TO if_sender_bcs,
          l_message      TYPE string,
          l_correouser   TYPE ad_smtpadr,
          l_address_name TYPE ad_smtpadr.
    DATA: ld_addr         TYPE adr6-smtp_addr,
          internet_sender TYPE REF TO if_sender_bcs.
    DATA: gv_dummy(160).

    text[] = i_text[].

    TRY.
*     -------- create persistent send request ------------------------
        send_request = cl_bcs=>create_persistent( ).

*     -------- create and set document with attachment ---------------
*     create document from internal table with text


        document = cl_document_bcs=>create_document(
                      i_type    = 'HTM'
                      i_text    = i_text
*                    i_length  = '12'
                      i_subject = i_subject ).

* add attachment
        IF i_attach_name <> space.
          lv_attach_name = i_attach_name.
          CALL METHOD document->add_attachment
            EXPORTING
              i_attachment_type    = 'BIN'
              i_attachment_subject = lv_attach_name
              i_att_content_hex    = i_mailhex.
        ENDIF.

*     add document to send request
        CALL METHOD send_request->set_document( document ).

*     --------- add recipient (e-mail address) -----------------------
*     create recipient
        LOOP AT i_correouser INTO l_correouser.
          l_address_name = l_correouser.
          recipient = cl_cam_address_bcs=>create_internet_address(
                                            l_address_name ).

*     add recipient with its respective attributes to send request
          CALL METHOD send_request->add_recipient
            EXPORTING
              i_recipient = recipient
              i_express   = 'X'.
        ENDLOOP.

        LOOP AT i_copy INTO l_correouser.
          l_address_name = l_correouser.
          recipient = cl_cam_address_bcs=>create_internet_address(
                                            l_address_name ).

*     add recipient with its respective attributes to send request
          CALL METHOD send_request->add_recipient
            EXPORTING
              i_recipient = recipient
              i_express   = 'X'
              i_copy      = abap_true.
        ENDLOOP.

** Crear 'Enviado por:"
*  IF p_from IS NOT INITIAL.
*        CALL METHOD cl_cam_address_bcs=>create_internet_address
*      EXPORTING
*        i_address_string = p_from
*        i_address_name   = p_from_name
*      RECEIVING
*        result           = l_sender.
*
*    send_request->set_sender( l_sender ).
*    CLEAR l_sender.
*  ENDIF.

*     --------- set sender -------------------------------------------
*     note: this is necessary only if you want to set the sender
*           different from actual user (SY-UNAME). Otherwise sender is
*           set automatically with actual user.

        IF i_sender IS NOT INITIAL.
          ld_addr = i_sender. "'Remuneraciones@sapwiki.cl'.
          internet_sender = cl_cam_address_bcs=>create_internet_address(
                                                 i_address_string = ld_addr  ).

          CALL METHOD send_request->set_sender
            EXPORTING
              i_sender = internet_sender.
        ENDIF.
*     ---------- send document ---------------------------------------
        send_request->send_request->set_link_to_outbox( 'X' ).

        CALL METHOD send_request->send(
          EXPORTING
            i_with_error_screen = 'X'
          RECEIVING
            result              = sent_to_all ).
        IF sent_to_all = 'X'.
*        WRITE text-003.
        ENDIF.

        COMMIT WORK.
        r_subrc = 0.
* -----------------------------------------------------------
* *                     exception handling
* -----------------------------------------------------------
* * replace this very rudimentary exception handling
* * with your own one !!!
* -----------------------------------------------------------
      CATCH cx_bcs INTO bcs_exception.
        r_subrc = 4.
        IF NOT  bcs_exception->msgid IS INITIAL
        AND NOT bcs_exception->msgty IS INITIAL
        AND NOT bcs_exception->msgno IS INITIAL.
          MESSAGE ID     bcs_exception->msgid
                  TYPE   bcs_exception->msgty
                  NUMBER bcs_exception->msgno
                  WITH   bcs_exception->msgv1
                         bcs_exception->msgv2
                         bcs_exception->msgv3
                         bcs_exception->msgv4
                  into gv_dummy.
        EXIT.

    ENDTRY.
  ENDMETHOD.

Ejemplo 2 Enviar email con imagenes

REPORT zenvio_mail_html.
DATA: lt_html       TYPE soli_tab,
      ls_html       TYPE soli,
      lt_solix_tab  TYPE solix_tab,
      ls_htmlx      TYPE solix,
      l_url         TYPE so_text255,
      l_file_length TYPE i,
      l_string      TYPE string.

DATA: lo_bcs         TYPE REF TO cl_bcs,
      lo_doc_bcs     TYPE REF TO cl_document_bcs,
      lo_mime_helper TYPE REF TO cl_gbt_multirelated_service,
      lo_recipient   TYPE REF TO if_recipient_bcs,
      lo_address     TYPE REF TO cl_cam_address_bcs.

DATA : l_xstring TYPE xstring,          "image in XSTRING

DATA: l_subject      TYPE so_obj_des,
      l_username     TYPE uname,
      l_mail_address TYPE ad_smtpadr.

DATA: l_send_exception TYPE REF TO cx_root,
      l_reason         TYPE string.

* Attach image to HTML body
DATA: l_filename   TYPE string,
      l_content_id TYPE string. "for HTML content
DATA : l_obj_len         TYPE so_obj_len.

CREATE OBJECT lo_mime_helper.

* crear via trn. se80 => Repository MIME, SAP=>PUBLIC
cl_mime_repository_api=>get_api( )->get(
  EXPORTING i_url = '/SAP/PUBLIC/notificacion2.jpg'  "image path
  IMPORTING e_content = l_xstring
  EXCEPTIONS parameter_missing  = 1
             error_occured      = 2
             not_found          = 3
             permission_failure = 4
             OTHERS             = 5 ).

CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
  EXPORTING
    buffer        = l_xstring
  IMPORTING
    output_length = l_file_length
  TABLES
    binary_tab    = lt_solix_tab.

* Attach image to HTML body
l_filename   = 'mi_imagen.jpg'.
l_content_id = 'mi_imagen.jpg'.
l_obj_len = l_file_length.
CALL METHOD lo_mime_helper->add_binary_part
  EXPORTING
    content      = lt_solix_tab               " Xstring in table form
    filename     = l_filename              " file name to be given to image
    extension    = 'JPG'                   " type of file
    description  = 'Graphic in JPG format' " description
    content_type = 'image/jpg'             " content type / Mime type. If mime type not present in system then need to add through tcode : SMW0
    length       = l_obj_len               " length of image
    content_id   = l_content_id.           " content id would be used in html part

**********************************************************************
* crear HTML
**********************************************************************
lt_html = value #( ( LINE = '<!DOCTYPE html>')
                   ( LINE = '<HTML>')
                   ( LINE = '<HEAD>')
                   ( LINE = '<TITLE>Mi titulo</TITLE>')
                   ( LINE = '</HEAD>')
                   ( LINE = '<BODY>')
                   ( line = '<p class=Default align=center>')
                   ( line = '<IMG alt="[image]" src="cid:mi_imagen.jpg"/>')
                   ( line = '</p>')
                   ( LINE = '<H1>Rechazo el Pago</H1>')
                   ( LINE = 'Estimado Representante de la Empresa <P>')
                   ( LINE = 'Ud. esta rechazado <P>')
                   ( LINE = '</BODY></HTML>') ).
BREAK-POINT.

**********************************************************************
*
**********************************************************************
TRY.
    l_subject = 'Rechazo'(t01).

    CALL METHOD lo_mime_helper->set_main_html
      EXPORTING
        content     = lt_html     "
        filename    = 'sap.htm'   " file name to be given to image
        description = 'Imagen'.    " description.           " content id would be used in html part

    lo_doc_bcs = cl_document_bcs=>create_from_multirelated(
                                  i_subject          = l_subject
                                  i_multirel_service = lo_mime_helper ).
  CATCH cx_document_bcs INTO l_send_exception.
*   error handling
*    write: / 'Fehler in cl_document_bcs=>create_from_multirelated()'(001).
    l_reason = l_send_exception->get_text( ).
    WRITE: / l_reason.
    EXIT.
  CATCH cx_bcom_mime INTO l_send_exception.
*   error handling
*    write: / 'Fehler in cl_document_bcs=>create_from_multirelated()'(002).
    l_reason = l_send_exception->get_text( ).
    WRITE: / l_reason.
    EXIT.
  CATCH cx_gbt_mime INTO l_send_exception.
*   error handling
*    write: / 'Fehler in cl_document_bcs=>create_from_multirelated()'(003).
    l_reason = l_send_exception->get_text( ).
    WRITE: / l_reason.
    EXIT.
ENDTRY.

* create send_request
TRY.
    lo_bcs = cl_bcs=>create_persistent( ).
  CATCH cx_send_req_bcs INTO l_send_exception.
*   error handling
*    write: / 'Fehler in cl_bcs=>create_persistent()'(004).
    l_reason = l_send_exception->get_text( ).
    WRITE: / l_reason.
    EXIT.
ENDTRY.
TRY.
    lo_bcs->set_document( i_document = lo_doc_bcs ).
  CATCH cx_send_req_bcs INTO l_send_exception.
*   error handling
*    write: / 'Fehler in <cl_bcs>->set_document()'(005).
    l_reason = l_send_exception->get_text( ).
    WRITE: / l_reason.
    EXIT.
ENDTRY.

l_mail_address = 'pablo.tapia@sapwiki.cl'.

TRY.
    lo_address = cl_cam_address_bcs=>create_internet_address( l_mail_address ).
  CATCH cx_address_bcs.
*              "Error al crear objeto de destinatario
    RETURN.
ENDTRY.
*
TRY.
    lo_bcs->add_recipient( lo_address ).
  CATCH cx_send_req_bcs.
*              "Error al agregar destinatario a la lista
    RETURN.
ENDTRY.


*     --------- set sender -------------------------------------------
*     note: this is necessary only if you want to set the sender
*           different from actual user (SY-UNAME). Otherwise sender is
*           set automatically with actual user.
DATA: ld_addr            TYPE adr6-smtp_addr,
      lo_internet_sender TYPE REF TO if_sender_bcs.

l_mail_address = 'ejecutivo@sapwiki.cl'.
TRY.
    lo_internet_sender = cl_cam_address_bcs=>create_internet_address(
                                           i_address_string = l_mail_address  ).
  CATCH cx_address_bcs .
ENDTRY.

TRY.
    CALL METHOD lo_bcs->set_sender
      EXPORTING
        i_sender = lo_internet_sender.
  CATCH cx_send_req_bcs .
ENDTRY.
*--------------------------------------------------------------------*

TRY.
    lo_bcs->set_send_immediately( abap_true ).
  CATCH cx_send_req_bcs.
*              "Error al marcar el correo como envio inmediato
    RETURN.
ENDTRY.
*
TRY.
    "Enviar con error en pantalla
    DATA(l_result) = lo_bcs->send( abap_true ).
  CATCH cx_send_req_bcs.
*              "Error al setear el envío de correo
    RETURN.
ENDTRY.

IF l_result EQ abap_true.
  "Se confirma el envío, es necesario.
  COMMIT WORK.
ENDIF.

Subject largo, method set_message_subject

  TRY.
*     -------- create persistent send request ------------------------
      send_request = cl_bcs=>create_persistent( ).
*     -------- create and set document with attachment ---------------
      document = cl_document_bcs=>create_document(
                    i_type    = 'HTM'
                    i_text    = ut_text
*                    i_length  = '12'
                    i_subject = lv_subject ).
      send_request->set_message_subject( ip_subject = uv_subject ).   "Subject largo

Ejemplo de HTML para envío de correo con imagen y link

Programa DEMO: SF_XSF_DEMO_MAIL

SAP Note 1915614 - Dump or error message occurs while SAPoffice object (user, folder, document, attachment) should be created: SAPSQL_ARRAY_INSERT_DUPREC - DBSQL_DUPLICATE_KEY_ERROR