SAP ABAP发邮件功能

总结

针对发送邮件内容封装公用函数,针对不同业务场景,比如邮件统计排名晾晒类,各类业务催办类知会类邮件等,实现AUTO MAIL自动触发邮件。

1. 邮件发送内容:正文,附件,超链接等等

1.1  正文可以是一般内容或表格明细清单,涉及到很多格式的设置,用HTML格式设置。

1.2  附件可以是DOC,  PDF ,EXCEL,JPG/PNG图片等等格式,附件以二进制流XSTRING类型

1.3  邮件中可设置超链接地址,比如用户催办邮件,用户点超链接,可以直接调整到待办单据页面。

2.  邮件发送监控

发送邮件tcode: scot   可以监控邮件发送状态及内容

如果系统中所有邮件发送不出去 跟BASIS排查系统问题;若单据功能发送不出,排查程序的问题。

相关事务代码:SO00,SCOT,SOST

  1. sost : 所有待发送的邮件清单,也可以监视邮件发送状态,也可以在此页面发送邮件!
  2. sbwp:发送邮件功能
  3. so01 :邮件/消息

如果没有接收到邮件,可以在这里查看邮件发送状态。邮件发送一般有延迟。黄灯表示在等待发送中。蓝灯发送成功。

SCOT管理->出站发送请求:

在这里配置邮件主机地址,节点等。比如公司切换邮箱服务商的时候,这里的邮箱地址需要重新配置,且根据公司网络信息安全要求需要申请新地址的网络测试或白名单申请,保证邮箱服务器节点网络是通的可以正常访问。

ABAP代码实现方式

1. OO方式CL_BCS类发送

1.1  标准cl_bcs类方式发送

   DATA: ls           TYPE string,
        mailto       TYPE ad_smtpadr,
        main_text    TYPE bcsy_text,
        title        TYPE so_obj_des,
        lv_sqfk_amt  TYPE char17,
        send_request TYPE REF TO cl_bcs,
        document     TYPE REF TO cl_document_bcs,
        fail         TYPE REF TO cx_bcs,
        recipient    TYPE REF TO if_recipient_bcs,
        lo_sender    TYPE REF TO if_sender_bcs,
        lv_sender    TYPE adr6-smtp_addr.

  TRY.
* 第一步: 创建发送请求
            send_request = cl_bcs=>create_persistent( ).
*第二步: 创建整理发送内容
            document = cl_document_bcs=>create_document(
            i_type = 'RAW'
            i_text = main_text
            i_subject = title ).
*第三步: 添加邮件内容到发送请求
            send_request->set_document( document ).

* 第四步: 邮件地址转换
            recipient = cl_cam_address_bcs=>create_internet_address( mailto ).
*第五步: 添加邮件地址到发送请求
            send_request->add_recipient( recipient ).

            "设置发件人
            "原来发件人是前端财务签收人员,收件人是付款申请人
            TRY .
                lo_sender = cl_sapuser_bcs=>create( |{ 'XXXX'}| ).
              CATCH cx_root.
            ENDTRY.
            send_request->set_sender( lo_sender ).

*第六步: 正式发送并提交作业
            send_request->set_send_immediately( 'X' ).
            send_request->send( i_with_error_screen = 'X' ).
            COMMIT WORK AND WAIT.
          CATCH cx_bcs INTO fail.
*   提醒邮件发送失败
            IF sy-tcode IS NOT INITIAL.
              MESSAGE '提醒邮件发送失败' TYPE 'E' DISPLAY LIKE 'S'.
            ENDIF.
        ENDTRY.

1.2 封装发送邮件的公用函数

1.SE37创建公用函数FUNCTION :ZFIFM_0164

2. Import 参数。

入参说明: 

IM_MAIL_CONTENTTYPESTRING                     邮件正文
IM_SUBJECTTYPESO_OBJ_DES                     邮件主题
IM_MAILTYPEBCSY_SMTPA                     主送邮件地址
IM_CCMAILTYPEBCSY_SMTPA                     抄送邮件地址
IM_CCMAIL_BLINDTYPEBCSY_SMTPA                     密抄送邮件地址
IM_SENDERTYPESYST_UNAME'ICP-NOTICE'邮件发送人
IM_OTFTYPETT_ITCOO                     附件PDF格式内表数据
IM_CONTENT_HEXTYPESOLIX_TAB                     附件EXCEL文件
IM_CONTENT_DOCTYPESOLIX_TAB                     附件WORD文件
IM_CONTENT_PNGTYPESOLIX_TAB                     附件图片文件
IT_EXPERTSTYPEZTTFI_GENERAL_RANGE                     Table type for general range table
IM_IMG_TOP_NAMETYPESTRING                     顶部图片
IM_IMG_BOTTOM_NAMETYPESTRING                     底部图片
IM_ATTACHMENT_SUBJECTTYPESO_OBJ_DES                     附件名称
IM_XSTRINGTYPEXSTRING                                                                                                    
IM_EXCEL_SIZETYPESO_OBJ_LEN                     EXCEL文档内容大小
IT_CONTENT_HEXTYPEZTEXCEL_FJ                     邮件附件表类型 
IM_XLSXTYPECHAR1                     附件格式XLSX

 EXCEPTION定义:

FUNCTION ZFIFM_0164.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(IM_MAIL_CONTENT) TYPE  STRING OPTIONAL
*"     VALUE(IM_SUBJECT) TYPE  SO_OBJ_DES OPTIONAL
*"     VALUE(IM_MAIL) TYPE  BCSY_SMTPA OPTIONAL
*"     VALUE(IM_CCMAIL) TYPE  BCSY_SMTPA OPTIONAL
*"     VALUE(IM_CCMAIL_BLIND) TYPE  BCSY_SMTPA OPTIONAL
*"     VALUE(IM_SENDER) TYPE  SYST_UNAME DEFAULT 'ICP-NOTICE'
*"     VALUE(IM_OTF) TYPE  TT_ITCOO OPTIONAL
*"     VALUE(IM_CONTENT_HEX) TYPE  SOLIX_TAB OPTIONAL
*"     VALUE(IM_CONTENT_DOC) TYPE  SOLIX_TAB OPTIONAL
*"     VALUE(IM_CONTENT_PNG) TYPE  SOLIX_TAB OPTIONAL
*"     REFERENCE(IT_EXPERTS) TYPE  ZTTFI_GENERAL_RANGE OPTIONAL
*"     VALUE(IM_IMG_TOP_NAME) TYPE  STRING OPTIONAL
*"     VALUE(IM_IMG_BOTTOM_NAME) TYPE  STRING OPTIONAL
*"     VALUE(IM_ATTACHMENT_SUBJECT) TYPE  SO_OBJ_DES OPTIONAL
*"     VALUE(IM_XSTRING) TYPE  XSTRING OPTIONAL
*"     VALUE(IM_EXCEL_SIZE) TYPE  SO_OBJ_LEN OPTIONAL
*"     VALUE(IT_CONTENT_HEX) TYPE  ZTEXCEL_FJ OPTIONAL
*"     VALUE(IM_XLSX) TYPE  CHAR1 OPTIONAL
*"  RAISING
*"      CX_SEND_REQ_BCS
*"----------------------------------------------------------------------
  DATA : LT_MAIL_BODY       TYPE SOLI_TAB,
         LO_CX_SEND_REQ_BCS TYPE REF TO CX_SEND_REQ_BCS,
         LO_EMAIL_BODY      TYPE REF TO CL_DOCUMENT_BCS,
         LO_RECEIVER        TYPE REF TO CL_CAM_ADDRESS_BCS,
         LO_EMAIL           TYPE REF TO CL_BCS,
         LO_SENDER          TYPE REF TO CL_SAPUSER_BCS,
         L_SEND_RESULT      TYPE OS_BOOLEAN,
         COS_MAIL           TYPE C LENGTH 10 VALUE '@XXXX.com',
         COS_MAIL_HZ        TYPE C LENGTH 10 VALUE '@'.

**  设置签名相关变量
  DATA: L_LEN          TYPE SO_OBJ_LEN,
        LT_SOLIX       TYPE SOLIX_TAB,
        LV_IS_FOLDER   TYPE BOOLE_D,
        LV_CONTENT     TYPE XSTRING,
        LV_LOIO        TYPE SKWF_IO,
        LO_MR_API      TYPE REF TO IF_MR_API,
        LO_CONVERT     TYPE REF TO CL_BCS_CONVERT,
        LO_MIME_HELPER TYPE REF TO CL_GBT_MULTIRELATED_SERVICE.

**  邮件正文转换
  CALL FUNCTION 'CONVERT_STRING_TO_TAB'
    EXPORTING
      I_STRING         = IM_MAIL_CONTENT
      I_TABLINE_LENGTH = 255
    TABLES
      ET_TABLE         = LT_MAIL_BODY. "

**  设置集团 LOGO 签名
  IF LO_MR_API IS INITIAL.
    LO_MR_API = CL_MIME_REPOSITORY_API=>IF_MR_API~GET_API( ).

  ENDIF.

  CALL METHOD LO_MR_API->GET
    EXPORTING
      I_URL              = '/SAP/PUBLIC/XXXXLogo4Mail.png'
    IMPORTING
      E_IS_FOLDER        = LV_IS_FOLDER
      E_CONTENT          = LV_CONTENT
      E_LOIO             = LV_LOIO
    EXCEPTIONS
      PARAMETER_MISSING  = 1
      ERROR_OCCURED      = 2
      NOT_FOUND          = 3
      PERMISSION_FAILURE = 4
      OTHERS             = 5.

  L_LEN = XSTRLEN( LV_CONTENT ).

  CREATE OBJECT LO_CONVERT.

  CALL METHOD LO_CONVERT->XSTRING_TO_SOLIX
    EXPORTING
      IV_XSTRING = LV_CONTENT
    RECEIVING
      ET_SOLIX   = LT_SOLIX.

  CREATE OBJECT LO_MIME_HELPER.

  CALL METHOD LO_MIME_HELPER->ADD_BINARY_PART
    EXPORTING
      CONTENT      = LT_SOLIX
      FILENAME     = 'XXXX.jpg'
      EXTENSION    = 'JPG'
      DESCRIPTION  = 'descriptiongif'
      CONTENT_TYPE = 'image/jpg'
      LENGTH       = L_LEN
      CONTENT_ID   = 'XXXX.jpg'.
  CALL METHOD LO_MIME_HELPER->SET_MAIN_HTML
    EXPORTING
      CONTENT     = LT_MAIL_BODY
      FILENAME    = 'XXXX' "'xx'
      DESCRIPTION = 'yy'.


  IF IM_IMG_TOP_NAME IS NOT INITIAL.


    CALL METHOD LO_MR_API->GET
      EXPORTING
