ABAP发送PDF附件邮件

发布时间 2023-10-30 15:56:40作者: Li_xiangc7
  DATA: fm_name      TYPE rs38l_fnam.
  DATA: gwa_result  TYPE ssfcrescl,
        gwa_output  TYPE ssfcompop,
        gwa_control TYPE ssfctrlop.
  DATA: ls_head TYPE zmms010, "定义表头内表
        lt_item TYPE TABLE OF zmms010 WITH HEADER LINE. "定义表值内表
  DATA: gv_size       TYPE i.
  DATA: gz_lines      TYPE TABLE OF tline.
  DATA: gs_lines      TYPE solix_tab .
  DATA:lv_xstring     TYPE xstring.                 "pdf附件
  DATA: lo_bcs        TYPE REF TO cl_bcs,
        lo_doc_bcs    TYPE REF TO cl_document_bcs,
        l_sender      TYPE REF TO cl_sapuser_bcs,
        l_send_result TYPE os_boolean,
        l_subject     TYPE so_obj_des.



  DATA: lo_recipient   TYPE REF TO if_recipient_bcs. "收件人
  DATA: l_to TYPE adr6-smtp_addr."收件人地址
  DATA: l_file_size_char TYPE so_obj_len.

  DATA: lt_solisti1 TYPE  soli_tab ,         "定义邮件内容
        ls_solisti1 TYPE soli.
  DATA : lo_mime_helper    TYPE REF TO cl_gbt_multirelated_service.



  CREATE OBJECT lo_doc_bcs.

* 邮件标题
  l_subject = '邮件标题'.


* 邮件正文
  ls_solisti1 = '<html xmlns="http://www.w3.org/1999/xhtml" xmlns:xfa="http://www.xfa.org/schema/xfa-template/2.1/"> <head> <meta http-equiv = "Content-Type" content = "text/html; charset = utf-8"></head>'.
  APPEND ls_solisti1 TO lt_solisti1.
  ls_solisti1 = '<BODY>'.
  APPEND ls_solisti1 TO lt_solisti1.
  CLEAR ls_solisti1.
  ls_solisti1  = '<SPAN style="font-family:Calibri;font-size:小四;">'.
  APPEND ls_solisti1 TO lt_solisti1.
  CONCATENATE  '备注:'  '<BR><BR>' INTO ls_solisti1.
  APPEND ls_solisti1 TO lt_solisti1.
  CONCATENATE  '重要提示:此邮件及附件具有保密性质,包含商业秘密,受法律保护不得泄露.'  '<BR><BR>' INTO ls_solisti1.
  APPEND ls_solisti1 TO lt_solisti1.
  CLEAR ls_solisti1.
  ls_solisti1 ='</SPAN>'.
  APPEND ls_solisti1 TO lt_solisti1.


*CREATE THE DOCUMENT WITH CONTENTS
  CREATE OBJECT lo_mime_helper.
  CALL METHOD lo_mime_helper->set_main_html
    EXPORTING
      content     = lt_solisti1
      description = 'Automatic payment'.  "title


  lo_doc_bcs = cl_document_bcs=>create_from_multirelated( i_subject = l_subject i_multirel_service = lo_mime_helper i_language = sy-langu i_importance = '1' ).


 "附件PDF参数
  gwa_control-no_dialog = 'X'.
  gwa_control-no_close = ' '.
  gwa_control-preview = ' '.
  gwa_control-getotf = 'X'.
  gwa_control-langu     = sy-langu.
  gwa_output-tdnewid   = 'X'.
  gwa_output-tdimmed   = 'X'.
  gwa_output-tddelete   = 'X'.
  gwa_output-tddest  = 'LP01'.


 "调用smartforms
  CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
    EXPORTING
      formname           = 'SMARTFORMS'
*     VARIANT            = ' '
*     DIRECT_CALL        = ' '
    IMPORTING
      fm_name            = fm_name
    EXCEPTIONS
      no_form            = 1
      no_function_module = 2
      OTHERS             = 3.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.


