venerdì 5 maggio 2017

Invio mail immediato da SAP.








In ABAP esistono vari modi per gestire l'invio di mail:

tramite il Function Module SO_DOCUMENT_SEND_API1

  CALL FUNCTION 'SO_DOCUMENT_SEND_API1'
    EXPORTING
      document_data              = str_doc
      put_in_outbox              = 'X'
      sender_address             = ld_sender_address
      sender_address_type        = ld_sender_address_type
      commit_work                = 'X'
    TABLES
      packing_list               = it_objpack
      object_header              = it_objhead
      contents_bin               = it_objbin
      contents_txt               = it_testo
      receivers                  = it_dest
    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.

o la programmazione ad oggetti con la classe CL_BCS e il metodo SEND

  DATA: send_request       TYPE REF TO cl_bcs.

  send_request = cl_bcs=>create_persistent( ).

  CALL METHOD send_request->send(
    EXPORTING
      i_with_error_screen = 'X'
    RECEIVING
      result              = sent_to_all ).

Le mail generate vengono inserite in una coda di elaborazione per essere poi inviate, tramite un job, alle destinazioni SMTP definite nel sistema.

I messaggi in coda si possono vedere dalla transazione SCOT


e avviando manualmente il processo di invio (CTRL+F7)


è possibile elaborare la spedizione dei messaggi.

Nel nostro sistema abbiamo schedulato il Job di invio ogni 5 minuti; pertanto quando devo inviare mail da ABAP non mi preoccupo per l'invio immediato e metto tutto in coda: nel giro di 5' vengono smistate automaticamente.

In alcuni casi però mi hanno chiesto che l'invio fosse immediato.

Per risolvere si possono seguire queste strade.

Se si usa il FM, subito dopo la CALL alla SO_DOCUMENT_SEND_API1, si può lanciare via ABAP il Job di invio mail per smaltire tutta la coda:

  WAIT UP TO '0.5' SECONDS.
  SUBMIT rsconn01 WITH mode   = 'INT'
                  WITH output = ' '
                   AND RETURN.

Nota bene:
  • in questo caso viene svuotata tutta la coda, quindi anche eventuali altre mail in attesa.
  • chiaramente questo metodo funziona anche se si sta usando la programmazione ad oggetti (visto che lavora su tutta la coda di invio).
  • se si lancia il report con output = 'X' l'utente riceve una pop-up di avviso con il numero di mail inviate:

Se si sta usando la programmazione ad oggetti si può impostare l'invio immediato con il metodo

  CALL METHOD send_request->set_send_immediately( 'X' ).

(chiaramente prima di chiamare il metodo SEND!)

Nota bene: in questo caso viene inviata immediatamente la sola mail in elaborazione, altre eventuali mail in coda nella SCOT restano in attesa.

P.S. : vedo che, per l'invio via mail di una tabella, è disponibile il seguente Function Module

    CALL FUNCTION 'EFG_GEN_SEND_EMAIL'
      EXPORTING
        i_title                i_title
        i_sender               sy-uname
        i_recipient            i_recipient
        i_flg_commit           'X'
        i_flg_send_immediately 'X'
      TABLES
        i_tab_lines            it_table
      EXCEPTIONS
        not_qualified          1
        failed                 2
        OTHERS                      3.

anche in questo caso è possibile l'invio immediato, infatti il FM si appoggia alla classe CL_BCS.

Nessun commento:

Posta un commento