*       i_url              = '/SAP/PUBLIC/ZPO/ZAI_HED_EMIAL.PNG' "ZAI_BOTTOM_EMIAL
        I_URL              = '/SAP/PUBLIC/ZPO/' && IM_IMG_TOP_NAME "ZAI_BOTTOM_EMIAL
      IMPORTING
        E_IS_FOLDER        = LV_IS_FOLDER
        E_CONTENT          = LV_CONTENT
        E_LOIO             = LV_LOIO
      EXCEPTIONS
        PARAMETER_MISSING  = 1
        ERROR_OCCURED      = 2
        NOT_FOUND          = 3
        PERMISSION_FAILURE = 4
        OTHERS             = 5.

    L_LEN = XSTRLEN( LV_CONTENT ).

    CREATE OBJECT LO_CONVERT.

    CALL METHOD LO_CONVERT->XSTRING_TO_SOLIX
      EXPORTING
        IV_XSTRING = LV_CONTENT
      RECEIVING
        ET_SOLIX   = LT_SOLIX.

    CALL METHOD LO_MIME_HELPER->ADD_BINARY_PART
      EXPORTING
        CONTENT      = LT_SOLIX
*       filename     = 'ZAI_HED_EMIAL.PNG'
        FILENAME     = |{ IM_IMG_TOP_NAME }|
        EXTENSION    = 'PNG'
        DESCRIPTION  = 'descriptiongif'
        CONTENT_TYPE = 'image/png'
        LENGTH       = L_LEN
*       content_id   = 'ZAI_HED_EMIAL.PNG'.
        CONTENT_ID   = |{ IM_IMG_TOP_NAME }|.

  ENDIF.

  IF IM_IMG_BOTTOM_NAME IS NOT INITIAL.

    CLEAR :LV_IS_FOLDER,LV_CONTENT,LV_LOIO,L_LEN,LO_CONVERT,LT_SOLIX[].
    CALL METHOD LO_MR_API->GET
      EXPORTING
*       i_url              = '/SAP/PUBLIC/ZPO/ZAI_BOTTOM_EMIAL.PNG' "ZAI_BOTTOM_EMIAL
        I_URL              = '/SAP/PUBLIC/ZPO/' && IM_IMG_BOTTOM_NAME "ZAI_BOTTOM_EMIAL
      IMPORTING
        E_IS_FOLDER        = LV_IS_FOLDER
        E_CONTENT          = LV_CONTENT
        E_LOIO             = LV_LOIO
      EXCEPTIONS
        PARAMETER_MISSING  = 1
        ERROR_OCCURED      = 2
        NOT_FOUND          = 3
        PERMISSION_FAILURE = 4
        OTHERS             = 5.

    L_LEN = XSTRLEN( LV_CONTENT ).

    CREATE OBJECT LO_CONVERT.

    CALL METHOD LO_CONVERT->XSTRING_TO_SOLIX
      EXPORTING
        IV_XSTRING = LV_CONTENT
      RECEIVING
        ET_SOLIX   = LT_SOLIX.

*    CREATE OBJECT lo_mime_helper.

    CALL METHOD LO_MIME_HELPER->ADD_BINARY_PART
      EXPORTING
        CONTENT      = LT_SOLIX
*       filename     = 'ZAI_BOTTOM_EMIAL.PNG'
        FILENAME     = |{ IM_IMG_BOTTOM_NAME }|
        EXTENSION    = 'PNG'
        DESCRIPTION  = 'descriptiongif2'
        CONTENT_TYPE = 'image/png'
        LENGTH       = L_LEN
        CONTENT_ID   = |{ IM_IMG_BOTTOM_NAME }|.

  ENDIF.


  TRY.
      CALL METHOD CL_DOCUMENT_BCS=>CREATE_FROM_MULTIRELATED
        EXPORTING
          I_SUBJECT          = IM_SUBJECT
          I_MULTIREL_SERVICE = LO_MIME_HELPER
        RECEIVING
          RESULT             = LO_EMAIL_BODY.
    CATCH CX_DOCUMENT_BCS .
      MESSAGE E672(SO) WITH 'bcs error while creating bcs_doc'.
      EXIT.
    CATCH CX_BCOM_MIME .
      MESSAGE E672(SO) WITH 'mime error while creating bcs_doc'.
      EXIT.
    CATCH CX_GBT_MIME.

  ENDTRY.
*START-OF-MODIFICATION-ON 24.07.2017 15:28:09 ------------------------------*
*Description:发送XLS附件功能
  DATA:LT_CONTENTS  TYPE TABLE OF SOLIX.
  DATA:LT_CONTENTS_DOC  TYPE TABLE OF SOLIX.
  DATA:LT_CONTENTS_EXCEL  TYPE TABLE OF SOLIX.
  DATA:LV_PDF_SIZE  TYPE SO_OBJ_LEN.
  DATA:LV_DESCR     TYPE SO_OBJ_DES.
  DATA:LV_PDF       TYPE XSTRING.
  DATA:LV_SIZE      TYPE SO_OBJ_LEN.
  DATA:L_PDF_LEN    TYPE I,
       LT_PDF_LINES TYPE TABLE OF TLINE.
**附件PDF
  IF NOT IM_OTF[] IS INITIAL.
    CALL FUNCTION 'CONVERT_OTF'
      EXPORTING
        FORMAT                = 'PDF'
        MAX_LINEWIDTH         = 132
      IMPORTING
        BIN_FILESIZE          = L_PDF_LEN
        BIN_FILE              = LV_PDF        " BINARY FILE
      TABLES
        OTF                   = IM_OTF
        LINES                 = LT_PDF_LINES
      EXCEPTIONS
        ERR_MAX_LINEWIDTH     = 1
        ERR_FORMAT            = 2
        ERR_CONV_NOT_POSSIBLE = 3
        ERR_BAD_OTF           = 4
        OTHERS                = 5.
    IF SY-SUBRC = 0.
    ENDIF.

    LV_SIZE = XSTRLEN( LV_PDF ).
    LT_CONTENTS = CL_DOCUMENT_BCS=>XSTRING_TO_SOLIX( IP_XSTRING =  LV_PDF ).
    CONCATENATE IM_SUBJECT '.PDF' INTO LV_DESCR.
    TRY.
        CALL METHOD LO_EMAIL_BODY->ADD_ATTACHMENT(
            I_ATTACHMENT_TYPE    = 'PDF'
            I_ATT_CONTENT_HEX    = LT_CONTENTS
            I_ATTACHMENT_SIZE    = LV_SIZE
            I_ATTACHMENT_SUBJECT = LV_DESCR ).

      CATCH CX_DOCUMENT_BCS.

    ENDTRY.
  ENDIF.

  IF NOT IM_CONTENT_HEX[] IS INITIAL.
**附件XLS
*    APPEND LINES OF im_content_doc TO lt_contents_doc.
*    IF im_attachment_subject IS INITIAL.
*      CONCATENATE im_subject '.XLS' INTO lv_descr.
*    ELSE.
*      lv_descr = im_attachment_subject.
*    ENDIF.
*    TRY.
*        CALL METHOD lo_email_body->add_attachment(
*            i_attachment_type    = 'XLS'
*            i_att_content_hex    = lt_contents_doc
**           i_attachment_size    = lv_size
*            i_attachment_subject = lv_descr ).
*      CATCH cx_document_bcs.
*
*    ENDTRY.
    APPEND LINES OF IM_CONTENT_HEX TO LT_CONTENTS_EXCEL.
    IF IM_ATTACHMENT_SUBJECT IS INITIAL.
      IF IM_XLSX IS NOT INITIAL.
       CONCATENATE IM_SUBJECT '.XLSX' INTO LV_DESCR.
      ELSE.
       CONCATENATE IM_SUBJECT '.XLS' INTO LV_DESCR.
      ENDIF.
    ELSE.
      LV_DESCR = IM_ATTACHMENT_SUBJECT.
    ENDIF.
    IF IM_EXCEL_SIZE IS NOT INITIAL.
      LV_SIZE = IM_EXCEL_SIZE.
    ENDIF.
    TRY.
        CALL METHOD LO_EMAIL_BODY->ADD_ATTACHMENT(
            I_ATTACHMENT_TYPE    = 'BIN'
            I_ATT_CONTENT_HEX    = LT_CONTENTS_EXCEL
            I_ATTACHMENT_SIZE    = LV_SIZE
            I_ATTACHMENT_SUBJECT = LV_DESCR ).
      CATCH CX_DOCUMENT_BCS.

    ENDTRY.
  ENDIF.

  " 新增发送多个附件功能,按表传进来循环处理  
  LOOP AT  IT_CONTENT_HEX INTO DATA(LS_CONTENT_HEX).
    TRY.
        CALL METHOD LO_EMAIL_BODY->ADD_ATTACHMENT(
            I_ATTACHMENT_TYPE    = 'BIN'
            I_ATT_CONTENT_HEX    = LS_CONTENT_HEX-EXCEL
            I_ATTACHMENT_SIZE    = LS_CONTENT_HEX-SIZE
            I_ATTACHMENT_SUBJECT = LS_CONTENT_HEX-DESCR ).
      CATCH CX_DOCUMENT_BCS.

    ENDTRY.
  ENDLOOP.

  IF NOT IM_XSTRING IS INITIAL.
    CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
      EXPORTING
        BUFFER          = IM_XSTRING
        APPEND_TO_TABLE = ABAP_TRUE
      IMPORTING
        OUTPUT_LENGTH   = L_PDF_LEN
      TABLES
        BINARY_TAB      = LT_CONTENTS_DOC.
    IF IM_ATTACHMENT_SUBJECT IS INITIAL.
      CONCATENATE IM_SUBJECT '.XLSX' INTO LV_DESCR.
    ELSE.
      LV_DESCR = IM_ATTACHMENT_SUBJECT.
    ENDIF.
    TRY.
        CALL METHOD LO_EMAIL_BODY->ADD_ATTACHMENT(
            I_ATTACHMENT_TYPE    = 'BIN'
            I_ATT_CONTENT_HEX    = LT_CONTENTS_DOC
            I_ATTACHMENT_SIZE    = LV_SIZE
            I_ATTACHMENT_SUBJECT = LV_DESCR ).
      CATCH CX_DOCUMENT_BCS.

    ENDTRY.
  ENDIF.

  IF NOT IM_CONTENT_DOC[] IS INITIAL.
**附件DOC
    APPEND LINES OF IM_CONTENT_DOC TO LT_CONTENTS.
    CONCATENATE IM_SUBJECT '.DOC' INTO LV_DESCR.
    TRY.
        CALL METHOD LO_EMAIL_BODY->ADD_ATTACHMENT(
            I_ATTACHMENT_TYPE    = 'DOC'
            I_ATT_CONTENT_HEX    = LT_CONTENTS
*           i_attachment_size    = lv_size
            I_ATTACHMENT_SUBJECT = LV_DESCR ).
      CATCH CX_DOCUMENT_BCS.
    ENDTRY.
  ENDIF.

  IF NOT IM_CONTENT_PNG[] IS INITIAL.
