quinta-feira, 12 de novembro de 2020

Como enviar e-mail via SAP (CL_BCS)

 *  Eae Pessoal, hoje vou mostrar como é facil enviar e-mail pelo sistema

* para qualquer e-mail cadastrado, abaixo fiz um programa que uso sempre
* como base quando pedem para enviar e-mail para alguem após algum processo
* somente informativo.
*  Nesse nosso exemplo estaremos definindo o destinatario e o remetente
* cadastrados da TVARVC, mas não impede que durante os testes vocês troquem
* colocando fixo ( não recomendo ) ou usando os dados baseado no ID do
* Parceiro ( aih sim heimmm ), outra coisa que está disponivel
* mas nós não estamos usando é a possibilidade de inclusão de anexo no
* formato PDF, para fazer isso o metodo aguarda uma tabela OTF para converter
* e anexar, essa tabela OTF, caso não saibam é o retorno quando você chama
* um Smartforms, num proximo post eu coloco esse exemplo e como anexar outros
* tipos de documentos também, incluindo objetos 'SAP' como item de WorkFlow.
*  Codigo abaixo como sempre todo comentado, os nomes dos metodos estão 
* intuitivos também.
*  Um brinde nesse post é que está codificado de forma 'INLINE', outro post que
* está sendo montado e em breve vamos compartilhar.
*  Bons estudos e valeoooo.

REPORT ztrigger_email_interno.

CLASS cl_main DEFINITION.
  PUBLIC SECTION.
    DATA:
        gx_bcs_exception  TYPE REF TO cx_bcs.
    METHODS:
      seleciona_dados
        EXPORTING
          ev_out TYPE boolean,
      sender_email
        RETURNING VALUE(rv_sender) TYPE ad_smtpadr,
      recipient_email
        RETURNING VALUE(rv_recipient) TYPE ad_smtpadr,
      subject_email
        RETURNING VALUE(rv_subject) TYPE so_obj_des,
      body_email
        RETURNING VALUE(rt_body) TYPE soli_tab,
      envia_email
        IMPORTING
          iv_sender_email    TYPE ad_smtpadr
          iv_subject         TYPE so_obj_des
          iv_recipient_mail  TYPE ad_smtpadr
          it_body            TYPE soli_tab OPTIONAL
          iv_attachment_name TYPE sood-objdes OPTIONAL
          it_otf             TYPE tsfotf OPTIONAL
        EXPORTING
          ev_sent            TYPE boolean.
ENDCLASS.

CLASS cl_main IMPLEMENTATION.
  METHOD envia_email.
    TRY .
* Criação do objeto e-mail para envio
        DATA(ol_send_request) = cl_bcs=>create_persistent( ).



* E-mail remetente
        DATA(ol_sender) =
          cl_cam_address_bcs=>create_internet_address( iv_sender_email ).
        ol_send_request->set_sender( i_sender = ol_sender ).

* E-mail de destino
        DATA(ol_recipient) =
          cl_cam_address_bcs=>create_internet_address( iv_recipient_mail ).
        ol_send_request->add_recipient(
          EXPORTING
            i_recipient = ol_recipient
            i_express   = abap_true
        ).

* Corpo do e-mail
        DATA(ol_document) =
          cl_document_bcs=>create_document(
            i_type    = 'HTM'
            i_text    = it_body
            i_length  = '90'
            i_subject = iv_subject ).

