Difference between revisions of "SAP ABAP EMAIL"

From SapWiki
 
(16 intermediate revisions by the same user not shown)
Line 1: Line 1:
  r_subrc = zcl_hcm_class=>send_mail( i_correouser = lt_correos[]
+
==EJEMPLO 1==
                                    i_text = lt_text[]
+
  <nowiki>r_subrc = zcl_hcm_class=>send_mail( i_correouser = lt_correos[]
                                    i_subject = l_subject
+
                                    i_text = lt_text[]
                                    i_sender = 'Remuneraciones@sapwiki.cl'
+
                                    i_subject = l_subject
                                    i_copy = lt_copy
+
                                    i_sender = 'Remuneraciones@sapwiki.cl'
                                  ).
+
                                    i_copy = lt_copy
 +
                                  ).
  
METHOD send_mail.
+
METHOD send_mail.
*I_CORREOUSER  Importing Type BCSY_SMTPA
+
*I_CORREOUSER  Importing Type BCSY_SMTPA
*I_TEXT        Importing Type BCSY_TEXT
+
*I_TEXT        Importing Type BCSY_TEXT
*I_SUBJECT    Importing Type SO_OBJ_DES
+
*I_SUBJECT    Importing Type SO_OBJ_DES
*I_MAILHEX    Importing Type SOLIX_TAB      op
+
*I_MAILHEX    Importing Type SOLIX_TAB      op
*I_ATTACH_NAME Importing Type STRING          op
+
*I_ATTACH_NAME Importing Type STRING          op
*I_SENDER      Importing Type AD_SMTPADR      op
+
*I_SENDER      Importing Type AD_SMTPADR      op
*I_COPY        Importing Type BCSY_SMTPA      op
+
*I_COPY        Importing Type BCSY_SMTPA      op
*R_SUBRC      Returning Type SYST_SUBRC
+
*R_SUBRC      Returning Type SYST_SUBRC
**********************************************************************
+
**********************************************************************
    DATA: send_request  TYPE REF TO cl_bcs,
+
    DATA: send_request  TYPE REF TO cl_bcs,
          text          TYPE bcsy_text,
+
          text          TYPE bcsy_text,
          binary_content TYPE solix_tab,
+
          binary_content TYPE solix_tab,
          document      TYPE REF TO cl_document_bcs,
+
          document      TYPE REF TO cl_document_bcs,
          sender        TYPE REF TO cl_sapuser_bcs,
+
          sender        TYPE REF TO cl_sapuser_bcs,
          recipient      TYPE REF TO if_recipient_bcs,
+
          recipient      TYPE REF TO if_recipient_bcs,
          bcs_exception  TYPE REF TO cx_bcs,
+
          bcs_exception  TYPE REF TO cx_bcs,
          sent_to_all    TYPE os_boolean,
+
          sent_to_all    TYPE os_boolean,
          document_data  TYPE sofolenti1,
+
          document_data  TYPE sofolenti1,
          doc_id        TYPE sofolenti1-doc_id,
+
          doc_id        TYPE sofolenti1-doc_id,
          cont_text      TYPE soli_tab,
+
          cont_text      TYPE soli_tab,
          attachment    TYPE REF TO if_document_bcs,
+
          attachment    TYPE REF TO if_document_bcs,
          lv_attach_name TYPE sood-objdes,
+
          lv_attach_name TYPE sood-objdes,
          l_sender      TYPE REF TO if_sender_bcs,
+
          l_sender      TYPE REF TO if_sender_bcs,
          l_message      TYPE string,
+
          l_message      TYPE string,
          l_correouser  TYPE ad_smtpadr,
+
          l_correouser  TYPE ad_smtpadr,
          l_address_name TYPE ad_smtpadr.
+
          l_address_name TYPE ad_smtpadr.
    DATA: ld_addr        TYPE adr6-smtp_addr,
+
    DATA: ld_addr        TYPE adr6-smtp_addr,
          internet_sender TYPE REF TO if_sender_bcs.
+
          internet_sender TYPE REF TO if_sender_bcs.
+
    DATA: gv_dummy(160).
    text[] = i_text[].
+
 
+
    text[] = i_text[].
    TRY.
+
 
*    -------- create persistent send request ------------------------
+
    TRY.
        send_request = cl_bcs=>create_persistent( ).
+
*    -------- create persistent send request ------------------------
+
        send_request = cl_bcs=>create_persistent( ).
*    -------- create and set document with attachment ---------------
+
 
*    create document from internal table with text
+
*    -------- create and set document with attachment ---------------
+
*    create document from internal table with text
+
 
        document = cl_document_bcs=>create_document(
+
 
                      i_type    = 'HTM'
+
        document = cl_document_bcs=>create_document(
                      i_text    = i_text
+
                      i_type    = 'HTM'
*                    i_length  = '12'
+
                      i_text    = i_text
                      i_subject = i_subject ).
+
*                    i_length  = '12'
+
                      i_subject = i_subject ).
* add attachment
+
 
        IF i_attach_name <> space.
+
* add attachment
          lv_attach_name = i_attach_name.
+
        IF i_attach_name <> space.
          CALL METHOD document->add_attachment
+
          lv_attach_name = i_attach_name.
            EXPORTING
+
          CALL METHOD document->add_attachment
              i_attachment_type    = 'BIN'
+
            EXPORTING
              i_attachment_subject = lv_attach_name
+
              i_attachment_type    = 'BIN'
              i_att_content_hex    = i_mailhex.
+
              i_attachment_subject = lv_attach_name
        ENDIF.
+
              i_att_content_hex    = i_mailhex.