**附件为图片
    APPEND LINES OF IM_CONTENT_PNG TO LT_CONTENTS.
    CONCATENATE IM_SUBJECT '.PNG' INTO LV_DESCR.
    TRY.
        CALL METHOD LO_EMAIL_BODY->ADD_ATTACHMENT(
            I_ATTACHMENT_TYPE    = 'PNG'
            I_ATT_CONTENT_HEX    = LT_CONTENTS
*           i_attachment_size    = lv_size
            I_ATTACHMENT_SUBJECT = LV_DESCR ).
      CATCH CX_DOCUMENT_BCS.
    ENDTRY.
  ENDIF.

  LO_EMAIL = CL_BCS=>CREATE_PERSISTENT( ).
  LO_EMAIL->SET_DOCUMENT( LO_EMAIL_BODY ).

** 主送邮件地址设置
  LOOP AT IM_MAIL INTO DATA(LS_MAIL).
**    检查是否有包含集团邮箱后缀 @XXXXX.com,没有则追加
    IF LS_MAIL NS COS_MAIL_HZ.
      LS_MAIL = LS_MAIL && COS_MAIL.
    ENDIF.

    TRY.
        LO_RECEIVER = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( LS_MAIL ).
        LO_EMAIL->ADD_RECIPIENT( I_RECIPIENT = LO_RECEIVER ).
      CATCH CX_ADDRESS_BCS.

    ENDTRY.

  ENDLOOP.

** 业务专家邮件地址设置
  LOOP AT IT_EXPERTS ASSIGNING FIELD-SYMBOL(<FS_EXP>).
**    检查是否有包含 集团邮箱后缀 @XXXXX.com,没有则追加
    IF <FS_EXP>-LOW NS COS_MAIL_HZ.
      LS_MAIL = <FS_EXP>-LOW && COS_MAIL.
    ENDIF.

    TRY.
        LO_RECEIVER = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( LS_MAIL ).
        LO_EMAIL->ADD_RECIPIENT( I_RECIPIENT = LO_RECEIVER ).
      CATCH CX_ADDRESS_BCS.

    ENDTRY.

  ENDLOOP.

** CC邮件地址设置
  LOOP AT IM_CCMAIL INTO DATA(LS_CCMAIL).
**    检查是否有包含集团邮箱后缀 @XXXXX.com,没有则追加
    IF LS_CCMAIL NS COS_MAIL_HZ.
      LS_CCMAIL = LS_CCMAIL && COS_MAIL.
    ENDIF.

    TRY.
        LO_RECEIVER = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( LS_CCMAIL ).
        LO_EMAIL->ADD_RECIPIENT( I_RECIPIENT = LO_RECEIVER I_COPY = ABAP_TRUE ).
      CATCH CX_ADDRESS_BCS.
    ENDTRY.

  ENDLOOP.


** 密抄邮件地址设置
  LOOP AT IM_CCMAIL_BLIND INTO  LS_CCMAIL.
**    检查是否有包含集团邮箱后缀 @XXXXX.com,没有则追加
    IF LS_CCMAIL NS COS_MAIL.
      LS_CCMAIL = LS_CCMAIL && COS_MAIL.
    ENDIF.

    TRY.
        LO_RECEIVER = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( LS_CCMAIL ).
        LO_EMAIL->ADD_RECIPIENT( I_RECIPIENT = LO_RECEIVER I_COPY = ABAP_TRUE I_BLIND_COPY = ABAP_TRUE ).
      CATCH CX_ADDRESS_BCS.
    ENDTRY.

  ENDLOOP.

  "Set Sender and send mail
  TRY.
      LO_SENDER = CL_SAPUSER_BCS=>CREATE( IM_SENDER ).
    CATCH CX_ADDRESS_BCS.

  ENDTRY.

  LO_EMAIL->SET_SENDER( LO_SENDER ).
  LO_EMAIL->SET_STATUS_ATTRIBUTES( I_REQUESTED_STATUS = 'E' I_STATUS_MAIL = 'E' ).""不返回执邮件
**  立即发送
  TRY.
      CALL METHOD LO_EMAIL->SET_SEND_IMMEDIATELY
        EXPORTING
          I_SEND_IMMEDIATELY = 'X'.
    CATCH CX_SEND_REQ_BCS .
*RAISE cx_send_req_bcs.
  ENDTRY.

  TRY.
      CALL METHOD LO_EMAIL->SEND
        RECEIVING
          RESULT = L_SEND_RESULT.

      COMMIT WORK.
    CATCH CX_SEND_REQ_BCS INTO LO_CX_SEND_REQ_BCS.
  ENDTRY.

ENDFUNCTION.

邮件中图片的说明:

1. 邮件中显示的图片在SE80 MIME资源库PUBLIC路径下上传

 2. 用户email中有时会出现图片打不开的问题,有时需要手工点击邮件加载图片才能出来,

 需要检查outlook设置了图片拦截之类。

1.3 调用封装函数
  DATA lt_mail    TYPE  bcsy_smtpa.
  DATA ls_mail    LIKE  LINE OF lt_mail.
 "邮件
  DATA: lv_subject TYPE  so_obj_des, "主题
        lt_mail    TYPE  bcsy_smtpa, "收件人
        lt_mail_cc TYPE  bcsy_smtpa, "抄送人
        ls_mail    LIKE  LINE OF lt_mail.

  "附件
  DATA : lt_excel      TYPE  ztexcel_fj,
         lv_excel_name TYPE string, "EXCEL 附件名
         lv_xstring1   TYPE xstring, "附件一
         lv_xstring2   TYPE xstring, "附件二
         lv_xstring3   TYPE xstring. "附件三.

  DATA:lv_row_1 TYPE zexcel_cell_row.
  DATA:lv_row_2 TYPE zexcel_cell_row.
  "读取EXCEL
  DATA: lo_excel_reader1 TYPE REF TO zif_excel_reader,
        lo_excel_reader2 TYPE REF TO zif_excel_reader,
        lo_excel_reader3 TYPE REF TO zif_excel_reader.
*  DATA LO__EXCEL_WORKSHEET TYPE REF TO ZCL_EXCEL_WORKSHEET .
  "style类
  DATA:lo_style TYPE REF TO zcl_excel_style.
  DATA:lv_style_guid TYPE zexcel_cell_style."style的guid
  "border类-边框
  DATA:lo_border TYPE REF TO zcl_excel_style_border.

  DATA:lv_sender TYPE syst_uname.
  lv_sender = 'V-XXXX'."发送人

  DATA: lv_content TYPE string .
 
  ls_mail = sy-uname && '@XXXX.COM'.
  COLLECT ls_mail INTO pt_mail_cc.

    "转换为二进制
    "附件1
"写到EXCEL 按页签名获取页签
    DATA(lo_worksheet_1_1) = lo_excel1->get_worksheet_by_name( ip_sheet_name = '月度XX统计' ). "附件1 页签1
    DATA(lo_worksheet_1_2) = lo_excel1->get_worksheet_by_name( ip_sheet_name = 'XXX明细表' )."附件1 页签2

      "填充EXCEL 附件1 页签2
      lv_row_1 = lv_row_1 + 1 .
      lo_worksheet_1_2->set_cell( ip_column = 'A'  ip_row = lv_row_1 ip_style = lv_style_guid ip_value = ls_data_mx-bukrs   ). "公司
      lo_worksheet_1_2->set_cell( ip_column = 'B'  ip_row = lv_row_1 ip_style = lv_style_guid ip_value = ls_data_mx-butxt   ). "公司名称
      lo_worksheet_1_2->set_cell( ip_column = 'C'  ip_row = lv_row_1 ip_style = lv_style_guid ip_value = ls_data_mx-sqdnr   ). "申请单号
      lo_worksheet_1_2->set_cell( ip_column = 'D'  ip_row = lv_row_1 ip_style = lv_style_guid ip_value = ls_data_mx-fkdnr   ). "付款单号


    lv_excel_name = '附件1-' && p_month+0(4) && '年' && p_month+4(2) && '月XX情况统计报告-' && ls_bukrs-nupnm && '.xlsx'.
    PERFORM frm_excel_to_binary USING lt_excel lo_excel1 lv_excel_name .

    "正文
    lv_content =   '<html>'
                   && '<head>'
                   && '<meta http-equiv="Content-Type" content="text/html;charset=gb2312">'
                   && '</head>'
                   && '<body>'
                   && '<font face="楷体";size="3"; style="text-indent:2em ; line-height:180%" >'
                   && '<small>各位领导好,<br/>'
                   && '&nbsp&nbsp&nbsp&nbsp每个月将下发XX月度分析报告。'
                   && p_month+0(4) &&'年'&& p_month+4(2) &&'月XX分析报告如下:<br/>'.

    "拼接正文lv_content 

  CALL FUNCTION 'ZFIFM_0164'
      EXPORTING
        im_mail_content = lv_content
        im_subject      = lv_subject
        im_sender       = lv_sender
        im_mail         = lt_mail
        im_ccmail       = lt_mail_cc
*       im_xstring      = lv_xstring.
        it_content_hex  = lt_excel[]
*       IM_EXCEL_SIZE   = LV_SIZE.
    IF  sy-subrc = 0 .
    ENDIF.




*&---------------------------------------------------------------------*
*&      Form  FRM_EXCEL_TO_BINARY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_excel_to_binary USING pt_excel TYPE ztexcel_fj
                               po_excel TYPE REF TO zcl_excel
                               pv_excel_name .

  "转换为二进制
  DATA: lv_file         TYPE xstring,
        lv_bytecount    TYPE i,
        lv_xstring      TYPE  xstring,
        lo_excel_writer TYPE REF TO zif_excel_writer,
        lt_file_tab     TYPE solix_tab.
  CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007.

  DATA lv_excelname TYPE string .

  lv_file = lo_excel_writer->write_file( po_excel ).

  lv_xstring = lv_file.

  " Convert to binary
  CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
    EXPORTING
      buffer        = lv_file
    IMPORTING
      output_length = lv_bytecount
    TABLES
      binary_tab    = lt_file_tab.

*    LT_EXCEL[] = LT_FILE_TAB[].
  DATA  lv_size TYPE so_obj_len.
  lv_size = lv_bytecount.

  APPEND INITIAL LINE TO pt_excel[] ASSIGNING FIELD-SYMBOL(<lfs_excel>) .
  <lfs_excel>-excel[] = lt_file_tab[] .
  <lfs_excel>-size = lv_size .
  <lfs_excel>-descr = pv_excel_name .

ENDFORM.

2. 调sap标准funciton发送邮件

发送邮件(不能带附件)

   CALL FUNCTION 'ZMAIL_SEND_01'
     EXPORTING
       mail_tittle = '保税仓调入数量超额提示'
     TABLES
       i_objtxt_u  = gt_txt[]          "发送的数据
       i_reclist_u = gt_email[].     "收件人
