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_senderTYPE ad_smtpadr,
      recipient_email
        RETURNING VALUE(rv_recipientTYPE ad_smtpadr,
      subject_email
        RETURNING VALUE(rv_subjectTYPE so_obj_des,
      body_email
        RETURNING VALUE(rt_bodyTYPE 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_requestcl_bcs=>create_persistent).



* E-mail remetente
        DATA(ol_sender=
          cl_cam_address_bcs=>create_internet_addressiv_sender_email ).
        ol_send_request->set_senderi_sender ol_sender ).

* E-mail de destino
        DATA(ol_recipient=
          cl_cam_address_bcs=>create_internet_addressiv_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_solixvl_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_documentol_document ).



* Dispara o envio do e-mail
        ev_sent ol_send_request->sendi_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.