SAP发送邮件

发送邮件

事务代码: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>&nbsp;&nbsp;&nbsp;&nbsp;您好!</span></div><br>'.
  APPEND ls_body TO lt_body.
  CLEAR ls_body.
  ls_body-line = '<div><span>&nbsp;&nbsp;&nbsp;&nbsp;附件是XXXX接口异常清单,请查阅后尽快处理!</span></div><br>'.
  APPEND ls_body TO lt_body.
  CLEAR ls_body.
  ls_body-line = '<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</nspan>'.
  APPEND ls_body TO lt_body.
  CLEAR ls_body.
  ls_body-line = '<div><span>&nbsp;&nbsp;&nbsp;&nbsp;XXXXXXX有限公司 </span></div><br>'.
  APPEND ls_body TO lt_body.
  CLEAR ls_body.
  ls_body-line = '<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</nspan>'.
  CLEAR ls_body.
  ls_body-line = '<div><span>&nbsp;&nbsp;&nbsp;&nbsp;' && 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.

自定义结构:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值