commit_work                = 'X'
*--------------------------------------------------------------------*
***相关事务码:SO00,SCOT,SOST。
*******调FM方法发送邮件
**附件是EXCEL文件

***相关定义
DATA: ls_docdata   TYPE sodocchgi1, "邮件抬头信息
      lt_packlist  TYPE TABLE OF sopcklsti1 WITH HEADER LINE, "传输内容格式
      lt_contxt    TYPE TABLE OF solisti1   WITH HEADER LINE, "邮件正文
      lt_conhex    TYPE TABLE OF solix      WITH HEADER LINE, "二进制内容
      lt_objbin    TYPE TABLE OF solisti1   WITH HEADER LINE, "附件内容
      lt_objheader TYPE TABLE OF solisti1   WITH HEADER LINE, "附件名称
      lt_receivers TYPE TABLE OF somlreci1  WITH HEADER LINE. "收件人信息

DATA: lv_tablines TYPE i,
      lv_string   TYPE string,
      lv_mimetype TYPE char64 VALUE 'APPLICATION/MSEXCEL;charset=utf-16le',
      lv_xattach  TYPE xstring.

DATA: lt_spfli TYPE TABLE OF spfli WITH HEADER LINE.

CONSTANTS:
  lc_tab  TYPE c VALUE cl_bcs_convert=>gc_tab,  "CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB
  lc_crlf TYPE c VALUE cl_bcs_convert=>gc_crlf. "CL_ABAP_CHAR_UTILITIES=>CR_LF

***邮件主题
CLEAR ls_docdata.
ls_docdata-obj_name  = 'EMAIL'.        "文档名称 名称随便取
ls_docdata-obj_descr = 'THIS IS A TEST MAIL!'. "邮件的主题

***邮件正文(手动赋值或取表数据)
CLEAR:lt_contxt,lt_contxt[].
lt_contxt-line = 'Hello Dear:'.
APPEND lt_contxt.
lt_contxt-line = '  HAVE A NICE DAY!'.
APPEND lt_contxt.
lt_contxt-line = '           FROM:XXX.'.
APPEND lt_contxt.

*添加邮件正文内容格式
CLEAR lv_tablines.
DESCRIBE TABLE lt_contxt LINES lv_tablines.
READ     TABLE lt_contxt INDEX lv_tablines.
ls_docdata-doc_size = ( lv_tablines - 1 ) * 255 + strlen( lt_contxt ). "文档的大小

CLEAR:lt_packlist,lt_packlist[].
lt_packlist-head_start = 1.
lt_packlist-head_num   = 0.
lt_packlist-body_start = 1.
lt_packlist-body_num   = lv_tablines.
lt_packlist-doc_type   = 'RAW'.
APPEND lt_packlist.

***收件人(手动赋值或取表数据)
CLEAR:lt_receivers,lt_receivers[].
lt_receivers-receiver = 'xxxxxxxxx@qq.com'.  "接收人邮箱
lt_receivers-rec_type = 'U'.               "收件人类型,具体可看字段的域值
lt_receivers-express  = 'X'.              "快件
APPEND lt_receivers.

***附件内容(内表内容做附件)
PERFORM frm_add_attachment.

***发送邮件
CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
  EXPORTING
    document_data              = ls_docdata "邮件标题
    put_in_outbox              = 'X'
    commit_work                = 'X'
* IMPORTING
*   SENT_TO_ALL                =
*   NEW_OBJECT_ID              =
  TABLES
    packing_list               = lt_packlist "传输内容格式
    object_header              = lt_objheader "附件名称
*   CONTENTS_BIN               =
    contents_txt               = lt_contxt "邮件文字内容
    contents_hex               = lt_conhex "二进制内容
*   OBJECT_PARA                =
*   OBJECT_PARB                =
    receivers                  = lt_receivers "接收人列表
  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 NE 0.
  MESSAGE '邮件发送失败' TYPE 'E'.

ELSE.
* 如果不自动送,加上执行邮件立即发送程序代码
  SUBMIT rsconn01 WITH mode = 'INT'
                  WITH output = 'X' "显示发送结果  空则不弹窗
                  AND RETURN.
  MESSAGE '发送成功' TYPE 'S'.
ENDIF.

*&---------------------------------------------------------------------*
*& Form FRM_ADD_ATTACHMENT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_add_attachment .

  CLEAR:lt_spfli,lt_spfli[].
  SELECT * FROM spfli
  INTO CORRESPONDING FIELDS OF TABLE lt_spfli.

  IF lt_spfli[] IS NOT INITIAL.
    LOOP AT lt_spfli.
      CONCATENATE lv_string
              lt_spfli-carrid    lc_tab
              lt_spfli-connid    lc_tab
              lt_spfli-countryfr lc_tab
              lt_spfli-cityfrom  lc_tab
              lt_spfli-cityfrom  lc_tab
              lt_spfli-countryto lc_tab
              lt_spfli-cityto    lc_tab
              lt_spfli-airpto    lc_crlf
              INTO lv_string.
    ENDLOOP.

* Convert string to xstring type
* 'APPLICATION/MSEXCEL;charset=utf-16le'
    CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
      EXPORTING
        text     = lv_string
        mimetype = lv_mimetype
      IMPORTING
        buffer   = lv_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
      lv_xattach INTO lv_xattach IN BYTE MODE.
    ENDIF.

    CLEAR:lt_conhex,lt_conhex[].
    CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
      EXPORTING
        buffer     = lv_xattach
      TABLES
        binary_tab = lt_conhex.

***设置附件名称***********
    lt_objheader = 'SPFLI.txt'.
    APPEND lt_objheader.

***计算附件大小分配空间*******************
    CLEAR lv_tablines.
    DESCRIBE TABLE lt_conhex LINES lv_tablines.
    CLEAR lt_packlist.
    lt_packlist-transf_bin = 'X'.
    lt_packlist-head_start = 1.
    lt_packlist-head_num   = 0.
    lt_packlist-body_start = 1.
    lt_packlist-body_num   = lv_tablines.
    lt_packlist-doc_type   = 'XLS'.
    lt_packlist-obj_name   = 'ATTACHMENT'.
    lt_packlist-obj_descr  = 'spfli'.
    lt_packlist-doc_size   =  lv_tablines * 255.
    APPEND lt_packlist.

  ENDIF.

ENDFORM.

3. 另一种发邮件功能封装

value( IT_HTML_CONTENT )    TYPE BCSY_TEXT OPTIONAL    文本表
value( IV_SUBJECT )    TYPE SIMPLE OPTIONAL    邮件主题文本
value( IV_SENDER )    TYPE SY-UNAME  DEFAULT SY-UNAME    ABAP 系统字段:当前用户的名称
value( IT_CC_LIST )    TYPE STRING_TABLE OPTIONAL    Table of Strings
value( IT_RECIPIENT_LIST )    TYPE STRING_TABLE    收件人ID列表
value( IV_IMPORTANCE )    TYPE BCS_DOCIMP OPTIONAL    文档优先级(1/5/9)
value( IT_BINARY_ATTACHMENT )    TYPE GTY_T_BINARY_ATTACHMENT OPTIONAL    
ET_RETURN    TYPE BAPIRET2_T    
EX_ROOT    TYPE REF TO CX_ROOT    Abstract Superclass for All Global Exceptions
 

  METHOD BCS_SEND_HTML_MAIL.
    DATA:
      lv_attachment_size   TYPE so_obj_len,
      lv_output_length     TYPE int4,
      lt_bin_att           TYPE solix_tab,
      ls_binary_attachment LIKE LINE OF it_binary_attachment,
      ls_return            LIKE LINE OF et_return,
      lo_document          TYPE REF TO cl_document_bcs,
      lo_gbt_ms            TYPE REF TO cl_gbt_multirelated_service,
      lo_recipient         TYPE REF TO if_recipient_bcs,
      lo_sender            TYPE REF TO cl_sapuser_bcs,
      lo_send_request      TYPE REF TO cl_bcs,
      lx_root              TYPE REF TO cx_root,
      lv_subject           TYPE so_obj_des,
      lv_address_string    TYPE adr6-smtp_addr,
      lv_string            TYPE string,
      lv_sender            TYPE sy-uname.

    DEFINE mac_add_error_return.
      ls_return-type        = 'E'.
      ls_return-message     =
      lv_string             = lx_root->get_text( ).
      ls_return-message_v4  = &1.
      ex_root               = lx_root.
      APPEND ls_return TO et_return.
      CLEAR: ls_return, lv_string.
      RETURN.
    END-OF-DEFINITION.

    " Create the send request
    TRY .
        lo_send_request = cl_bcs=>create_persistent( ).
      CATCH cx_root INTO lx_root.
        mac_add_error_return 1.
    ENDTRY.

    " Create sender
    TRY .
        lv_sender = iv_sender.
        TRANSLATE lv_sender TO UPPER CASE.
        lo_sender = cl_sapuser_bcs=>create( i_user = lv_sender ).
      CATCH cx_root INTO lx_root.
        mac_add_error_return 2.
    ENDTRY.

    " Set sender to request
    TRY .
        lo_send_request->set_sender( i_sender = lo_sender ).
      CATCH cx_root INTO lx_root.
        mac_add_error_return 3.
    ENDTRY.

    " Create and set recipient list
    TRY .
        LOOP AT it_recipient_list INTO lv_string.
          lv_address_string = lv_string.
*          TRANSLATE lv_string TO UPPER CASE.
          cl_cam_address_bcs=>create_internet_address(
            EXPORTING
              i_address_string = lv_address_string    " Internet Mail (SMTP) Address
            RECEIVING
              result           = lo_recipient    " Reference to BAS Address
              ).

          lo_send_request->add_recipient(
            EXPORTING
              i_recipient     = lo_recipient    " Recipient of Message
            ).
        ENDLOOP.
      CATCH cx_root INTO lx_root.
        mac_add_error_return 4.
    ENDTRY.

    " Create and set cc list
    TRY .
        LOOP AT it_cc_list INTO lv_string.
          lv_address_string = lv_string.
