SAP 发送邮件 带附件(内表)

前提

SAP发送邮件需BASIS进行配置,

view pic

附件添加逻辑

SAP发送邮件将ALV内表添加到附件,需要先将内表转换为二进制文件,邮件发送通过类:CL_BCS实现。
1.创建请求

view code
  LO_SEND_REQUEST = CL_BCS=>CREATE_PERSISTENT( ).
2.设置邮件内容(正文、标题、附件等)
view code
  LO_DOCUMENT = CL_DOCUMENT_BCS=>CREATE_DOCUMENT(
  I_TYPE    = 'RAW'
  I_SUBJECT = L_SUBJECT
  I_TEXT    = LT_TEXT ).

  LO_DOCUMENT->ADD_ATTACHMENT(
  I_ATTACHMENT_TYPE    = 'XLS'
  I_ATTACHMENT_SUBJECT = '附件名'
  I_ATTACHMENT_SIZE    = LV_SIZE
  I_ATT_CONTENT_HEX    = LT_BINARY_CONTENT ).
3.添加邮件内容到请求
view code
  SELECT SINGLE SMTPUSER
  FROM SXNODES
  INTO L_ADDRESS
  WHERE NODE = 'SMTP'
  LO_SENDER_ID = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS(
                 I_ADDRESS_STRING = L_ADDRESS ).
  LO_SEND_REQUEST->SET_SENDER( 
                 LO_SENDER_ID ).
  FREE LO_SENDER_ID.
4.设置发件人、收件人 发件人邮箱等信息,需要配置,事务码:SCOT.
view code
*设置发件人
  SELECT SINGLE SMTPUSER
  FROM SXNODES
  INTO L_ADDRESS
  WHERE NODE = 'SMTP'.
  LO_SENDER_ID = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS(
    I_ADDRESS_STRING = L_ADDRESS ).
    LO_SEND_REQUEST->SET_SENDER( LO_SENDER_ID ).
  FREE LO_SENDER_ID.

*获取收件人,此处为自定义表,按照实际情况赋值
  SELECT RECADR
  FROM ZMAIL_PRCTR
  INTO TABLE @LT_RECIPIENT.
*设置收件人
  LOOP AT LT_RECIPIENT INTO DATA(LS_RECIPIENT).
       LO_RECIPIENT = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS(
         I_ADDRESS_STRING = LS_RECIPIENT ).
       LO_SEND_REQUEST->ADD_RECIPIENT( LO_RECIPIENT ).
       FREE LO_RECIPIENT.
  ENDLOOP.
5.设置邮件状态属性
view code
*设置状态属性
  LO_SEND_REQUEST->SET_STATUS_ATTRIBUTES(
    I_REQUESTED_STATUS = 'E'
    I_STATUS_MAIL      = 'E' ).
    LO_SEND_REQUEST->SET_SEND_IMMEDIATELY( ABAP_TRUE ).
6.发送
view code
  LO_SEND_REQUEST->SEND( I_WITH_ERROR_SCREEN = ABAP_TRUE ).
  COMMIT WORK AND WAIT.

源代码

复制后修改一下收、发件人即可使用。

view code
REPORT ZTEST_PFCG.

TABLES: USR02.

TYPES: BEGIN OF TY_PFCG,
         BNAME    TYPE USR02-BNAME,
         AGR_NAME TYPE AGR_USERS-AGR_NAME,
         TEXT     TYPE AGR_TEXTS-TEXT,
         FROM_DAT TYPE AGR_USERS-FROM_DAT,
         TO_DAT   TYPE AGR_USERS-TO_DAT,
       END OF TY_PFCG.

DATA: LT_PFCG TYPE TABLE OF TY_PFCG,
      LW_PFCG TYPE TY_PFCG.

DATA: LW_LAYO TYPE LVC_S_LAYO,
      LT_FCAT TYPE LVC_T_FCAT.

DATA:
   L_SUBJECT       TYPE SO_OBJ_DES,                   "邮件主题
   L_LOGSYS        TYPE LOGSYS,                       "SAP逻辑系统
   LT_TEXT         TYPE SOLI_TAB,                     "邮件正文文本
   LO_SEND_REQUEST TYPE REF TO CL_BCS,                "请求
   LO_DOCUMENT     TYPE REF TO CL_DOCUMENT_BCS,       "邮件内容
   L_ADDRESS       TYPE AD_SMTPADR,                   "发件人地址
   LO_SENDER_ID    TYPE REF TO IF_SENDER_BCS,         "发件人
   LT_RECIPIENT    TYPE STANDARD TABLE OF AD_SMTPADR, "收件人地址
   LO_RECIPIENT    TYPE REF TO IF_RECIPIENT_BCS,      "收件人
   LO_FAIL         TYPE REF TO CX_BCS,                "异常
   LC_XLS_TYPE     TYPE SO_OBJ_TP VALUE 'XLS',        "附件类型
   LV_PFCG         TYPE STRING.