* Anexo do e-mail
        IF it_otf[] IS NOT INITIAL.
          DATA :
            tl_itcoo    TYPE STANDARD TABLE OF itcoo,
            tl_pdf      TYPE STANDARD TABLE OF tline,
            vl_len_in   TYPE sood-objlen,
            vl_bin_file TYPE xstring.

          tl_itcoo[] = it_otf[].

          CALL FUNCTION 'CONVERT_OTF'
            EXPORTING
              format                = 'PDF'
              max_linewidth         = 123
            IMPORTING
              bin_filesize          = vl_len_in
              bin_file              = vl_bin_file
            TABLES
              otf                   = tl_itcoo
              lines                 = tl_pdf
            EXCEPTIONS
              err_max_linewidth     = 1
              err_format            = 2
              err_conv_not_possible = 3
              err_bad_otf           = 4
              OTHERS                = 5.

          DATA(tl_attachment_hex) =
            cl_bcs_convert=>xstring_to_solix( vl_bin_file ).
          ol_document->add_attachment(
            EXPORTING
              i_attachment_type    = 'PDF'
              i_attachment_subject = iv_attachment_name
              i_att_content_hex    = tl_attachment_hex
          ).
        ENDIF.

* Adiciona o Anexo no e-mail
        ol_send_request->set_document( ol_document ).



* Dispara o envio do e-mail
        ev_sent = ol_send_request->send( i_with_error_screen = abap_true ).

        IF ev_sent IS NOT INITIAL.
* Realiza o envio do e-mail.
          COMMIT WORK.

        ENDIF.


      CATCH cx_bcs INTO me->gx_bcs_exception.

    ENDTRY.

  ENDMETHOD.

  METHOD seleciona_dados.

    BREAK-POINT.

*  Dentro desse metodo você pode usar a regra que quiser e assim preencher
* o parametro para que dispare o e-mail.

    ev_out = abap_true.

  ENDMETHOD.

  METHOD sender_email.
    SELECT SINGLE low FROM tvarvc INTO rv_sender
      WHERE name = 'Z_GRC_PC_SENDER'.
  ENDMETHOD.

  METHOD recipient_email.
    SELECT SINGLE low FROM tvarvc INTO rv_recipient
      WHERE name = 'Z_GRC_PC_RECIPIENT'.
  ENDMETHOD.

  METHOD subject_email.
    rv_subject = 'Titulo do email de testes - ABAPJuniores'.
  ENDMETHOD.

  METHOD body_email.

    DATA :
      lt_lines TYPE TABLE OF tline.

    CALL FUNCTION 'READ_TEXT'
      EXPORTING
        client                  = sy-mandt
        id                      = 'ST'
        language                = 'P'
        name                    = 'Z_BODY_DO_EMAIL'
        object                  = 'TEXT'
      TABLES
        lines                   = lt_lines[]
      EXCEPTIONS
        id                      = 1
        language                = 2
        name                    = 3
        not_found               = 4
        object                  = 5
        reference_check         = 6
        wrong_access_to_archive = 7
        OTHERS                  = 8.

    IF lt_lines[] IS NOT INITIAL.
      LOOP AT lt_lines ASSIGNING FIELD-SYMBOL(<lines>).
        APPEND INITIAL LINE TO rt_body ASSIGNING FIELD-SYMBOL(<body>).
        CASE <lines>-tdformat.
          WHEN '*'.
            <body>-line = <lines>-tdline && space.
          WHEN '*/'.
          WHEN OTHERS.
        ENDCASE.
      ENDLOOP.
    ENDIF.

* Tratativa especial de testes
    IF rt_body[] IS INITIAL.
      APPEND INITIAL LINE TO rt_body ASSIGNING <body>.
      <body>-line = 'Corpo do email teste.'.
    ENDIF.


  ENDMETHOD.

ENDCLASS.

DATA
 o_main TYPE REF TO cl_main.

START-OF-SELECTION.

  CREATE OBJECT o_main.
  o_main->seleciona_dados(
    IMPORTING
      ev_out = DATA(lv_out) ).

  IF lv_out IS NOT INITIAL.
    BREAK-POINT.
    o_main->envia_email(
      EXPORTING
        iv_sender_email   = o_main->sender_email( )
        iv_subject        = o_main->subject_email( )
        iv_recipient_mail = o_main->recipient_email( )
        it_body           = o_main->body_email( )
    ).
  ENDIF.