*          TRANSLATE lv_string TO UPPER CASE.
          cl_cam_address_bcs=>create_internet_address(
            EXPORTING
              i_address_string = lv_address_string    " Internet Mail (SMTP) Address
            RECEIVING
              result           = lo_recipient    " Reference to BAS Address
              ).

          lo_send_request->add_recipient(
            EXPORTING
              i_recipient     = lo_recipient    " Recipient of Message
              i_copy          = abap_true
            ).
        ENDLOOP.
      CATCH cx_root INTO lx_root.
        mac_add_error_return 5.
    ENDTRY.

    " Set mail text
    lv_subject = iv_subject.
    TRY .
        CREATE OBJECT lo_gbt_ms.
        lo_gbt_ms->set_main_html(
        EXPORTING
          content     = it_html_content ).

        cl_document_bcs=>create_from_multirelated(
        EXPORTING
          i_subject          = lv_subject    " Short description of contents
          i_language         = sy-langu    " Language in Which Document Is Created
          i_multirel_service = lo_gbt_ms    " Help Class for Multipart/Related in Business Workplace
          i_importance       = iv_importance
        RECEIVING
          result             = lo_document    " Wrapper Class for Office Documents
          ).

      CATCH cx_root INTO lx_root.
        mac_add_error_return 6.
    ENDTRY.

    " Add attachment
    LOOP AT it_binary_attachment INTO ls_binary_attachment.
      TRY .
          CLEAR: lv_output_length, lv_attachment_size.
          REFRESH lt_bin_att.
          CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
            EXPORTING
              buffer        = ls_binary_attachment-binary_data
            IMPORTING
              output_length = lv_output_length
            TABLES
              binary_tab    = lt_bin_att.

          lv_attachment_size = lv_output_length.

          lo_document->add_attachment(
            EXPORTING
              i_attachment_type     = 'BIN'    " Document Class for Attachment
              i_attachment_subject  = ls_binary_attachment-subject    " Attachment Title
              i_attachment_size     = lv_attachment_size    " Size of Document Content
              i_attachment_language = ls_binary_attachment-language    " Language in Which Attachment Is Created
              i_att_content_hex     = lt_bin_att    " Content (Binary)
          ).

          CLEAR: lv_output_length, lv_attachment_size.
          REFRESH lt_bin_att.
        CATCH cx_root INTO lx_root.
          mac_add_error_return 7.
      ENDTRY.
    ENDLOOP.

    TRY .
        lo_send_request->set_document( i_document = lo_document ).
      CATCH cx_root INTO lx_root.
        mac_add_error_return 8.
    ENDTRY.

    TRY ." set send immediately
        lo_send_request->set_send_immediately( i_send_immediately = abap_true ).
      CATCH cx_root INTO lx_root.
        mac_add_error_return 10.
    ENDTRY.

    TRY." send it
        lo_send_request->send( i_with_error_screen = abap_true ).
      CATCH cx_root INTO lx_root.
        mac_add_error_return 11.
    ENDTRY.

  ENDMETHOD.
 

调用封装函数

*&---------------------------------------------------------------------*
*&      Form  SEND_MAIL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM send_mail .
  DATA:
    lv_length         TYPE int4,
    lv_url            TYPE string,
    lt_return         TYPE bapiret2_t,
    lv_string         TYPE string,
    lt_recipient_list TYPE string_table,
    lt_html_content   TYPE bcsy_text,
    lt_html_content2  TYPE bcsy_text,
    lt_html_content3  TYPE bcsy_text,
    ls_html_context   LIKE LINE OF lt_html_content,
    lv_subject        TYPE string,
    lv_sender         TYPE sy-uname VALUE 'ICP-NOTICE',
    lv_counter        TYPE int4,
    ls_mail_list      LIKE LINE OF gt_mail_list,
    ls_copy           LIKE LINE OF gt_mail_list.

  IF gt_mail_list IS INITIAL.
    EXIT.
  ENDIF.

   lv_url  ='xx'.
  ls_html_context-line = '<BR/>&nbsp;&nbsp;<a href="'.
  APPEND ls_html_context TO lt_html_content3.

  DO.
    lv_length = strlen( lv_url ).
    IF lv_length > 255.
      ls_html_context-line = lv_url+0(255).
      APPEND ls_html_context TO lt_html_content3.
      lv_length = lv_length - 255.
      lv_url = lv_url+255(lv_length).
    ELSE.
      ls_html_context-line = lv_url.
      APPEND ls_html_context TO lt_html_content3.
      EXIT.
    ENDIF.
  ENDDO.
  ls_html_context-line = '">请点击这里</a>完成后续操作。'.
  APPEND ls_html_context TO lt_html_content3.

  SORT gt_mail_list BY user ywdnr ldate.

  LOOP AT gt_mail_list INTO ls_mail_list.
    ls_copy = ls_mail_list.

    AT NEW user.
      CLEAR: lv_counter, lv_subject.
      REFRESH: lt_html_content, lt_html_content2, lt_recipient_list, lt_return.

      " 内容头
      ls_html_context-line = '<html><body><meta http-equiv="Content-Type" content="text/html; charset=gb2312"/>'.
      APPEND ls_html_context TO lt_html_content.

      ls_html_context-line = '<p>' && ls_copy-uname && ',你好!</p>'.
      APPEND ls_html_context TO lt_html_content.
    ENDAT.

    IF lt_html_content2 IS INITIAL.
      ls_html_context-line = '<table width="100%" border="1" cellspacing="1" cellpadding="4">'.
      APPEND ls_html_context TO lt_html_content2.

      ls_html_context-line = '<tr bgcolor="#cccccc"><th>结算单号</th> <th>摘要</th> <th>日期</th> <th>间隔天数</th> </tr>'.
      APPEND ls_html_context TO lt_html_content2.
    ENDIF.

    ls_html_context-line = '<tr> <td>' && ls_mail_list-ywdnr && '</td>'.
    APPEND ls_html_context TO lt_html_content2.

    ls_html_context-line = '<td>'.
    APPEND ls_html_context TO lt_html_content2.

    ls_html_context-line = ls_mail_list-bktxt.
    APPEND ls_html_context TO lt_html_content2.

    ls_html_context-line = '</td>'.
    APPEND ls_html_context TO lt_html_content2.

    ls_html_context-line = '<td>' && ls_mail_list-ldtxt && '</td>'.
    APPEND ls_html_context TO lt_html_content2.

    ls_html_context-line = '<td>' && ls_mail_list-days && '</td> </tr>'.
    APPEND ls_html_context TO lt_html_content2.

    ADD 1 TO lv_counter.

    AT END OF user.
      lv_subject = '物业地产内部往来业务结算待办提醒,共计【' && lv_counter && '】条单据'.

      lv_string = ls_mail_list-user && '@VANKE.COM'.
      APPEND lv_string TO lt_recipient_list.

      ls_html_context-line = '<p>' && '&nbsp;&nbsp;共计【' && lv_counter && '】条物业地产内部往来业务结算单待处理。</p> <br/>'.
      APPEND ls_html_context TO lt_html_content.

      APPEND LINES OF lt_html_content2 TO lt_html_content.

      ls_html_context-line = '</table>'.
      APPEND ls_html_context TO lt_html_content.

      APPEND LINES OF lt_html_content3 TO lt_html_content.

      " 内容尾
      ls_html_context-line = '</body></html>'.
      APPEND ls_html_context TO lt_html_content.

      zcl_cd_rps=>bcs_send_html_mail(
        EXPORTING
          it_html_content      = lt_html_content
          iv_subject           = lv_subject
          iv_sender            = 'ICP-NOTICE'
          it_recipient_list    = lt_recipient_list
          iv_importance        = '5'
        IMPORTING
          et_return            = lt_return
      ).
    ENDAT.
  ENDLOOP.

  IF gt_mail_list IS NOT INITIAL.
    COMMIT WORK AND WAIT.
  ENDIF.
ENDFORM.

其他应用1

1.SE37创建FUNCTION :Z_COM_AUTO_MAIL

2. Import 参数。

3.Export 参数

4.table参数

5.table参数中ZTMAILADD邮件地址表参数,SE11创建表类型ZTMAILADD

SE11创建结构ZSMAILADD

SE11创建数据元素

SE11创建域

6. 源码如下: 

FUNCTION Z_COM_AUTO_MAIL.
*"----------------------------------------------------------------------
*"*"區域介面:
*"  IMPORTING
*"     REFERENCE(I_SUBJECT) TYPE  SO_OBJ_DES OPTIONAL
*"     REFERENCE(I_MAILTO) TYPE  CHAR255 OPTIONAL
*"     REFERENCE(I_MAILCC) TYPE  CHAR255 OPTIONAL
*"  EXPORTING
*"     VALUE(E_RETURN) TYPE  CHAR255
*"  TABLES
*"      T_MAILADD TYPE  ZTMAILADD OPTIONAL
*"      T_CONTENT TYPE  SOLI_TAB
*"      T_ATTACHMENT TYPE  SOLI_TAB OPTIONAL
*"----------------------------------------------------------------------
 
  DATA:LO_DOCUMENT      TYPE REF TO CL_DOCUMENT_BCS, "用来放发送的内容的类
       LIT_CONTENTS     TYPE SOLI_TAB,
       L_CC             TYPE ADR6-SMTP_ADDR,
       L_TO             TYPE ADR6-SMTP_ADDR,
       L_BCS_TO         TYPE REF TO IF_RECIPIENT_BCS,
       L_BCS_CC         TYPE REF TO IF_RECIPIENT_BCS,
       LO_SENDER        TYPE REF TO CL_SAPUSER_BCS,
       L_RESULT         TYPE OS_BOOLEAN,
*      cl_bcs发送邮件主要用到的功能类, 包括创建发送请求, 添加发送内容,添加发送地址, 到最终的发送指令发出.
       W_DOCUMENT       TYPE REF TO CL_BCS,
       L_FILE_SIZE_CHAR TYPE SO_OBJ_LEN,
       L_FILEN          TYPE STRING,
       LIT_MAILHEX      TYPE SOLIX_TAB,
       L_FILE_SIZE      TYPE I,
       L_RC             TYPE I,
       L_STRING         TYPE STRING,
       L_SUBJECT        TYPE SO_OBJ_DES,
*      cx_bcs异常类, 捕捉发送邮件过程中出现的异常.
       LO_FAIL          TYPE REF TO CX_BCS.
* 邮件正文
  LOOP AT T_CONTENT INTO L_STRING.
    APPEND L_STRING  TO LIT_CONTENTS.
  ENDLOOP.
  TRY.
*     CREATE THE DOCUMENT WITH CONTENTS
      CREATE OBJECT LO_DOCUMENT.
      LO_DOCUMENT = CL_DOCUMENT_BCS=>CREATE_DOCUMENT(
          I_TYPE       = 'HTM'
          I_SUBJECT    = I_SUBJECT  "邮件标题
          I_LENGTH     = L_FILE_SIZE_CHAR
          I_LANGUAGE   = SY-LANGU
          I_IMPORTANCE = '1'
          I_TEXT       = LIT_CONTENTS
          ).
 
* 附件类型为BIN接收任何类型的附件,包括视频、音频文件等。
* 读取附件
      IF T_ATTACHMENT IS NOT INITIAL.
        LOOP AT T_ATTACHMENT INTO DATA(P_FILE).
          L_FILEN = P_FILE.
          CALL METHOD CL_GUI_FRONTEND_SERVICES=>GUI_UPLOAD
            EXPORTING
              FILENAME                = L_FILEN
              FILETYPE                = 'BIN'  "
*             has_field_separator     = SPACE
*             header_length           = 0
*             read_by_line            = ''
*             dat_mode                = SPACE
*             codepage                = SPACE
*             ignore_cerr             = ABAP_TRUE
*             replacement             = '#'
*             virus_scan_profile      =
            IMPORTING
              FILELENGTH              = L_FILE_SIZE
