zoukankan      html  css  js  c++  java
  • SAP 邮件发送

    此邮件发送为附件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

  • 相关阅读:
    Laravel路由除了根目录全报404错误
    jQuery源码分析之整体框架
    JS进阶系列之this
    JS进阶系列之原型、原型链
    原生JavaScript实现的贪吃蛇
    html文档流和事件流
    (转)mysql执行计划分析
    (转)重定向和转发区别
    el表达式取值优先级
    (转)性能测试基本指标
  • 原文地址:https://www.cnblogs.com/coderfarmer/p/13424482.html
Copyright © 2011-2022 走看看