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

 

posted @ 2020-08-03 09:19  年轻的小菜鸟  阅读(741)  评论(0编辑  收藏  举报