*             header                  =
            CHANGING
              DATA_TAB                = LIT_MAILHEX
*             isscanperformed         = SPACE
            EXCEPTIONS
              FILE_OPEN_ERROR         = 1
              FILE_READ_ERROR         = 2
              NO_BATCH                = 3
              GUI_REFUSE_FILETRANSFER = 4
              INVALID_TYPE            = 5
              NO_AUTHORITY            = 6
              UNKNOWN_ERROR           = 7
              BAD_DATA_FORMAT         = 8
              HEADER_NOT_ALLOWED      = 9
              SEPARATOR_NOT_ALLOWED   = 10
              HEADER_TOO_LONG         = 11
              UNKNOWN_DP_ERROR        = 12
              ACCESS_DENIED           = 13
              DP_OUT_OF_MEMORY        = 14
              DISK_FULL               = 15
              DP_TIMEOUT              = 16
              NOT_SUPPORTED_BY_GUI    = 17
              ERROR_NO_GUI            = 18
              OTHERS                  = 19.
          IF SY-SUBRC <> 0.
            CASE SY-SUBRC.
              WHEN   '1' .
                E_RETURN = 'FILE_OPEN_ERROR         ' .
              WHEN   '2' .
                E_RETURN = 'FILE_READ_ERROR         ' .
              WHEN   '3' .
                E_RETURN = 'NO_BATCH                ' .
              WHEN   '4' .
                E_RETURN = 'GUI_REFUSE_FILETRANSFER ' .
              WHEN   '5' .
                E_RETURN = 'INVALID_TYPE            ' .
              WHEN   '6' .
                E_RETURN = 'NO_AUTHORITY            ' .
              WHEN   '7' .
                E_RETURN = 'UNKNOWN_ERROR           ' .
              WHEN   '8' .
                E_RETURN = 'BAD_DATA_FORMAT         ' .
              WHEN   '9' .
                E_RETURN = 'HEADER_NOT_ALLOWED      ' .
              WHEN   '10'.
                E_RETURN = 'SEPARATOR_NOT_ALLOWED   ' .
              WHEN   '11'.
                E_RETURN = 'HEADER_TOO_LONG         ' .
              WHEN   '12'.
                E_RETURN = 'UNKNOWN_DP_ERROR        ' .
              WHEN   '13'.
                E_RETURN = 'ACCESS_DENIED           ' .
              WHEN   '14'.
                E_RETURN = 'DP_OUT_OF_MEMORY        ' .
              WHEN   '15'.
                E_RETURN = 'DISK_FULL               ' .
              WHEN   '16'.
                E_RETURN = 'DP_TIMEOUT              ' .
              WHEN   '17'.
                E_RETURN = 'NOT_SUPPORTED_BY_GUI    ' .
              WHEN   '18'.
                E_RETURN = 'ERROR_NO_GUI            ' .
              WHEN OTHERS.
                E_RETURN = 'OTHERS mistake' .
            ENDCASE.
* Implement suitable error handling here
            RETURN.
          ENDIF.
* 附件长度,这个很重要,一定要有
          L_FILE_SIZE_CHAR = L_FILE_SIZE_CHAR.
*     获取附件名字及附件文件类型
          DATA(L_FILE) = P_FILE .
          DO .
            SPLIT L_FILE AT '\' INTO DATA(LV_TMP) L_FILE .
            SEARCH L_FILE FOR '\' .
            IF SY-SUBRC <> 0.
              EXIT .
            ENDIF.
          ENDDO.
          L_SUBJECT = L_FILE .
*     添加附件,可以添加多个附件
          CALL METHOD LO_DOCUMENT->ADD_ATTACHMENT
            EXPORTING
              I_ATTACHMENT_TYPE    = 'BIN'
              I_ATTACHMENT_SUBJECT = L_SUBJECT         "附件名称
              I_ATTACHMENT_SIZE    = L_FILE_SIZE_CHAR  "附件大小
              I_ATT_CONTENT_HEX    = LIT_MAILHEX.      "附件内容
        ENDLOOP.
      ENDIF.
*     CREATING PERSISTENT OBJECT WILL ALLOW YOU TO SET THE DOCUMENT IN THE MAIL
      W_DOCUMENT = CL_BCS=>CREATE_PERSISTENT( ).
*     发件人
*     前提是这个邮箱地址能发邮件,并且不需要密码
      LO_SENDER = CL_SAPUSER_BCS=>CREATE( SY-UNAME ).
      W_DOCUMENT->SET_SENDER( LO_SENDER ).
 
*     收件人
      IF I_MAILTO IS NOT INITIAL.
        L_TO = I_MAILTO.
        L_BCS_TO = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( L_TO ).
*     Add recipient to send request
        CALL METHOD W_DOCUMENT->ADD_RECIPIENT
          EXPORTING
            I_RECIPIENT = L_BCS_TO.
      ENDIF.
*    抄送人
      IF I_MAILCC IS NOT INITIAL.
        L_CC = I_MAILCC.  "
        L_BCS_CC = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( L_CC ).
        CALL METHOD W_DOCUMENT->ADD_RECIPIENT
          EXPORTING
            I_RECIPIENT = L_BCS_CC
            I_COPY      = 'X'.
        " i_express   = 'X'.
      ENDIF.
      "邮件地址表有值。
      IF T_MAILADD IS NOT INITIAL.
        LOOP AT T_MAILADD INTO DATA(LS_MAILADD).
          IF LS_MAILADD-MAILTYPE = 'T'.
            L_TO = LS_MAILADD-MAILADDR.
            L_BCS_TO = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( L_TO ).
*     Add recipient to send request
            CALL METHOD W_DOCUMENT->ADD_RECIPIENT
              EXPORTING
                I_RECIPIENT = L_BCS_TO.
          ELSEIF LS_MAILADD-MAILTYPE = 'C'.
            L_CC = LS_MAILADD-MAILADDR.  "
            L_BCS_CC = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( L_CC ).
 
            CALL METHOD W_DOCUMENT->ADD_RECIPIENT
              EXPORTING
                I_RECIPIENT = L_BCS_CC
                I_COPY      = 'X'.
            " i_express   = 'X'.
          ENDIF.
        ENDLOOP.
      ENDIF.
*     SEND THE MAIL
      W_DOCUMENT->SET_SEND_IMMEDIATELY( 'X' ).  "设置立即发送
      W_DOCUMENT->SEND_REQUEST->SET_LINK_TO_OUTBOX( 'X' ). "与outbox关联
      CALL METHOD W_DOCUMENT->SET_DOCUMENT( LO_DOCUMENT ).
      CALL METHOD W_DOCUMENT->SEND(
        EXPORTING
          I_WITH_ERROR_SCREEN = 'X'
        RECEIVING
          RESULT              = L_RESULT ).
    CATCH CX_BCS INTO LO_FAIL.
  ENDTRY.
* YOU CAN VERIFY THE STATUS IN THE LIST, YOU CAN ALSO SUBMIT THIS AS A BACKGROUND JOB.
  IF L_RESULT = 'X'.
    COMMIT WORK AND WAIT.
  ELSE.
    ROLLBACK WORK.
    E_RETURN = '发送失败' .
  ENDIF.
ENDFUNCTION.

邮件附件表可添加多个附件及多个不同的邮件种类,ABAP获取附件的方法可查看另一篇博文:ABAP选择本地文件,获取文件地址

以上,function已经创建完成,可以使用了。返回消息为空就代表发送成功了。下面我们创建将测试程序。

se38创建测试程序(代码中的邮件地址改为自己的哟,目前为本人邮箱)。

*&---------------------------------------------------------------------*
*& Report ZLQT_COM_AUTO_MAIL
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZLQT_COM_AUTO_MAIL.
 
DATA I_SUBJECT    TYPE SO_OBJ_DES .              "邮件主题
DATA I_MAILTO     TYPE CHAR255    .              "收件人
DATA I_MAILCC     TYPE CHAR255    .              "抄送
DATA E_RETURN     TYPE CHAR255    .              "返回消息
DATA T_MAILADD    TYPE TABLE OF ZSMAILADD WITH HEADER LINE   .   "邮件地址表
DATA T_CONTENT    TYPE TABLE OF SOLI      WITH HEADER LINE   .   "邮件正文内容
DATA T_ATTACHMENT TYPE TABLE OF SOLI      WITH HEADER LINE   .   "邮件附件地址
I_SUBJECT = '邮件主题' .
*T_MAILADD-MAILTYPE = 'T' .
*T_MAILADD-MAILADDR = 'szmis11@lotestech.com' .
*APPEND T_MAILADD .
*
*T_MAILADD-MAILTYPE = 'C' .
*T_MAILADD-MAILADDR = '979621537@QQ.com' .
*APPEND T_MAILADD .
I_MAILTO  = 'szmis11@lotestech.com'.
I_MAILCC  = '979621537@QQ.com' .
T_CONTENT-LINE = SY-UNAME && SY-DATUM  .
APPEND T_CONTENT .
T_ATTACHMENT-LINE = 'C:\Users\szmis11\Desktop\WeChat 圖片_202]]]]]01109190311.jpg' .
APPEND T_ATTACHMENT.
T_ATTACHMENT-LINE = 'C:\Users\szmis11\Desktop\automail.docx' .
APPEND T_ATTACHMENT.
CALL FUNCTION 'Z_COM_AUTO_MAIL'
 EXPORTING
   I_SUBJECT          = I_SUBJECT
   I_MAILTO           = I_MAILTO
   I_MAILCC           = I_MAILCC
 IMPORTING
   E_RETURN           = E_RETURN
  TABLES
    T_MAILADD          = T_MAILADD
    T_CONTENT          = T_CONTENT
    T_ATTACHMENT       = T_ATTACHMENT
          .
WRITE : E_RETURN .

以上为-自动发邮件FUNCTION,AUTOMAIL功能全部内容,若代码存在问题,欢迎评论指正。

应用效果2

邮件内容形式比如:

排名统计类晾晒邮件:

邮件发送封装函数2:

