此邮件发送为附件XLS文档,也可将参数设置为PDF,可发送PDF附件。
一、新建自定义表,如下: 存储邮箱地址。若邮箱地址可直接从系统抓取则可忽略
二、数据定义
****-----------------------------------邮件发送---------------------------------------------
CONSTANTS:
gc_tab TYPE c VALUE cl_bcs_convert=>gc_tab, "CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB
gc_crlf TYPE c VALUE cl_bcs_convert=>gc_crlf. "CL_ABAP_CHAR_UTILITIES=>CR_LF
DATA: i_packing_list LIKE sopcklsti1 OCCURS 0 WITH HEADER LINE,
i_receivers LIKE somlreci1 OCCURS 0 WITH HEADER LINE, "receivers
i_sendmail LIKE zsendmail OCCURS 0 WITH HEADER LINE,
i_contents_txt LIKE solisti1 OCCURS 0 WITH HEADER LINE, "ASCII contents of object and attachments
i_contents_hex LIKE solix OCCURS 0 WITH HEADER LINE, "Binary contents of object and attachments
i_contents_bin LIKE solisti1 OCCURS 0 WITH HEADER LINE,
i_object_header LIKE solisti1 OCCURS 0 WITH HEADER LINE, "attachments name
w_doc_data LIKE sodocchgi1.
DATA: c_mimetype TYPE char64 VALUE 'APPLICATION/MSEXCEL;charset=utf-16le'.
DATA: v_xattach TYPE xstring.
DATA: lv_string TYPE string.
DATA: tab_lines LIKE sy-tabix,
w_sent_all(1) TYPE c,
w_error TYPE sy-subrc.
DATA:num1 TYPE i.
三、相关代码
START-OF-SELECTION.
PERFORM getdata.
DESCRIBE TABLE gt_data LINES num1.
IF num1 NE 0.
IF sy-batch = 'X'.
PERFORM send_mail.
ELSE.
PERFORM display_data.
ENDIF.
ENDIF.
IF num1 EQ 0.
MESSAGE '没有符合条件的数据 ' TYPE 'I'.
ENDIF.
FORM send_mail .
PERFORM get_send_mail.
***define mail main context****
PERFORM define_mail_header.
***dfine attachment*******************
PERFORM define_mail_attachment.
***get mail receiver*****************
PERFORM get_receivers.
*Send email message, although is not sent from SAP until mail send
*program has been executed(rsconn01)
PERFORM send_email_message.
ENDFORM.
FORM get_send_mail.
SELECT * FROM zsendmail
INTO CORRESPONDING FIELDS OF TABLE i_sendmail.
IF matnr[] IS INITIAL .
DELETE i_sendmail WHERE ztype NE '1'."成品
ELSE.
DELETE i_sendmail WHERE ztype NE '2'."复配料
ENDIF.
ENDFORM. " GET_SPFLI_DATA
FORM define_mail_header .
DATA: tmp_date LIKE sy-datum.
DATA: tmp_char(30).
tmp_date = sy-datum.
CONCATENATE 'Overdue Batch ' sy-datum INTO tmp_char.
********define subject and priority************
IF matnr[] IS INITIAL.
w_doc_data-obj_descr = '成品库存货龄表'. "Email Subject.
ELSE.
w_doc_data-obj_descr = '复配料库存货龄表'. "Email Subject.
ENDIF.
w_doc_data-priority = 1. "mail PRIORITY¡A 1 is highest
w_doc_data-obj_langu = sy-langu.
w_doc_data-obj_name = 'OFFER'. "Name of document..
w_doc_data-sensitivty = 'O'. "Document sensitivity.
********mail main context***********************
i_contents_txt = '各位主管、同仁:'.
APPEND i_contents_txt.
i_contents_txt = ' '.
APPEND i_contents_txt.
IF matnr[] IS INITIAL.
i_contents_txt = ' 附件为成品库存货龄表!'.
ELSE.
i_contents_txt = ' 附件为复配料库存货龄表!'.
ENDIF.
APPEND i_contents_txt.
i_contents_txt = ' 此邮件为系统发送,不需要回复'.
APPEND i_contents_txt.
i_contents_txt = ' 如果您有任务疑问,请联系SAP管理员'.
APPEND i_contents_txt.
i_contents_txt = ' '.
APPEND i_contents_txt.
i_contents_txt = tmp_date.
APPEND i_contents_txt.
DESCRIBE TABLE i_contents_txt LINES tab_lines.
READ TABLE i_contents_txt INDEX tab_lines.
w_doc_data-doc_size = ( tab_lines - 1 ) * 255 + strlen( i_contents_txt ).
********count lines by man context*************
CLEAR i_packing_list-transf_bin.
i_packing_list-transf_bin = space. "ASCII format/binary format
i_packing_list-head_start = 1.
i_packing_list-head_num = 0.
i_packing_list-body_start = 1.
i_packing_list-body_num = tab_lines.
i_packing_list-doc_type = 'RAW'.
APPEND i_packing_list.
ENDFORM. " DEFINE_MAIL_HEADER
FORM define_mail_attachment .
CONCATENATE lv_string
'物料描述' gc_tab
'物料组' gc_tab
'工厂' gc_tab
'库存描述' gc_tab
'批次' gc_tab
'非限制库存数量' gc_tab
'冻结库存数量' gc_tab
'质检库存数量' gc_tab
'单位' gc_tab
'保质期(天)' gc_tab
'货龄天数' gc_tab
'距离失效天数' gc_crlf
INTO lv_string.
IF matnr[] IS NOT INITIAL.
SELECT * FROM zmm028 INTO TABLE @DATA(lt_zmm028).
SORT lt_zmm028 BY matnr.
ENDIF.
LOOP AT gt_data INTO gs_data .
"增加前导零
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = gs_data-matnr
IMPORTING
output = gs_data-matnr.
IF matnr[] IS INITIAL.
CASE gs_data-extwg.
WHEN '101' OR '103' OR '104' OR '106' OR '107' OR '190'.
CHECK gs_data-hlts > 7.
WHEN '102'."3
CHECK gs_data-hlts > 3.
WHEN '105'."30
CHECK gs_data-hlts > 30.
WHEN OTHERS.
CONTINUE.
ENDCASE.
ELSE.
READ TABLE lt_zmm028 INTO DATA(ls_zmm028)
WITH KEY matnr = gs_data-matnr .
IF sy-subrc NE 0.
CONTINUE.
ELSE.
CHECK gs_data-hlts >= ls_zmm028-zday.
ENDIF.
ENDIF.
"去除前导零
CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
EXPORTING
input = gs_data-matnr
IMPORTING
output = gs_data-matnr.
lv_string = lv_string &&
gs_data-maktx && gc_tab &&
gs_data-ewbez && gc_tab &&
gs_data-werks && gc_tab &&
gs_data-lgobe && gc_tab &&
gs_data-charg && gc_tab &&
gs_data-clabs && gc_tab &&
gs_data-cspem && gc_tab &&
gs_data-cinsm && gc_tab &&
gs_data-meins && gc_tab &&
gs_data-mhdhb && gc_tab &&
gs_data-hlts && gc_tab &&
gs_data-sxts && gc_crlf.
ENDLOOP.
* Convert string to xstring type
* 'APPLICATION/MSEXCEL;charset=utf-16le'
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
EXPORTING
text = lv_string
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 = i_contents_hex.
***set attachment name, count size*******************
DESCRIBE TABLE gt_data LINES tab_lines.
tab_lines = tab_lines .
i_packing_list-transf_bin = 'X'.
i_packing_list-head_start = 1.
i_packing_list-head_num = 0.
i_packing_list-body_start = 1.
i_packing_list-body_num = tab_lines.
i_packing_list-doc_type = 'XLS'.
i_packing_list-obj_name = 'ATTACHMENT'.
i_packing_list-obj_descr = 'Finished Stock'. "成品库存货龄表 修改为英文
i_packing_list-doc_size = tab_lines * 255.
APPEND i_packing_list.
ENDFORM. " DEFINE_MAIL_ATTACHMENT
FORM get_receivers .
* Add the recipients email address
CLEAR i_receivers.
REFRESH i_receivers.
* SELECT * FROM zszmail.
LOOP AT i_sendmail.
* I_RECEIVERS-RECEIVER = 'pandeng@wlspjt.com'."Email Address
i_receivers-receiver = i_sendmail-receiver.
i_receivers-rec_type = 'U'. "Internet address
i_receivers-notif_read = ''.
i_receivers-com_type = 'INT'.
i_receivers-notif_del = ''.
i_receivers-notif_ndel = ''.
APPEND i_receivers.
ENDLOOP.
* ENDSELECT.
ENDFORM. " GET_RECEIVERS
FORM send_email_message.
DATA: w_subrc LIKE sy-subrc.
* Call the FM to post the message to SAPMAIL
CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
EXPORTING
document_data = w_doc_data "Attributes of new document
put_in_outbox = 'X' "Flag: Move document to outbox after send
commit_work = 'X' "An explicit COMMIT WORK is to be set
IMPORTING
sent_to_all = w_sent_all
TABLES
packing_list = i_packing_list "Information about structure of data tables
object_header = i_object_header
contents_hex = i_contents_hex
contents_txt = i_contents_txt "ASCII contents of object and attachments
receivers = i_receivers "Document recipients with send attributes
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.
w_subrc = sy-subrc.
WAIT UP TO 2 SECONDS.
IF w_subrc EQ 0.
SUBMIT rsconn01 WITH mode = 'INT'
WITH output = space
AND RETURN.
ENDIF.
ENDFORM. " SEND_EMAIL_MESSAGE