SEND EMAIL SO_DOCUMENT_SEND_API1

FUNCTION zcrm_send_email_and_attach .
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(IV_TITLE) TYPE  STRING OPTIONAL
*"     VALUE(IV_HEADER) TYPE  STRING OPTIONAL
*"     VALUE(IV_BODY) TYPE  STRING OPTIONAL
*"     VALUE(IT_TABLE) TYPE  ANY TABLE OPTIONAL
*"  EXPORTING
*"     VALUE(ES_ZCRMS_MESSAGE) TYPE  ZCRMS_MESSAGE
*"  TABLES
*"      IT_RECLIST STRUCTURE  SOMLRECI1 OPTIONAL
*"----------------------------------------------------------------------
***数据定义
  FIELD-SYMBOLS:
    <fs_comp>  TYPE abap_compdescr,
    <fs_value> TYPE any,
    <fs_line>  TYPE any,
    <fs_col>   TYPE any.
***fill_text
  CLEAR:gs_solisti1.
  REFRESH:gt_solisti1.
  gs_solisti1 = '<head>'.
  APPEND gs_solisti1 TO gt_solisti1.
  gs_solisti1 = '</head>'.
  APPEND gs_solisti1 TO gt_solisti1.
  gs_solisti1 = '<body>'.
  APPEND gs_solisti1 TO gt_solisti1.
  IF iv_header IS NOT INITIAL.
    CONCATENATE '<h3>' iv_header '</h3>' INTO gs_solisti1.
    APPEND gs_solisti1 TO gt_solisti1.
  ENDIF.
  gs_solisti1 = '<table border="0">'.
  APPEND gs_solisti1 TO gt_solisti1.
  IF iv_body IS NOT INITIAL.
    gs_solisti1 = '<tr>'.
    APPEND gs_solisti1 TO gt_solisti1.
    gs_solisti1 = iv_body.
    APPEND gs_solisti1 TO gt_solisti1.
    gs_solisti1 = '</tr>'.
    APPEND gs_solisti1 TO gt_solisti1.
  ENDIF.
  gs_solisti1 = '<table border="1">'.
  APPEND gs_solisti1 TO gt_solisti1.
  gs_solisti1 = '<tr>'.
  APPEND gs_solisti1 TO gt_solisti1.

  REFRESH:gt_dd03t,gt_ddfields.
  CLEAR:gv_tablesize,gv_check.
  IF it_table IS NOT INITIAL.
    LOOP AT it_table ASSIGNING <gs_line>.
      gr_cl_abap_structdescr ?= cl_abap_typedescr=>describe_by_data( <gs_line> ).
*表头
      IF gt_ddfields[] IS INITIAL.
        CALL METHOD gr_cl_abap_structdescr->get_ddic_field_list
          EXPORTING
            p_langu      = sy-langu
          RECEIVING
            p_field_list = gt_ddfields
          EXCEPTIONS
            not_found    = 1
            no_ddic_type = 2
            OTHERS       = 3.
        IF sy-subrc <> 0.
*       Implement suitable error handling here
        ENDIF.
      ENDIF.
      IF gv_check = abap_false.
        CLEAR:gs_solisti1.
        LOOP AT gt_ddfields INTO gs_ddfields.
          IF gs_solisti1 IS INITIAL.
            CONCATENATE '<td>' gs_ddfields-fieldtext '</td>' INTO gs_solisti1.
          ELSE.
            CONCATENATE gs_solisti1 '<td>' gs_ddfields-fieldtext '</td>' INTO gs_solisti1.
          ENDIF.
          gv_check = abap_true.
          gv_tablesize = gv_tablesize + gs_ddfields-leng.
        ENDLOOP.
        APPEND gs_solisti1 TO gt_solisti1.
      ENDIF.
*表内容
      gs_solisti1 = '<tr>'.
      LOOP AT gr_cl_abap_structdescr->components ASSIGNING <fs_comp>.
        ASSIGN <fs_comp>-name TO <fs_col>.
        ASSIGN COMPONENT <fs_col> OF STRUCTURE <gs_line> TO <gs_field>.
        WRITE <gs_field> TO gv_field.
        CONCATENATE gs_solisti1 '<td >' gv_field '</td> ' INTO gs_solisti1.
      ENDLOOP.
      APPEND gs_solisti1 TO gt_solisti1.
      gs_solisti1 = '</tr>'.
      APPEND gs_solisti1 TO gt_solisti1.
    ENDLOOP.
  ENDIF.
  gs_solisti1 = '</table>'.
  APPEND gs_solisti1 TO gt_solisti1.
  gs_solisti1 = '</table>'.
  APPEND gs_solisti1 TO gt_solisti1.