FUNCTION zpofm025.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(IM_MAIL_CONTENT) TYPE  STRING OPTIONAL
*"     VALUE(IM_SUBJECT) TYPE  SO_OBJ_DES OPTIONAL
*"     VALUE(IM_MAIL) TYPE  BCSY_SMTPA OPTIONAL
*"     VALUE(IM_CCMAIL) TYPE  BCSY_SMTPA OPTIONAL
*"     VALUE(IM_CCMAIL_BLIND) TYPE  BCSY_SMTPA OPTIONAL
*"     VALUE(IM_SENDER) TYPE  SYST_UNAME DEFAULT 'ICP-NOTICE'
*"     VALUE(IM_OTF) TYPE  TT_ITCOO OPTIONAL
*"     VALUE(IM_CONTENT_HEX) TYPE  SOLIX_TAB OPTIONAL
*"     VALUE(IM_CONTENT_DOC) TYPE  SOLIX_TAB OPTIONAL
*"     VALUE(IM_CONTENT_PNG) TYPE  SOLIX_TAB OPTIONAL
*"     REFERENCE(IT_EXPERTS) TYPE  ZTTFI_GENERAL_RANGE OPTIONAL
*"     VALUE(IM_IMG_TOP_NAME) TYPE  STRING OPTIONAL
*"     VALUE(IM_IMG_BOTTOM_NAME) TYPE  STRING OPTIONAL
*"     VALUE(IM_ATTACHMENT_SUBJECT) TYPE  SO_OBJ_DES OPTIONAL
*"     VALUE(IM_XSTRING) TYPE  XSTRING OPTIONAL
*"  RAISING
*"      CX_SEND_REQ_BCS
*"----------------------------------------------------------------------
  DATA : lt_mail_body       TYPE soli_tab,
         lo_cx_send_req_bcs TYPE REF TO cx_send_req_bcs,
         lo_email_body      TYPE REF TO cl_document_bcs,
         lo_receiver        TYPE REF TO cl_cam_address_bcs,
         lo_email           TYPE REF TO cl_bcs,
         lo_sender          TYPE REF TO cl_sapuser_bcs,
         l_send_result      TYPE os_boolean,
         cos_mail           TYPE c LENGTH 10 VALUE '@vanke.com',
         cos_mail_hz           TYPE c LENGTH 10 VALUE '@'.

**  设置签名相关变量
  DATA: l_len          TYPE so_obj_len,
        lt_solix       TYPE solix_tab,
        lv_is_folder   TYPE boole_d,
        lv_content     TYPE xstring,
        lv_loio        TYPE skwf_io,
        lo_mr_api      TYPE REF TO if_mr_api,
        lo_convert     TYPE REF TO cl_bcs_convert,
        lo_mime_helper TYPE REF TO cl_gbt_multirelated_service.

**  邮件正文转换
  CALL FUNCTION 'CONVERT_STRING_TO_TAB'
    EXPORTING
      i_string         = im_mail_content
      i_tabline_length = 255
    TABLES
      et_table         = lt_mail_body. "

**  设置万科 LOGO 签名
  IF lo_mr_api IS INITIAL.
    lo_mr_api = cl_mime_repository_api=>if_mr_api~get_api( ).

  ENDIF.

  CALL METHOD lo_mr_api->get
    EXPORTING
      i_url              = '/SAP/PUBLIC/VankeLogo4Mail.png'
    IMPORTING
      e_is_folder        = lv_is_folder
      e_content          = lv_content
      e_loio             = lv_loio
    EXCEPTIONS
      parameter_missing  = 1
      error_occured      = 2
      not_found          = 3
      permission_failure = 4
      OTHERS             = 5.

  l_len = xstrlen( lv_content ).

  CREATE OBJECT lo_convert.

  CALL METHOD lo_convert->xstring_to_solix
    EXPORTING
      iv_xstring = lv_content
    RECEIVING
      et_solix   = lt_solix.

  CREATE OBJECT lo_mime_helper.

  CALL METHOD lo_mime_helper->add_binary_part
    EXPORTING
      content      = lt_solix
      filename     = 'vanke.jpg'
      extension    = 'JPG'
      description  = 'descriptiongif'
      content_type = 'image/jpg'
      length       = l_len
      content_id   = 'vanke.jpg'.
  CALL METHOD lo_mime_helper->set_main_html
    EXPORTING
      content     = lt_mail_body
      filename    = 'vanke' "'xx'
      description = 'yy'.


  IF im_img_top_name IS NOT INITIAL.


    CALL METHOD lo_mr_api->get
      EXPORTING
*       i_url              = '/SAP/PUBLIC/ZPO/ZAI_HED_EMIAL.PNG' "ZAI_BOTTOM_EMIAL
        i_url              = '/SAP/PUBLIC/ZPO/' && im_img_top_name "ZAI_BOTTOM_EMIAL
      IMPORTING
        e_is_folder        = lv_is_folder
        e_content          = lv_content
        e_loio             = lv_loio
      EXCEPTIONS
        parameter_missing  = 1
        error_occured      = 2
        not_found          = 3
        permission_failure = 4
        OTHERS             = 5.

    l_len = xstrlen( lv_content ).

    CREATE OBJECT lo_convert.

    CALL METHOD lo_convert->xstring_to_solix
      EXPORTING
        iv_xstring = lv_content
      RECEIVING
        et_solix   = lt_solix.

    CALL METHOD lo_mime_helper->add_binary_part
      EXPORTING
        content      = lt_solix
*       filename     = 'ZAI_HED_EMIAL.PNG'
        filename     = |{ im_img_top_name }|
        extension    = 'PNG'
        description  = 'descriptiongif'
        content_type = 'image/png'
        length       = l_len
*       content_id   = 'ZAI_HED_EMIAL.PNG'.
        content_id   = |{ im_img_top_name }|.

  ENDIF.

  IF im_img_bottom_name IS NOT INITIAL.

    CLEAR :lv_is_folder,lv_content,lv_loio,l_len,lo_convert,lt_solix[].
    CALL METHOD lo_mr_api->get
      EXPORTING
*       i_url              = '/SAP/PUBLIC/ZPO/ZAI_BOTTOM_EMIAL.PNG' "ZAI_BOTTOM_EMIAL
        i_url              = '/SAP/PUBLIC/ZPO/' && im_img_bottom_name "ZAI_BOTTOM_EMIAL
      IMPORTING
        e_is_folder        = lv_is_folder
        e_content          = lv_content
        e_loio             = lv_loio
      EXCEPTIONS
        parameter_missing  = 1
        error_occured      = 2
        not_found          = 3
        permission_failure = 4
        OTHERS             = 5.

    l_len = xstrlen( lv_content ).

    CREATE OBJECT lo_convert.

    CALL METHOD lo_convert->xstring_to_solix
      EXPORTING
        iv_xstring = lv_content
      RECEIVING
        et_solix   = lt_solix.

*    CREATE OBJECT lo_mime_helper.

    CALL METHOD lo_mime_helper->add_binary_part
      EXPORTING
        content      = lt_solix
*       filename     = 'ZAI_BOTTOM_EMIAL.PNG'
        filename     = |{ im_img_bottom_name }|
        extension    = 'PNG'
        description  = 'descriptiongif2'
        content_type = 'image/png'
        length       = l_len
        content_id   = |{ im_img_bottom_name }|.


  ENDIF.


  TRY.
      CALL METHOD cl_document_bcs=>create_from_multirelated
        EXPORTING
          i_subject          = im_subject
          i_multirel_service = lo_mime_helper
        RECEIVING
          result             = lo_email_body.
    CATCH cx_document_bcs .
      MESSAGE e672(so) WITH 'bcs error while creating bcs_doc'.
      EXIT.
    CATCH cx_bcom_mime .
      MESSAGE e672(so) WITH 'mime error while creating bcs_doc'.
      EXIT.
    CATCH cx_gbt_mime.

  ENDTRY.
*START-OF-MODIFICATION-ON 24.07.2017 15:28:09 BY ZHANGCS------------------------------*
*Description:发送XLS附件功能
  DATA:lt_contents  TYPE TABLE OF solix.
  DATA:lt_contents_doc  TYPE TABLE OF solix.
  DATA:lv_pdf_size  TYPE so_obj_len.
  DATA:lv_descr     TYPE so_obj_des.
  DATA:lv_pdf       TYPE xstring.
  DATA:lv_size      TYPE so_obj_len.
  DATA:l_pdf_len    TYPE i,
       lt_pdf_lines TYPE TABLE OF tline.
**附件PDF
  IF NOT im_otf[] IS INITIAL.
    CALL FUNCTION 'CONVERT_OTF'
      EXPORTING
        format                = 'PDF'
        max_linewidth         = 132
      IMPORTING
        bin_filesize          = l_pdf_len
        bin_file              = lv_pdf        " BINARY FILE
      TABLES
        otf                   = im_otf
        lines                 = lt_pdf_lines
      EXCEPTIONS
        err_max_linewidth     = 1
        err_format            = 2
        err_conv_not_possible = 3
        err_bad_otf           = 4
        OTHERS                = 5.
    IF sy-subrc = 0.
    ENDIF.

    lv_size = xstrlen( lv_pdf ).
    lt_contents = cl_document_bcs=>xstring_to_solix( ip_xstring =  lv_pdf ).
    CONCATENATE im_subject '.PDF' INTO lv_descr.
    TRY.
        CALL METHOD lo_email_body->add_attachment(
            i_attachment_type    = 'PDF'
            i_att_content_hex    = lt_contents
            i_attachment_size    = lv_size
            i_attachment_subject = lv_descr ).

      CATCH cx_document_bcs.

    ENDTRY.
  ENDIF.

  IF NOT im_content_hex[] IS INITIAL.
**附件XLS
    APPEND LINES OF im_content_doc TO lt_contents_doc.
    IF im_attachment_subject IS INITIAL.
      CONCATENATE im_subject '.XLS' INTO lv_descr.
    ELSE.
      lv_descr = im_attachment_subject.
    ENDIF.
    TRY.
        CALL METHOD lo_email_body->add_attachment(
            i_attachment_type    = 'XLS'
            i_att_content_hex    = lt_contents_doc
*           i_attachment_size    = lv_size
            i_attachment_subject = lv_descr ).
      CATCH cx_document_bcs.

    ENDTRY.

  ENDIF.

  IF NOT im_xstring IS INITIAL.
    CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
      EXPORTING
        buffer          = im_xstring
        append_to_table = abap_true
      IMPORTING
        output_length   = l_pdf_len
      TABLES
        binary_tab      = lt_contents_doc.
    IF im_attachment_subject IS INITIAL.
      CONCATENATE im_subject '.XLSX' INTO lv_descr.
    ELSE.
      lv_descr = im_attachment_subject.
    ENDIF.
    TRY.
        CALL METHOD lo_email_body->add_attachment(
            i_attachment_type    = 'BIN'
            i_att_content_hex    = lt_contents_doc
            i_attachment_size    = lv_size
            i_attachment_subject = lv_descr ).
      CATCH cx_document_bcs.

    ENDTRY.
  ENDIF.

  IF NOT im_content_doc[] IS INITIAL.
**附件DOC
    APPEND LINES OF im_content_doc TO lt_contents.
    CONCATENATE im_subject '.DOC' INTO lv_descr.
    TRY.
        CALL METHOD lo_email_body->add_attachment(
            i_attachment_type    = 'DOC'
            i_att_content_hex    = lt_contents
*           i_attachment_size    = lv_size
            i_attachment_subject = lv_descr ).
      CATCH cx_document_bcs.
    ENDTRY.
  ENDIF.

  IF NOT im_content_png[] IS INITIAL.
