发送邮件
事务代码:SBWP;SOST
"发送邮件参数定义
DATA: ls_sendemail TYPE zsxx_send_email01,
ls_receiver TYPE zsxx_receiver.
DATA: lt_to TYPE TABLE OF so_rec_ext,
ls_to TYPE so_rec_ext,
lt_body TYPE TABLE OF solisti1,
ls_body TYPE solisti1,
i_body LIKE solisti1 OCCURS 0 WITH HEADER LINE,
lt_meg TYPE TABLE OF bapiret2,
ls_attach TYPE zzs_attach,
ls_obj TYPE zzs_obj,
lt_obj TYPE TABLE OF zzs_obj.
DATA: lt_line TYPE ztts_lines.
DATA: lt_cs TYPE TABLE OF sysid,
ls_cs TYPE sysid.
DATA:lt_ztmm022_log TYPE TABLE OF ztmm022_log, "历史数据
ls_ztmm022_log TYPE ztmm022_log,
gt_ztmm022_log TYPE TABLE OF ztmm022_log, "更新自建表
gs_ztmm022_log TYPE ztmm022_log.
"生成excel附件
CLEAR lt_line.
PERFORM frm_to_excel TABLES lt_line.
"----附件处理
ls_obj-obj_descr = 'XXXX接口异常清单'.
ls_obj-doc_type = 'XLS'.
ls_obj-obj_name = 'XXXX接口异常清单'.
ls_obj-head_start = 1.
ls_obj-head_num = 1.
DESCRIBE TABLE ls_sendemail-attach-lines LINES ls_obj-body_start.
ls_obj-body_start = ls_obj-body_start + 1.
APPEND LINES OF lt_line TO ls_sendemail-attach-lines.
DESCRIBE TABLE ls_sendemail-attach-lines LINES ls_obj-body_num.
ls_obj-body_num = ls_obj-body_num + 1.
ls_obj-doc_size = ( ls_obj-body_num - ls_obj-body_start ) * 255.
ls_obj-obj_langu = sy-langu.
APPEND ls_obj TO lt_obj.
CLEAR ls_obj.
ls_sendemail-attach-obj_pro = lt_obj.
IF lt_line IS INITIAL.
EXIT .
ENDIF.
"----收件邮箱
SELECT * FROM ztmm022 INTO TABLE @DATA(lt_ztmm022) WHERE zsx = 'A'.
LOOP AT lt_ztmm022 INTO DATA(ls_ztmm022).
ls_to = ls_ztmm022-zemail.
APPEND ls_to TO lt_to.
CLEAR ls_to.
ENDLOOP.
ls_sendemail-to = lt_to.
"---邮件标题
ls_sendemail-subject = sy-datum(4) && '-' && sy-datum+4(2) && '-' && sy-datum+6(2) && ' -From ERP:XXXX接口异常提醒!'.
"---邮件内容
CLEAR: ls_body, lt_body[].
ls_body-line ='<div><span id="_FoxCURSOR"></span></div> '.
APPEND ls_body TO lt_body.
CLEAR ls_body.
ls_body-line ='<DIV>请知悉:</DIV><br>'.
APPEND ls_body TO lt_body.
CLEAR ls_body.
ls_body-line = '<div><span> 您好!</span></div><br>'.
APPEND ls_body TO lt_body.
CLEAR ls_body.
ls_body-line = '<div><span> 附件是XXXX接口异常清单,请查阅后尽快处理!</span></div><br>'.
APPEND ls_body TO lt_body.
CLEAR ls_body.
ls_body-line = '<span> </nspan>'.
APPEND ls_body TO lt_body.
CLEAR ls_body.
ls_body-line = '<div><span> XXXXXXX有限公司 </span></div><br>'.
APPEND ls_body TO lt_body.
CLEAR ls_body.
ls_body-line = '<span> </nspan>'.
CLEAR ls_body.
ls_body-line = '<div><span> ' && sy-datum(4) && '-' && sy-datum+4(2) && '-' && sy-datum+6(2) && '</span></div><br>'.
APPEND ls_body TO lt_body.
CLEAR ls_body.
ls_body-line = '<div>FISystem</div>'.
APPEND ls_body TO lt_body.
CLEAR ls_body.
ls_body-line = '<div>================================================================================</div>'.
APPEND ls_body TO lt_body.
CLEAR ls_body.
ls_body-line = '<div><span>本邮件为系统自动发送,请勿直接回复,谢谢!</span></div>'.
APPEND ls_body TO lt_body.
ls_sendemail-body = lt_body.
CALL FUNCTION 'ZXX_SEND_EMAIL01'
EXPORTING
i_sendemail = ls_sendemail
i_receiver = ls_receiver
TABLES
t_messages = lt_meg.
WAIT UP TO 2 SECONDS.
CLEAR: ls_sendemail,lt_obj,lt_to.
READ TABLE lt_meg TRANSPORTING NO FIELDS WITH KEY type = 'E'.
IF sy-subrc <> 0.
"发送成功
MESSAGE '邮件已生成,具体查看T-CODE:SBWP发件箱来查看邮件是否发送成功!' TYPE 'S'.
SELECT * FROM ztmm022_log
INTO CORRESPONDING FIELDS OF TABLE lt_ztmm022_log
FOR ALL ENTRIES IN gt_alv
WHERE matnr = gt_alv-matnr
AND ebeln = gt_alv-ebeln
AND ebelp = gt_alv-ebelp.
SORT lt_ztmm022_log BY matnr ebeln ebelp.
LOOP AT gt_alv INTO gs_alv.
MOVE-CORRESPONDING gs_alv TO gs_ztmm022_log.
gs_ztmm022_log-cdate = sy-datum.
READ TABLE lt_ztmm022_log INTO ls_ztmm022_log WITH KEY matnr = gs_alv-matnr
ebeln = gs_alv-ebeln
ebelp = gs_alv-ebelp
BINARY SEARCH.
IF sy-subrc = 0.
gs_ztmm022_log-zcs = ls_ztmm022_log-zcs + 1.
ELSE.
gs_ztmm022_log-zcs = '1'.
ENDIF.
APPEND gs_ztmm022_log TO gt_ztmm022_log.
CLEAR:gs_alv,gs_ztmm022_log,ls_ztmm022_log.
ENDLOOP.
MODIFY ztmm022_log FROM TABLE gt_ztmm022_log.
IF sy-subrc = 0.
COMMIT WORK AND WAIT.
ENDIF.
ELSE.
"发送失败
DATA:gv_msg TYPE char100.
LOOP AT lt_meg INTO DATA(ls_meg) WHERE type = 'E'.
CONCATENATE gv_msg ls_meg-message INTO gv_msg.
CLEAR ls_meg.
ENDLOOP.
MESSAGE gv_msg TYPE 'E'.
ENDIF.
FUNCTION ZXX_SEND_EMAIL01.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" REFERENCE(I_SENDEMAIL) TYPE ZSXX_SEND_EMAIL01
*" REFERENCE(I_RECEIVER) TYPE ZSXX_RECEIVER OPTIONAL
*" TABLES
*" T_MESSAGES STRUCTURE BAPIRET2
*"----------------------------------------------------------------------
TYPES: BEGIN OF sx_address, "SAPconnect general addr
type TYPE sxaddrtype-addr_type,
address TYPE soextreci1-receiver,
END OF sx_address.
DATA:lt_objpack TYPE TABLE OF sopcklsti1,
ls_objpack TYPE sopcklsti1.
DATA:lt_objhead TYPE TABLE OF solisti1,
ls_objhead TYPE solisti1.
DATA:lt_objbin TYPE TABLE OF solisti1,
ls_objbin TYPE solisti1.
DATA:lt_objhex TYPE STANDARD TABLE OF solix.
DATA:lt_objtxt TYPE TABLE OF solisti1,
ls_objtxt TYPE solisti1.
DATA:lt_reclist TYPE TABLE OF somlreci1,
ls_reclist TYPE somlreci1.
DATA:ls_doc_chng TYPE sodocchgi1.
DATA:l_tab_lines TYPE sy-tabix.
DATA:lt_table TYPE bcsy_text,
ls_table LIKE LINE OF lt_table.
DATA:ls_addr TYPE sx_address,
ls_to TYPE so_text255,
ls_receiver TYPE sysid,
ls_body TYPE so_text255,
ls_line TYPE so_text255,
lv_body_lines TYPE sy-tabix,
lv_xattach TYPE xstring.
*----------------------------------------------------------------------*
* 邮件收件人、邮件主题验证
*----------------------------------------------------------------------*
IF i_sendemail-to[] IS INITIAL.
CLEAR t_messages.
t_messages-type = 'E'.
t_messages-message = '收件人地址不能为空!'.
APPEND t_messages.
EXIT.
ENDIF.
IF i_sendemail-subject IS INITIAL.
CLEAR t_messages.
t_messages-type = 'E'.
t_messages-message = '邮件标题不能为空!'.
APPEND t_messages.
EXIT.
ENDIF.
*----------------------------------------------------------------------*
* 检查收件人邮箱正确性
*----------------------------------------------------------------------*
LOOP AT i_sendemail-to INTO ls_to.
CLEAR: ls_addr.
ls_addr-type = 'INT'.
ls_addr-address = ls_to.
*--邮箱地址验证
CALL FUNCTION 'SX_INTERNET_ADDRESS_TO_NORMAL'
EXPORTING
address_unstruct = ls_addr
EXCEPTIONS
error_address_type = 1
error_address = 2
error_group_address = 3
OTHERS = 4.
IF sy-subrc <> 0.
CLEAR t_messages.
t_messages-type = 'E'.
t_messages-message = '邮件地址:' && ls_addr-address && '不符合规范,请检查!'.
APPEND t_messages.
CONTINUE.
ENDIF.
"添加邮件收件人清单
ls_reclist-receiver = ls_to.
ls_reclist-rec_type = 'U'.
APPEND ls_reclist TO lt_reclist.
ENDLOOP.
LOOP AT i_receiver-email INTO ls_receiver.
"添加邮件抄送人清单
ls_reclist-receiver = ls_receiver. "'xxxxx@QQ.COM'.
ls_reclist-copy = 'X'.
ls_reclist-rec_type = 'U'.
APPEND ls_reclist TO lt_reclist.
ENDLOOP.
*----------------------------------------------------------------------*
* 邮件发送
*----------------------------------------------------------------------*
*--邮件内容-BODY
LOOP AT i_sendemail-body INTO ls_body.
ls_objtxt-line = ls_body.
APPEND ls_objtxt TO lt_objtxt[].
ENDLOOP.
DESCRIBE TABLE lt_objtxt LINES lv_body_lines.
"BODY
CLEAR ls_objpack.
ls_objpack-transf_bin = ''.
ls_objpack-head_start = 1.
ls_objpack-head_num = 0.
ls_objpack-body_start = 1.
ls_objpack-body_num = lv_body_lines.
ls_objpack-obj_descr = i_sendemail-subject.
* ls_objpack-doc_type = 'RAW'.
ls_objpack-doc_type = 'HTML'.
ls_objpack-doc_size = lv_body_lines * 255.
APPEND ls_objpack TO lt_objpack.
"附件
IF i_sendemail-attach IS NOT INITIAL.
"附件内容
lt_objhex = i_sendemail-attach-lines.
DATA ls_obj_pro TYPE zzs_obj.
LOOP AT i_sendemail-attach-obj_pro INTO ls_obj_pro.
CLEAR ls_objpack.
ls_objpack-transf_bin = 'X'.
ls_objpack-head_start = ls_obj_pro-head_start.
ls_objpack-head_num = ls_obj_pro-head_num.
ls_objpack-body_start = ls_obj_pro-body_start.
ls_objpack-body_num = ls_obj_pro-body_num.
ls_objpack-obj_descr = ls_obj_pro-obj_descr. "附件描述
ls_objpack-doc_type = ls_obj_pro-doc_type. "附件类型
ls_objpack-obj_name = ls_obj_pro-obj_name. "附件名字
ls_objpack-doc_size = ls_obj_pro-doc_size.
ls_objpack-obj_langu = ls_obj_pro-obj_langu.
APPEND ls_objpack TO lt_objpack.
CLEAR ls_obj_pro.
ENDLOOP.
* CLEAR ls_objpack.
* ls_objpack-transf_bin = 'X'.
* ls_objpack-head_start = 1.
* ls_objpack-head_num = 1.
* ls_objpack-body_start = 1.
* DESCRIBE TABLE lt_objhex LINES ls_objpack-body_num.
* ls_objpack-obj_descr = i_sendemail-attach-obj_descr. "附件描述
* ls_objpack-doc_type = i_sendemail-attach-doc_type. "附件类型
* ls_objpack-obj_name = i_sendemail-attach-obj_name. "附件名字
* ls_objpack-doc_size = ls_objpack-body_num * 255.
* ls_objpack-obj_langu = sy-langu.
* APPEND ls_objpack TO lt_objpack.
ENDIF.
*--主题
ls_doc_chng-obj_descr = i_sendemail-subject.
READ TABLE i_sendemail-body INTO ls_body INDEX lv_body_lines.
ls_doc_chng-doc_size = ( lv_body_lines - 1 ) * 255 + strlen( ls_body ).
*--发送邮件
CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
EXPORTING
document_data = ls_doc_chng
put_in_outbox = 'X'
commit_work = 'X'
TABLES
packing_list = lt_objpack
object_header = lt_objhead
contents_txt = lt_objtxt "邮件内容
contents_bin = lt_objbin "附件内容
contents_hex = lt_objhex
receivers = lt_reclist "邮件接收者
EXCEPTIONS
too_many_receivers = 1
document_not_sent = 2
operation_no_authorization = 4
OTHERS = 99.
IF sy-subrc <> 0.
CLEAR t_messages.
t_messages-type = sy-msgty.
t_messages-id = sy-msgid.
t_messages-number = sy-msgno.
t_messages-message_v1 = sy-msgv1.
t_messages-message_v2 = sy-msgv2.
t_messages-message_v3 = sy-msgv3.
t_messages-message_v4 = sy-msgv4.
APPEND t_messages.
ELSE.
WAIT UP TO 2 SECONDS.
"This program starts the SAPconnect send process.
SUBMIT RSCONN01 WITH MODE = 'INT'
* WITH OUTPUT = 'X'
AND RETURN.
ENDIF.
ENDFUNCTION.
自定义结构: