I had to send again a mail through SAP. I used my older code and found it a lot heavy for my needs. I managed to create a Z function that allows me to send a simple mail without having to fill all those nasty tables.
Maybe it exists in SAP standard, but I’ve been not able to find it.
FUNCTION z_xx01_simple_mail_sending.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" REFERENCE(I_SINGLE_URL) TYPE SO_RECNAME OPTIONAL
*" REFERENCE(I_RECEIVER) TYPE SOMLRECI1 OPTIONAL
*" REFERENCE(I_SUBJECT) TYPE SO_OBJ_DES OPTIONAL
*" REFERENCE(I_BODY) TYPE SO_TEXT255 OPTIONAL
*" EXPORTING
*" VALUE(SENT_TO_ALL) LIKE SONV-FLAG
*" VALUE(NEW_OBJECT_ID) LIKE SOFOLENTI1-OBJECT_ID
*" TABLES
*" PACKING_LIST STRUCTURE SOPCKLSTI1 OPTIONAL
*" OBJECT_HEADER STRUCTURE SOLISTI1 OPTIONAL
*" CONTENTS_BIN STRUCTURE SOLISTI1 OPTIONAL
*" CONTENTS_TXT STRUCTURE SOLISTI1 OPTIONAL
*" CONTENTS_HEX STRUCTURE SOLIX OPTIONAL
*" OBJECT_PARA STRUCTURE SOPARAI1 OPTIONAL
*" OBJECT_PARB STRUCTURE SOPARBI1 OPTIONAL
*" RECEIVERS STRUCTURE SOMLRECI1 OPTIONAL
*" EXCEPTIONS
*" TOO_MANY_RECEIVERS
*" DOCUMENT_NOT_SENT
*" DOCUMENT_TYPE_NOT_EXIST
*" OPERATION_NO_AUTHORIZATION
*" PARAMETER_ERROR
*" X_ERROR
*" ENQUEUE_ERROR
*"----------------------------------------------------------------------
*---------------------------------------------------------------------*
* Header:
* -------
* Program Name: Z_XX01_SIMPLE_MAIL_SENDING
* Description : SO_NEW_DOCUMENT_ATT_SEND_API1 interface
*---------------------------------------------------------------------*
* IT Change History
* -----------------
* 1.
* Remark: 1).
*----------------------------------------------------------------------*
DATA: document_data TYPE sodocchgi1,
packing_line TYPE sopcklsti1,
receiver TYPE somlreci1,
header TYPE solisti1.
DATA: content_txt TYPE solisti1,
lines TYPE i.
* Receiver -----------------------------------------------
IF NOT i_single_url IS INITIAL.
receiver-receiver = i_single_url.
receiver-rec_type = 'U'. "URL-internet
APPEND receiver TO receivers.
ENDIF.
IF NOT i_receiver IS INITIAL.
APPEND i_receiver TO receivers.
ENDIF.
* Body of the message ------------------------------------
IF NOT i_body IS INITIAL.
content_txt-line = i_body.
APPEND content_txt TO contents_txt.
ENDIF.
DESCRIBE TABLE contents_txt.
lines = sy-tfill.
* Content -------------------------------------------------
document_data-obj_name = 'MAIL'.
document_data-obj_descr = i_subject. "subject
document_data-sensitivty = 'P'.
document_data-doc_size = lines * 255.
* Subject -------------------------------------------------
header-line = i_subject.
APPEND header TO object_header.
* Packing list --------------------------------------------
CLEAR packing_line-transf_bin.
packing_line-head_start = 1.
packing_line-head_num = 0.
packing_line-body_start = 1.
packing_line-body_num = lines.
packing_line-doc_type = 'RAW'.
APPEND packing_line TO packing_list.
CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
EXPORTING
document_data = document_data
* PUT_IN_OUTBOX = ' '
IMPORTING
sent_to_all = sent_to_all
* NEW_OBJECT_ID =
TABLES
packing_list = packing_list
object_header = object_header
contents_bin = contents_bin
contents_txt = contents_txt
contents_hex = contents_hex
object_para = object_para
object_parb = object_parb
receivers = receivers
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.
CASE sy-subrc.
WHEN 0.
* Woooohoooooo!!
WHEN 1.
RAISE too_many_receivers.
WHEN 2.
RAISE document_not_sent.
WHEN 3.
RAISE document_type_not_exist.
WHEN 4.
RAISE operation_no_authorization.
WHEN 5.
RAISE parameter_error.
WHEN 6.
RAISE x_error.
WHEN 7.
RAISE equeue_error.
WHEN 8.
MESSAGE e158(zppes00) WITH 'Error sending mail'.
ENDCASE.
ENDFUNCTION.
It’s use is easy:
– if you want to send the mail to a single address, just fill the I_SINGLE_URL field
– if you want to send the mail to a non-URL address, fill the I_RECEIVER structure
– the subject of your mail? I_SUBJECT
– a short body? I_BODY
Update: Remember to call a COMMIT after the function call. If you want not, you can use the COMMIT_WORK parameter of the SO* function module called here.
I kept the original parameters and exceptions of the original function module, to allow people to make the mail as complicated as needed.
Enjoy it!
Pingback: How to send a mail through SAP and not to die trying it « The Tuly Idiots’ Club