关键字: sost
在SAP中我们可以配置STMP邮件功能,可以通过SOST来查看邮件状态,在编码中可用FM SO_DOCUMENT_SEND_API1 、SO_NEW_DOCUMENT_ATT_SEND_API1通过编码的方式来发送邮件以及邮件附件。在定义附件表时用solisti1,其长度为Char255,实际中我们导出的每一行记录都会超出这个长度。对XLS格试的附件我们可以用Excel的分隔标签来解决这个问题,对于文字乱码我们可以在附件加charset=utf-16le解决此类问题。同样,也适用于其他类似的乱码问题。
constants: c_tab type c value cl_abap_char_utilities=>horizontal_tab,
c_cret type c value cl_abap_char_utilities=>cr_lf,
c_mimetype type char64
value 'APPLICATION/MSEXCEL;charset=utf-16le'.
data: v_xattach type xstring,
it_binary_attach type solix_tab.
*---------------------------------------------------------------------------------
* Convert the internal data to XString
*----------------------------------------------------------------------------------
data: lc_descr_ref type ref to cl_abap_structdescr,
lv_value type char128,
lv_temp type string,
lv_mid type string,
lv_tabix type sy-tabix.
field-symbols: <fs_intable> type any.
field-symbols: <intable_wa> type abap_compdescr.
loop at it_table.
lv_tabix = sy-tabix.
clear lv_temp.
lc_descr_ref ?= cl_abap_typedescr=>describe_by_data( it_table ).
loop at lc_descr_ref->components assigning <intable_wa>.
assign component sy-tabix of structure in_table to <fs_table>.
lv_value = <fs_table>.
condense lv_value.
if sy-tabix = 1.
lv_temp = lv_value.
continue.
endif.
concatenate lv_temp lv_value
into lv_temp separated by c_tab.
endloop.
concatenate lv_mid lv_temp c_cret into lv_mid.
endloop.
* Convert string to xstring type
* 'APPLICATION/MSEXCEL;charset=utf-16le'
call function 'SCMS_STRING_TO_XSTRING'
exporting
text = lv_mid
mimetype = c_mimetype
importing
buffer = v_xattach
exceptions
failed = 1
others = 2.
* Add the file header for utf-16le. .
if sy-subrc = 0.
concatenate cl_abap_char_utilities=>byte_order_mark_little
v_xattach into v_xattach in byte mode.
endif.
call function 'SCMS_XSTRING_TO_BINARY'
exporting
buffer = v_xattach
tables
binary_tab = it_binary_attach.
*---------------------------------------------------------------------------------
*Send Email
*----------------------------------------------------------------------------------
data: lv_title type so_obj_des, " Email Title
lv_email type adsmtp-smtp_addr, " Receiver
lv_attitle type char50. " Attachment Title
data: send_request type ref to cl_bcs,
document type ref to cl_document_bcs,
conlengths type so_obj_len,
html type table of w3html,
sender_id type ref to if_sender_bcs,
recipient type ref to if_recipient_bcs,
cc_recipient type ref to if_recipient_bcs,
sent_to_all type os_boolean,
bcs_exception type ref to cx_bcs,
bcs_message type string.
clear: lv_email,
lv_title,
html. " Email Body Content with html format
try.
* request email function
clear send_request.
send_request = cl_bcs=>create_persistent( ).
* Create the content of email
clear document .
document = cl_document_bcs=>create_document(
i_type = 'HTM'
i_text = html
i_length = conlengths
i_subject = lv_title ).
* Add Attachment
call method document->add_attachment
exporting
i_attachment_type = 'XLS'
i_attachment_subject = lv_attitle
i_att_content_hex = it_binary_attach.
* Add document to send request
call method send_request->set_document( document ).
clear recipient.
recipient =
cl_cam_address_bcs=>create_internet_address( lv_email ).
* Add recipient with its respective attributes to send request
call method send_request->add_recipient
exporting
i_recipient = recipient
i_express = 'X'.
* E-mail
call method send_request->set_status_attributes
exporting
i_requested_status = 'E'
i_status_mail = 'E'.
call method send_request->set_send_immediately( 'X' ).
* Send document
call method send_request->send(
exporting
i_with_error_screen = 'X'
receiving
result = sent_to_all ).
if sent_to_all = 'X' and sy-batch <> 'X'.
message 'Send Successfully' type 'I'.
endif.
commit work.
catch cx_bcs into bcs_exception.
bcs_message = bcs_exception->get_text( ).
if sy-batch <> 'X'.
message bcs_exception type 'E'.
else.
write: bcs_message.
endif.
exit.
endtry.