SELECT
  USR02~BNAME,
  AGR_USERS~AGR_NAME,
  AGR_TEXTS~TEXT,
  AGR_USERS~FROM_DAT,
  AGR_USERS~TO_DAT
INTO CORRESPONDING FIELDS OF TABLE @LT_PFCG
FROM USR02
LEFT JOIN AGR_USERS ON AGR_USERS~UNAME = USR02~BNAME
LEFT JOIN AGR_TEXTS ON AGR_USERS~AGR_NAME = AGR_TEXTS~AGR_NAME AND AGR_TEXTS~SPRAS = @SY-LANGU
WHERE  USTYP = 'A'.


IF SY-UNAME EQ 'SAP*'.
  SORT LT_PFCG BY BNAME.
  PERFORM FRM_SEND_EMAIL.
ELSE.
  PERFORM FRM_GRID_LAYO_SET    CHANGING  LW_LAYO.
  PERFORM FRM_GRID_FCAT_SET    CHANGING  LT_FCAT.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      I_CALLBACK_PROGRAM = SY-REPID
*     I_CALLBACK_PF_STATUS_SET = 'FRM_SET_PF_STATUS'
*     I_CALLBACK_USER_COMMAND  = 'FRM_USER_COMMAND'
      IS_LAYOUT_LVC      = LW_LAYO
      IT_FIELDCAT_LVC    = LT_FCAT
      I_SAVE             = 'A'
    TABLES
      T_OUTTAB           = LT_PFCG
    EXCEPTIONS
      PROGRAM_ERROR      = 1
      OTHERS             = 2.
ENDIF.

*&---------------------------------------------------------------------*
*&      Form  FRM_GRID_LAYO_SET
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_LW_LAYO  text
*----------------------------------------------------------------------*
FORM FRM_GRID_LAYO_SET  CHANGING P_LW_LAYO TYPE LVC_S_LAYO.
  P_LW_LAYO-ZEBRA = 'X'.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_GRID_FCAT_SET
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_LT_FCAT  text
*----------------------------------------------------------------------*
FORM FRM_GRID_FCAT_SET  CHANGING P_LT_FCAT TYPE LVC_T_FCAT.
  DATA: LW_FCAT TYPE LVC_S_FCAT,
        LV_POS  TYPE I.
  DEFINE ADDFCAT.
    ADD 1 TO LV_POS.
    LW_FCAT-COL_POS   = LV_POS.
    LW_FCAT-FIELDNAME = &1.
    LW_FCAT-SCRTEXT_L = &2.
    LW_FCAT-SCRTEXT_M = &2.
    LW_FCAT-SCRTEXT_S = &2.
    LW_FCAT-COLTEXT   = &2.
    LW_FCAT-NO_ZERO   = 'X'.
    LW_FCAT-COL_OPT   = 'X'.
    APPEND LW_FCAT TO P_LT_FCAT.
    CLEAR LW_FCAT.
  END-OF-DEFINITION.
  ADDFCAT 'BNAME'     '账号'.
  ADDFCAT 'AGR_NAME'  '角色'.
  ADDFCAT 'TEXT'      '角色描述'.
  ADDFCAT 'FROM_DAT'  '开始日期'.
  ADDFCAT 'TO_DAT'    '结束日期'.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_SEND_EMAIL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_SEND_EMAIL.

  DATA:
    LT_BINARY_CONTENT  TYPE SOLIX_TAB, "二进制内容
    LV_SIZE            TYPE SO_OBJ_LEN. "文件內容大小

  "整理附件内容
  PERFORM FRM_PROCESS_MAIL_DATA CHANGING LV_PFCG.

  TRY.
      CL_BCS_CONVERT=>STRING_TO_SOLIX(
        EXPORTING
          IV_STRING   = LV_PFCG
          IV_CODEPAGE = '4103'
          IV_ADD_BOM  = 'X'
        IMPORTING
          ET_SOLIX  = LT_BINARY_CONTENT
          EV_SIZE   = LV_SIZE ).
    CATCH CX_BCS.
      MESSAGE '出现异常错误!' TYPE 'E'.
  ENDTRY.

  "获取当前逻辑系统
  CALL FUNCTION 'OWN_LOGICAL_SYSTEM_GET'
    IMPORTING
      OWN_LOGICAL_SYSTEM = L_LOGSYS.

  L_SUBJECT = 'SAP账号角色清单巡检通知'.
  APPEND INITIAL LINE TO LT_TEXT ASSIGNING FIELD-SYMBOL(<LS_LINE>).
  <LS_LINE>-LINE = 'SAP账号角色清单见附件,系统:' && L_LOGSYS+0(3) && '。'.
  APPEND INITIAL LINE TO LT_TEXT.

  TRY.