"smartforms数据处理
  LOOP AT gt_table INTO gw_table WHERE sel EQ abap_true  GROUP BY ( ebeln = gw_table-ebeln )."按订单分组

    LOOP AT gt_table INTO gi_table WHERE ebeln EQ gw_table-ebeln  .

      MOVE-CORRESPONDING gi_table TO g_lt_item.

      APPEND g_lt_item TO g_lt_item.

    ENDLOOP.


    CALL FUNCTION fm_name
      EXPORTING
        control_parameters = gwa_control
        output_options     = gwa_output
        user_settings      = ''
        ls_head            = ls_head
      IMPORTING
        job_output_info    = gwa_result
      TABLES
        lt_item            = lt_item ""传值进入smartforms
      EXCEPTIONS
        formatting_error   = 1
        internal_error     = 2
        send_error         = 3
        user_canceled      = 4
        OTHERS             = 5.
    IF sy-subrc <> 0.
* Implement suitable error handling here
    ENDIF.


*Convert OTF to PDF
    CALL FUNCTION 'CONVERT_OTF'
      EXPORTING
        format                = 'PDF'
      IMPORTING
        bin_filesize          = gv_size
        bin_file              = lv_xstring
      TABLES
        otf                   = gwa_result-otfdata
        lines                 = gz_lines
      EXCEPTIONS
        err_max_linewidth     = 1
        err_format            = 2
        err_conv_not_possible = 3
        err_bad_otf           = 4
        OTHERS                = 5.

    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.

    "转换二进制
    CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
      EXPORTING
        buffer     = lv_xstring
      TABLES
        binary_tab = gs_lines.

*     附件长度
    l_file_size_char = gv_size.

*     添加附件,可以添加多个附件
    CALL METHOD lo_doc_bcs->add_attachment
      EXPORTING
        i_attachment_type    = 'BIN'
        i_attachment_subject = 'PO' && gw_zmmf010-ebeln && '.PDF'
        i_attachment_size    = l_file_size_char
        i_att_content_hex    = gs_lines.

  ENDLOOP.


  lo_bcs = cl_bcs=>create_persistent( ).
  l_sender = cl_sapuser_bcs=>create( sy-uname ).


  CALL METHOD lo_bcs->set_sender
    EXPORTING
      i_sender = l_sender.


  DATA:lf_error TYPE REF TO cx_address_bcs.

  "设置接收人\抄送人邮箱
  IF gx_zmmf010-zzemail IS NOT INITIAL.
    TRY.
        l_to = '1234567@QQ.COM'."邮箱地址
        lo_recipient = cl_cam_address_bcs=>create_internet_address( l_to ).
        lo_bcs->add_recipient( i_recipient  = lo_recipient
                               i_express    = 'X'
                               i_copy       = ' '"设置是否抄送
                               i_blind_copy = ' '
                               i_no_forward = ' ' ).

      CATCH   cx_address_bcs INTO lf_error .
        MESSAGE '邮件地址异常!' TYPE 'I'.
        RETURN.
    ENDTRY.

  ENDIF.


"提交邮件发送申请
  lo_bcs->set_document( i_document = lo_doc_bcs ).
  CALL METHOD lo_bcs->send(
    EXPORTING
      i_with_error_screen = 'X'
    RECEIVING
      result              = l_send_result
  ).
  
  IF l_send_result = 'X'.
    COMMIT WORK AND WAIT.
    MESSAGE '邮件发送成功' TYPE 'S'.
    CLEAR ls_modify_email.
  ELSE.
    ROLLBACK WORK.
    MESSAGE '邮件发送失败' TYPE  'E'.
  ENDIF.



  WAIT UP TO 2 SECONDS.

  SUBMIT rsconn01 WITH mode = 'INT'
                  WITH output = 'X'
                  AND RETURN.