程序所需 CLASS 和 FM

CLASS

  • CL_BCS:发送邮件的主要功能类,创建发送请求,添加发送内容,添加发送人等,最后发送指令的发出
  • CL_DOCUMENT_BCS:该类的主要功能是存放邮件发送的内容
  • CX_BCS:异常类,捕捉发送邮件过程中出现的异常

Function Module

  • SO_DOCUMENT_SEND_API1
  • SO_NEW_DOCUMENT_ATT_SEND_API1
  • SO_NEW_DOCUMENT_SEND_API1

示例程序

*&---------------------------------------------------------------------*
*& Report  ZZ_SEND_EMAIL
*&---------------------------------------------------------------------*

REPORT  zz_send_email.
DATA:send_request TYPE REF TO cl_bcs VALUE IS INITIAL.
DATA:sender TYPE REF TO if_sender_bcs VALUE IS INITIAL,
     uname TYPE sy-uname.
DATA:recipient TYPE REF TO if_recipient_bcs VALUE IS INITIAL,
     email TYPE string.
DATA:document TYPE REF TO cl_document_bcs VALUE IS INITIAL,
     subject TYPE so_obj_des,
     lt_text TYPE soli_tab,
     ls_text LIKE LINE OF lt_text,
     file_size_char  TYPE so_obj_len.
DATA:filepath   TYPE string,
     path       TYPE string,
     attachment_len TYPE i,
     attachment_hex TYPE solix_tab.
DATA:send_result TYPE os_boolean,
     excep_error TYPE REF TO cx_bcs.
TRY.
    " 创建发送请求 "
    send_request = cl_bcs=>create_persistent( ).
    " 发件人 "
    uname  = sy-uname.
    sender = cl_sapuser_bcs=>create( uname ).
    send_request->set_sender( sender ).
    " 收件人 "
    LOOP AT lt_mailaccept.
      CLEAR: email,recipient.
      CONCATENATE lt_mailaccept-name '@XXXXX.COM' INTO email.
      TRANSLATE email TO LOWER CASE.
      recipient = cl_cam_address_bcs=>create_internet_address( email ).
      CALL METHOD send_request->add_recipient
        EXPORTING
          i_recipient  = recipient
          i_express    = 'X'
          i_copy       = ' '
          i_blind_copy = ' '
          i_no_forward = ' '.
    ENDLOOP.
    " 抄送人 "
    LOOP AT lt_mailaccept_copy.
      CLEAR: email,recipient.
      CONCATENATE lt_mailaccept_copy-name '@XXXXX' INTO email.
      TRANSLATE email TO LOWER CASE.
      recipient = cl_cam_address_bcs=>create_internet_address( email ).
      CALL METHOD send_request->add_recipient
        EXPORTING
          i_recipient  = recipient
          i_express    = 'X'
          i_copy       = 'X'
          i_blind_copy = ' '
          i_no_forward = ' '.
    ENDLOOP.
    " 增加发送内容到发送请求 "
    ls_text-line = 'Email body context'.
    APPEND ls_text TO lt_text.
    CLEAR ls_text.
    CREATE OBJECT document.
    document = cl_document_bcs=>create_document(
                 i_type  = 'RAW'        " Type of document "
                 i_subject = subject    " Email subject "
                 i_length  = file_size_char  " File size "
                 i_text  = lt_text      " Email body internal table "
                 i_importance = '1'     " Email Document priority "
    ).
    send_request->set_document( document ).
     " 添加附件 "
    CALL METHOD cl_gui_frontend_services=>gui_upload
      EXPORTING
        filename   = filepath
        filetype   = 'BIN'
      IMPORTING
        filelength = attachment_len
      CHANGING
        data_tab   = attachment_hex.
    DO.
      SPLIT filepath AT '\' INTO path filepath.
      SEARCH filepath FOR '\'.
      IF sy-subrc <> 0.
        EXIT.
      ENDIF.
    ENDDO.
    subject = filepath.
    file_size_char = attachment_len.
    CALL METHOD document->add_attachment(
      EXPORTING
        i_attachment_type    = 'BIN'
        i_attachment_subject = subject         "附件名称"
        i_attachment_size    = file_size_char  "附件大小"
        i_att_content_hex     = attachment_hex "附件内容"
    ). 
    " 立即发送 "
    send_request->set_send_immediately( 'X' ).
    send_request->send_request->set_link_to_outbox( 'X' ).
    " 发送 "
    CALL METHOD send_request->send
      EXPORTING
        i_with_error_screen = 'X'
      RECEIVING
        result              = send_result.
  CATCH cx_bcs INTO excep_error.
ENDTRY.
IF send_result = 'X'.
  COMMIT WORK AND WAIT.
  WRITE :/ 'Mail sent successfully'.
ELSE.
  ROLLBACK WORK.
  WRITE :/ 'Mail sent fail'.
ENDIF.

相关链接