*创建发送请求
      LO_SEND_REQUEST = CL_BCS=>CREATE_PERSISTENT( ).

*创建发送内容
      LO_DOCUMENT = CL_DOCUMENT_BCS=>CREATE_DOCUMENT(
        I_TYPE    = 'RAW'
        I_SUBJECT = L_SUBJECT
        I_TEXT    = LT_TEXT ).

      LO_DOCUMENT->ADD_ATTACHMENT(
        I_ATTACHMENT_TYPE    = 'XLS'
        I_ATTACHMENT_SUBJECT = 'SAP账号清单'
        I_ATTACHMENT_SIZE    = LV_SIZE
        I_ATT_CONTENT_HEX    = LT_BINARY_CONTENT ).

*添加邮件内容到发送请求
      LO_SEND_REQUEST->SET_DOCUMENT( LO_DOCUMENT ).

*设置发件人
      SELECT SINGLE SMTPUSER
        FROM SXNODES
        INTO L_ADDRESS
        WHERE NODE = 'SMTP'.
      LO_SENDER_ID = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS(
        I_ADDRESS_STRING = L_ADDRESS ).
      LO_SEND_REQUEST->SET_SENDER( LO_SENDER_ID ).
      FREE LO_SENDER_ID.

*获取收件人
      SELECT RECADR
        FROM ZMAIL_PRCTR
        INTO TABLE @LT_RECIPIENT.

*设置收件人
      LOOP AT LT_RECIPIENT INTO DATA(LS_RECIPIENT).
        LO_RECIPIENT = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS(
          I_ADDRESS_STRING = LS_RECIPIENT ).
        LO_SEND_REQUEST->ADD_RECIPIENT( LO_RECIPIENT ).
        FREE LO_RECIPIENT.
      ENDLOOP.

*设置状态属性
      LO_SEND_REQUEST->SET_STATUS_ATTRIBUTES(
        I_REQUESTED_STATUS = 'E'
        I_STATUS_MAIL      = 'E' ).
      LO_SEND_REQUEST->SET_SEND_IMMEDIATELY( ABAP_TRUE ).

*发送
      LO_SEND_REQUEST->SEND( I_WITH_ERROR_SCREEN = ABAP_TRUE ).
      COMMIT WORK AND WAIT.

    CATCH CX_BCS INTO LO_FAIL.

  ENDTRY.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_PROCESS_MAIL_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_PROCESS_MAIL_DATA CHANGING LV_PFCG.

  CONSTANTS: LC_TAB  TYPE C VALUE CL_BCS_CONVERT=>GC_TAB,
             LC_CRLF TYPE C VALUE CL_BCS_CONVERT=>GC_CRLF.

  DATA: LV_LINE    TYPE STRING.

  CONCATENATE '账号'
              '角色'
              '角色描述'
              '开始日期'
              '结束日期' INTO LV_LINE SEPARATED BY LC_TAB.

  CONCATENATE LV_PFCG LV_LINE LC_CRLF INTO LV_PFCG.

  LOOP AT LT_PFCG INTO LW_PFCG.
    CONCATENATE LW_PFCG-BNAME
                LW_PFCG-AGR_NAME
                LW_PFCG-TEXT
                LW_PFCG-FROM_DAT
                LW_PFCG-TO_DAT INTO LV_LINE SEPARATED BY LC_TAB.
    CONCATENATE LV_PFCG LV_LINE LC_CRLF INTO LV_PFCG.
  ENDLOOP.

ENDFORM.
posted @ 2023-04-04 10:53  万有引力啊  阅读(1517)  评论(0)    收藏  举报