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