**附件为图片
    APPEND LINES OF im_content_png TO lt_contents.
    CONCATENATE im_subject '.PNG' INTO lv_descr.
    TRY.
        CALL METHOD lo_email_body->add_attachment(
            i_attachment_type    = 'PNG'
            i_att_content_hex    = lt_contents
*           i_attachment_size    = lv_size
            i_attachment_subject = lv_descr ).
      CATCH cx_document_bcs.
    ENDTRY.
  ENDIF.
*END-OF-MODIFICATION---24.07.2017 15:28:09 BY ZHANGCS---------------------------------*

  lo_email = cl_bcs=>create_persistent( ).
  lo_email->set_document( lo_email_body ).

** 主送邮件地址设置
  LOOP AT im_mail INTO DATA(ls_mail).
**    检查是否有包含 @vanke.com,没有则追加
    IF ls_mail NS cos_mail_hz.
      ls_mail = ls_mail && cos_mail.
    ENDIF.

    TRY.
        lo_receiver = cl_cam_address_bcs=>create_internet_address( ls_mail ).
        lo_email->add_recipient( i_recipient = lo_receiver ).
      CATCH cx_address_bcs.

    ENDTRY.

  ENDLOOP.

** 业务专家邮件地址设置
  LOOP AT it_experts ASSIGNING FIELD-SYMBOL(<fs_exp>).
**    检查是否有包含 @vanke.com,没有则追加
    IF <fs_exp>-low NS cos_mail_hz.
      ls_mail = <fs_exp>-low && cos_mail.
    ENDIF.

    TRY.
        lo_receiver = cl_cam_address_bcs=>create_internet_address( ls_mail ).
        lo_email->add_recipient( i_recipient = lo_receiver ).
      CATCH cx_address_bcs.

    ENDTRY.

  ENDLOOP.

** CC邮件地址设置
  LOOP AT im_ccmail INTO DATA(ls_ccmail).
**    检查是否有包含 @vanke.com,没有则追加
    IF ls_ccmail NS cos_mail_hz.
      ls_ccmail = ls_ccmail && cos_mail.
    ENDIF.

    TRY.
        lo_receiver = cl_cam_address_bcs=>create_internet_address( ls_ccmail ).
        lo_email->add_recipient( i_recipient = lo_receiver i_copy = abap_true ).
      CATCH cx_address_bcs.
    ENDTRY.

  ENDLOOP.


** 密抄邮件地址设置
  LOOP AT im_ccmail_blind INTO  ls_ccmail.
**    检查是否有包含 @vanke.com,没有则追加
    IF ls_ccmail NS cos_mail.
      ls_ccmail = ls_ccmail && cos_mail.
    ENDIF.

    TRY.
        lo_receiver = cl_cam_address_bcs=>create_internet_address( ls_ccmail ).
        lo_email->add_recipient( i_recipient = lo_receiver i_copy = abap_true i_blind_copy = abap_true ).
      CATCH cx_address_bcs.
    ENDTRY.

  ENDLOOP.

  "Set Sender and send mail
  TRY.
      lo_sender = cl_sapuser_bcs=>create( im_sender ).
    CATCH cx_address_bcs.

  ENDTRY.

  lo_email->set_sender( lo_sender ).
  lo_email->set_status_attributes( i_requested_status = 'E' i_status_mail = 'E' ).""不返回执邮件
**  立即发送
  TRY.
      CALL METHOD lo_email->set_send_immediately
        EXPORTING
          i_send_immediately = 'X'.
    CATCH cx_send_req_bcs .
*RAISE cx_send_req_bcs.
  ENDTRY.

  TRY.
      CALL METHOD lo_email->send
        RECEIVING
          result = l_send_result.

      COMMIT WORK.

    CATCH cx_send_req_bcs INTO lo_cx_send_req_bcs.

  ENDTRY.


ENDFUNCTION.
 

调用上面封装函数的应用

FORM f_send_mail USING pi_ztfi0023 TYPE ztfi0023.
  DATA lv_zffs_name TYPE ztpo0074-zffs_name.
  DATA ls_ztfi0023_03 TYPE ztfi0023_03.
  DATA lt_ztfi0023_03 TYPE TABLE OF ztfi0023_03.
  DATA lv_subject TYPE  so_obj_des.
  DATA lt_mail    TYPE  bcsy_smtpa.
  DATA lt_mail_cc    TYPE  bcsy_smtpa.
  DATA ls_mail    LIKE LINE OF lt_mail.
  DATA lv_content TYPE  string.
  DATA lv_start TYPE  string.
  DATA lv_end TYPE  string.
  DATA lv_str TYPE  string.
  DATA lv_butxt TYPE t001-butxt.
  DATA lv_name_text TYPE adrp-name_text.
  DATA lv_smtp_addr TYPE adr6-smtp_addr.
  DATA lv_ctgdnr  TYPE ztpo0041-ctgdnr.
  DATA ls_dd07v TYPE dd07v.
  DATA lt_dd07v TYPE STANDARD TABLE OF dd07v.
  DATA lv_csgs TYPE ztfi0005-nidup.

  CHECK pi_ztfi0023-djtyp = 'PO0100000' OR pi_ztfi0023-djtyp = 'PO0200000'.

  SELECT SINGLE zffs_name
    FROM ztpo0074
    INTO lv_zffs_name
    WHERE seqno = pi_ztfi0023-zffst
      AND xmgs = pi_ztfi0023-bukrs.

  CHECK lv_zffs_name CP '*银行*'.

  "取一线公司编码
  SELECT SINGLE nidup
    FROM ztfi0005
    INTO lv_csgs
    WHERE hcode = pi_ztfi0023-bukrs
      AND hrver = '01'.

  SELECT *
    FROM ztfi0023_03
    INTO TABLE lt_ztfi0023_03
    WHERE zemail <> ''.

  SORT lt_ztfi0023_03 BY hcode.

  READ TABLE lt_ztfi0023_03 TRANSPORTING NO FIELDS WITH KEY
    hcode = pi_ztfi0023-bukrs BINARY SEARCH.
  IF sy-subrc = 0.
    LOOP AT lt_ztfi0023_03 INTO ls_ztfi0023_03 FROM sy-tabix.
      IF ls_ztfi0023_03-hcode <> pi_ztfi0023-bukrs.
        EXIT.
      ENDIF.
      ls_mail = ls_ztfi0023_03-zemail.
      IF ls_ztfi0023_03-is_cc = ''.
        APPEND ls_mail TO lt_mail.
      ELSE.
        APPEND ls_mail TO lt_mail_cc.
      ENDIF.
    ENDLOOP.
  ELSE.
    READ TABLE lt_ztfi0023_03 TRANSPORTING NO FIELDS WITH KEY hcode = lv_csgs BINARY SEARCH.
    IF sy-subrc = 0.
      LOOP AT lt_ztfi0023_03 INTO ls_ztfi0023_03 FROM sy-tabix.
        IF ls_ztfi0023_03-hcode <> lv_csgs.
          EXIT.
        ENDIF.
        ls_mail = ls_ztfi0023_03-zemail.
        IF ls_ztfi0023_03-is_cc = ''.
          APPEND ls_mail TO lt_mail.
        ELSE.
          APPEND ls_mail TO lt_mail_cc.
        ENDIF.
      ENDLOOP.
    ENDIF.
  ENDIF.

  CHECK lt_mail[] IS NOT INITIAL.
  "公司名称
  SELECT SINGLE butxt
    FROM t001
    INTO lv_butxt
    WHERE bukrs = pi_ztfi0023-bukrs.
  "合同归档编号
  SELECT SINGLE ctgdnr
    FROM ztpo0041
    INTO lv_ctgdnr
    WHERE ctsynr = pi_ztfi0023-cttnr.
  "结算方式
  CALL FUNCTION 'DD_DOMVALUES_GET'
    EXPORTING
      domname        = 'ZD_ZFFS_NR'
      text           = 'X'
      langu          = sy-langu
    TABLES
      dd07v_tab      = lt_dd07v
    EXCEPTIONS
      wrong_textflag = 1
      OTHERS         = 2.
  IF sy-subrc <> 0.
*Implement suitable error handling here
  ENDIF.

  READ TABLE lt_dd07v INTO ls_dd07v WITH KEY domvalue_l = pi_ztfi0023-setmt.
  "经办人
  SELECT SINGLE name_text
    INTO lv_name_text
    FROM adrp
    INNER JOIN usr21
    ON adrp~persnumber = usr21~persnumber
    WHERE usr21~bname =  pi_ztfi0023-ywjbr.
  IF lv_name_text IS INITIAL.
    lv_name_text = pi_ztfi0023-ywjbr.
  ENDIF.
  "邮件抄送给经办人
  SELECT SINGLE smtp_addr
    INTO lv_smtp_addr
    FROM adr6
    INNER JOIN usr21
    ON adr6~persnumber = usr21~persnumber
    WHERE usr21~bname =  pi_ztfi0023-ywjbr.
  IF lv_smtp_addr IS NOT INITIAL.
    ls_mail = lv_smtp_addr.
    APPEND ls_mail TO lt_mail_cc.
  ENDIF.
  "邮件主题
  lv_subject =  'ICP系统通知:请尽快处理一线支付单据,付款单' && pi_ztfi0023-sqdnr.

  CONCATENATE
  '<html>'
  '<head>'
  '<meta http-equiv="Content-Type" content="text/html;charset=gb2312">'
  '</head>'
  '<body>'
  '<small>您好:</small><br/>'
  '<small>&nbsp&nbsp下面为ICP中支付方式为一线支付的单据清单,烦请处理,谢谢。</small><br/><br/>'
  INTO lv_start.

  CONCATENATE
    '<img src=cid:vanke.jpg align="middle" width="184" height="30" >' " 万科图标
    '</body>'
    '</html>'
    INTO lv_end.

  lv_str = '<small>公司:' && lv_butxt && '</small><br/>' &&
           '<small>付款单号:' && pi_ztfi0023-fkdnr && '</small><br/>' &&
           '<small>合同归档编号:' && lv_ctgdnr && '</small><br/>' &&
           '<small>经办人:' && lv_name_text && '</small><br/>' &&
           '<small>收款人名称:' && pi_ztfi0023-sknam && '</small><br/>' &&
           '<small>付款金额:' && pi_ztfi0023-bmamt && '</small><br/>' &&
           '<small>结算方式:' && ls_dd07v-ddtext && '</small><br/>' &&
           '<small>收款银行:' && pi_ztfi0023-skbnk && '</small><br/>' &&
           '<small>收款账号:' && pi_ztfi0023-skacc && '</small><br/><br/>'.
  lv_content = lv_start && lv_str && lv_end.

  CALL FUNCTION 'ZPOFM025'
    EXPORTING
      im_mail_content = lv_content
      im_subject      = lv_subject
      im_mail         = lt_mail
      im_ccmail       = lt_mail_cc.
ENDFORM.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值