***fill_object_details
  CLEAR:gv_strlen.
  DESCRIBE TABLE gt_solisti1 LINES gv_strlen.
  READ TABLE gt_solisti1 INTO gs_solisti1 INDEX gv_strlen.
  CLEAR:gs_sodocchgi1.
  REFRESH:gt_sopcklsti1.
  gs_sodocchgi1-obj_name = 'SAPCRM'.
  gs_sodocchgi1-obj_descr = iv_title.
  gs_sodocchgi1-sensitivty = 'F'.
  gs_sodocchgi1-obj_langu = sy-langu.
  gs_sodocchgi1-doc_size = ( gv_strlen - 1 ) * 255 + strlen( gs_solisti1 ).
  CLEAR gs_sopcklsti1-transf_bin.
  gs_sopcklsti1-head_start = 1.
  gs_sopcklsti1-head_num = 0.
  gs_sopcklsti1-body_start = 1.
  gs_sopcklsti1-body_num = gv_strlen.
  gs_sopcklsti1-doc_type = 'HTM'.
  APPEND gs_sopcklsti1 TO gt_sopcklsti1.
****Define Attachment
****EXCEL附加抬头
  CLEAR:gv_string,gv_lines,gv_number.
  DESCRIBE TABLE gt_ddfields LINES gv_lines.
  LOOP AT gt_ddfields INTO gs_ddfields.
    gv_number = gv_number + 1.
    IF gv_lines = gv_number.
      CONCATENATE gv_string  gs_ddfields-fieldtext gc_crlf INTO gv_string.
    ELSE.
      IF gv_string IS INITIAL.
        CONCATENATE gs_ddfields-fieldtext gc_tab INTO gv_string.
      ELSE.
        CONCATENATE gv_string  gs_ddfields-fieldtext gc_tab INTO gv_string.
      ENDIF.
    ENDIF.
  ENDLOOP.
****EXCEL附加内容
  LOOP AT it_table ASSIGNING <gs_line>.
    gr_cl_abap_structdescr ?= cl_abap_typedescr=>describe_by_data( <gs_line> ).
    CLEAR:gv_number.
    LOOP AT gr_cl_abap_structdescr->components ASSIGNING <fs_comp>.
      gv_number = gv_number + 1.
      ASSIGN <fs_comp>-name TO <fs_col>.
      ASSIGN COMPONENT <fs_col> OF STRUCTURE <gs_line> TO <gs_field>.
      WRITE <gs_field> TO gv_field.
      IF gv_lines = gv_number.
        CONCATENATE gv_string gv_field gc_crlf INTO gv_string.
      ELSE.
        CONCATENATE gv_string gv_field gc_tab INTO gv_string.
      ENDIF.
    ENDLOOP.
  ENDLOOP.
* Convert string to xstring type
* 'APPLICATION/MSEXCEL;charset=utf-16le'
  CLEAR:gv_xstring.
  CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
    EXPORTING
      text     = gv_string
      mimetype = gc_mimetype
    IMPORTING
      buffer   = gv_xstring
    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
    gv_xstring INTO gv_xstring IN BYTE MODE.
  ENDIF.

  CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
    EXPORTING
      buffer     = gv_xstring
    TABLES
      binary_tab = gt_solix.

***计算附件大小分配空间*******************
  DESCRIBE TABLE it_table LINES gv_lines.
  gv_lines = gv_lines * 2.
  gs_sopcklsti1-transf_bin = 'X'.
  gs_sopcklsti1-head_start = 1.
  gs_sopcklsti1-head_num   = 0.
  gs_sopcklsti1-body_start = 1.
  gs_sopcklsti1-body_num = gv_lines + 1.
  gs_sopcklsti1-doc_type = 'xls'.
  gs_sopcklsti1-obj_name   = 'ATTACHMENT'.
  gs_sopcklsti1-obj_descr  = iv_title.
  gs_sopcklsti1-doc_size =  gs_sopcklsti1-body_num * gv_tablesize * gv_lines  .
*gv_tablesize
  APPEND gs_sopcklsti1 TO gt_sopcklsti1.

***SO_DOCUMENT_SEND_API1邮件函数
  CALL FUNCTION 'SO_DOCUMENT_SEND_API1'
    EXPORTING
      document_data              = gs_sodocchgi1
      put_in_outbox              = ''
      commit_work                = 'X'
    TABLES
      packing_list               = gt_sopcklsti1
*     OBJECT_HEADER              =
*     CONTENTS_BIN               =
      contents_txt               = gt_solisti1
      contents_hex               = gt_solix
*     OBJECT_PARA                =
*     OBJECT_PARB                =
      receivers                  = it_reclist
*     ET_VSI_ERROR               =
    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.
  IF sy-subrc = 0.
    es_zcrms_message-type = gc_s.
    es_zcrms_message-message = text-001."'Message sent successfully!'.
* Implement suitable error handling here
    "立即发送
    SUBMIT rsconn01 WITH mode = 'INT'
*                    with output = 'X'
    AND RETURN.
*    MESSAGE s001(00) WITH 'Message sent successfully!'.
  ELSE.
    es_zcrms_message-type = gc_e.
    es_zcrms_message-message =  text-002."'Message sent failure!'.
  ENDIF.
ENDFUNCTION.
原文地址:https://www.cnblogs.com/sapSB/p/6422972.html