+
        ENDIF.
*    add document to send request
+
 
        CALL METHOD send_request->set_document( document ).
+
*    add document to send request
+
        CALL METHOD send_request->set_document( document ).
*    --------- add recipient (e-mail address) -----------------------
+
 
*    create recipient
+
*    --------- add recipient (e-mail address) -----------------------
        LOOP AT i_correouser INTO l_correouser.
+
*    create recipient
          l_address_name = l_correouser.
+
        LOOP AT i_correouser INTO l_correouser.
          recipient = cl_cam_address_bcs=>create_internet_address(
+
          l_address_name = l_correouser.
                                            l_address_name ).
+
          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
+
*    add recipient with its respective attributes to send request
            EXPORTING
+
          CALL METHOD send_request->add_recipient
              i_recipient = recipient
+
            EXPORTING
              i_express  = 'X'.
+
              i_recipient = recipient
        ENDLOOP.
+
              i_express  = 'X'.
+
        ENDLOOP.
        LOOP AT i_copy INTO l_correouser.
+
 
          l_address_name = l_correouser.
+
        LOOP AT i_copy INTO l_correouser.
          recipient = cl_cam_address_bcs=>create_internet_address(
+
          l_address_name = l_correouser.
                                            l_address_name ).
+
          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
+
*    add recipient with its respective attributes to send request
            EXPORTING
+
          CALL METHOD send_request->add_recipient
              i_recipient = recipient
+
            EXPORTING
              i_express  = 'X'
+
              i_recipient = recipient
              i_copy      = abap_true.
+
              i_express  = 'X'
        ENDLOOP.
+
              i_copy      = abap_true.
+
        ENDLOOP.
** Crear 'Enviado por:"
+
 
*  IF p_from IS NOT INITIAL.
+
** Crear 'Enviado por:"
*        CALL METHOD cl_cam_address_bcs=>create_internet_address
+
*  IF p_from IS NOT INITIAL.
*      EXPORTING
+
*        CALL METHOD cl_cam_address_bcs=>create_internet_address
*        i_address_string = p_from
+
*      EXPORTING
*        i_address_name  = p_from_name
+
*        i_address_string = p_from
*      RECEIVING
+
*        i_address_name  = p_from_name
*        result          = l_sender.
+
*      RECEIVING
*
+
*        result          = l_sender.
*    send_request->set_sender( l_sender ).
+
*
*    CLEAR l_sender.
+
*    send_request->set_sender( l_sender ).
*  ENDIF.
+
*    CLEAR l_sender.
+
*  ENDIF.
*    --------- set sender -------------------------------------------
+
 
*    note: this is necessary only if you want to set the sender
+
*    --------- set sender -------------------------------------------
*          different from actual user (SY-UNAME). Otherwise sender is
+
*    note: this is necessary only if you want to set the sender
*          set automatically with actual user.
+
*          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'.
+
        IF i_sender IS NOT INITIAL.
          internet_sender = cl_cam_address_bcs=>create_internet_address(
+
          ld_addr = i_sender. "'Remuneraciones@sapwiki.cl'.
                                                  i_address_string = ld_addr  ).
+
          internet_sender = cl_cam_address_bcs=>create_internet_address(
+
                                                i_address_string = ld_addr  ).
          CALL METHOD send_request->set_sender
+
 
            EXPORTING
+
          CALL METHOD send_request->set_sender
              i_sender = internet_sender.
+
            EXPORTING
        ENDIF.
+
              i_sender = internet_sender.
*    ---------- send document ---------------------------------------
+
        ENDIF.
        send_request->send_request->set_link_to_outbox( 'X' ).
+
*    ---------- send document ---------------------------------------
+
        send_request->send_request->set_link_to_outbox( 'X' ).
        CALL METHOD send_request->send(
+
 
          EXPORTING
+
        CALL METHOD send_request->send(
            i_with_error_screen = 'X'
+
          EXPORTING
          RECEIVING
+
            i_with_error_screen = 'X'
            result              = sent_to_all ).
+
          RECEIVING
        IF sent_to_all = 'X'.
+
            result              = sent_to_all ).
*        WRITE text-003.
+
        IF sent_to_all = 'X'.
        ENDIF.
+
*        WRITE text-003.
+
        ENDIF.
        COMMIT WORK.
+
 
        r_subrc = 0.
+
        COMMIT WORK.
* -----------------------------------------------------------
+
        r_subrc = 0.
* *                    exception handling
+
* -----------------------------------------------------------
* -----------------------------------------------------------
+
* *                    exception handling
* * replace this very rudimentary exception handling
+
* -----------------------------------------------------------
* * with your own one !!!
+
* * replace this very rudimentary exception handling
* -----------------------------------------------------------
+
* * with your own one !!!
      CATCH cx_bcs INTO bcs_exception.
+
* -----------------------------------------------------------
        r_subrc = 4.
+
      CATCH cx_bcs INTO bcs_exception.
        EXIT.
+
        r_subrc = 4.
+
        IF NOT  bcs_exception->msgid IS INITIAL
    ENDTRY.
+
        AND NOT bcs_exception->msgty IS INITIAL
  ENDMETHOD.
+
        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.</nowiki>
 +
 
 +
==Ejemplo 2 Enviar email con imagenes==
 +
<nowiki>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.</nowiki>
 +
 
 +
==Subject largo, method set_message_subject==
 +
<nowiki>
 +
  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
 +
</nowiki>
 +
 
 +
==[[SAP_ABAP_HTML_EX01|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 ==

Latest revision as of 22:47, 26 July 2024

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