ABAP 发送邮件

FUNCTION ZZF_SENT_MAIL.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(IN_TITLE) TYPE  CHAR50 OPTIONAL
*"     VALUE(IN_EMAIL) TYPE  CHAR40 OPTIONAL
*"     VALUE(IN_COMMIT) TYPE  CHAR1 DEFAULT 'X'
*"     VALUE(IN_HTML) TYPE  CHAR1 DEFAULT SPACE
*"  TABLES
*"      ET_BCSY_TEXT TYPE  BCSY_TEXT OPTIONAL
*"----------------------------------------------------------------------
*类: CL_BCS 发送邮件主要用到的功能类, 包括创建发送请求, 添加发送内容,添加发送地址, 到最终的发送指令发出.
*类: CL_DOCUMENT_BCS, 用来放置发送的内容.
*类: CX_BCS, 不用多说,这是个异常类, 用于捕捉发送邮件过程中出现的异常.
*接口: IF_RECIPIENT_BCS, 用来做邮件地址的存储转换.
DATA: SEND_REQUEST TYPE REF TO CL_BCS,
      SENDER             TYPE REF TO CL_CAM_ADDRESS_BCS,
      DOCUMENT TYPE REF TO CL_DOCUMENT_BCS,
      FAIL TYPE REF TO CX_BCS,
      RECIPIENT TYPE REF TO IF_RECIPIENT_BCS.

DATA: LS TYPE STRING,
      MAILTO TYPE AD_SMTPADR,
      MAIN_TEXT TYPE BCSY_TEXT,
      TITLE TYPE SO_OBJ_DES.
DATA:LV_MAIL_TEXT_TYPE TYPE SO_OBJ_TP.

*LS = 'IN_TITLE'.

*  LOOP AT ET_BCSY_TEXT ASSIGNING FIELD-SYMBOL(<FS_ET_BCSY_TEXT>).
*    TRANSLATE  <FS_ET_BCSY_TEXT> TO LOWER CASE.
*  ENDLOOP.

  APPEND LINES OF ET_BCSY_TEXT TO MAIN_TEXT.
  TITLE = IN_TITLE.
  MAILTO = IN_EMAIL.


  IF IN_HTML EQ 'X'.
    LV_MAIL_TEXT_TYPE = 'HTM'.
  ELSE.
    LV_MAIL_TEXT_TYPE = 'RAW'.
  ENDIF.



TRY.
* 第一步: 创建发送请求
    SEND_REQUEST = CL_BCS=>CREATE_PERSISTENT( ).

*第二步: 创建整理发送内容
    DOCUMENT = CL_DOCUMENT_BCS=>CREATE_DOCUMENT(
    I_TYPE = LV_MAIL_TEXT_TYPE
    I_TEXT = MAIN_TEXT
    I_SUBJECT = TITLE ).
*第三步: 添加邮件内容到发送请求
    SEND_REQUEST->SET_DOCUMENT( DOCUMENT ).

    "设置发送人
    SENDER    = cl_cam_address_bcs=>create_internet_address(
                                      'ihr@sinochem.com' ).
    send_request->set_sender( sender ).

* 第四步: 邮件地址转换
    RECIPIENT = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( MAILTO ).
*第五步: 添加邮件地址到发送请求
    SEND_REQUEST->ADD_RECIPIENT( RECIPIENT ).
*第六步: 正式发送并提交作业
    SEND_REQUEST->SEND( I_WITH_ERROR_SCREEN = 'X' ).
*    IF IN_COMMIT EQ 'X'.
      COMMIT WORK AND WAIT.
*    ENDIF.


    CATCH CX_BCS INTO FAIL.
ENDTRY.

ENDFUNCTION.

调用示例

1、工资发布发邮件

      LOOP AT GT_LINES ASSIGNING FIELD-SYMBOL(<FW_LINE>).
        LS_ZZT_LONG_TEXT-ZLONG_TEXT_NO = SY-UNAME.
        LS_ZZT_LONG_TEXT-ZLONG_TEXT = <FW_LINE>-ZLONG_TEXT.
        LS_ZZT_LONG_TEXT-UPNAM = SY-UNAME.
        LS_ZZT_LONG_TEXT-UPDAT = SY-DATUM.
        LS_ZZT_LONG_TEXT-uptim = sy-UZEIT.
        APPEND LS_ZZT_LONG_TEXT TO LT_ZZT_LONG_TEXT.

        LS_BCSY_TEXT-line = <FW_LINE>-ZLONG_TEXT.
        APPEND LS_BCSY_TEXT TO LT_BCSY_TEXT.

        AT LAST.
          IF SY-MANDT EQ '300'.
            "LS_BCSY_TEXT-LINE = 'http://nyhrdev1.sinochem.com:8000/sap/bc/ui2/flp?sap-client=300&sap-language=ZH#RemunerationStatement-displayExt'.
            LS_BCSY_TEXT-LINE = 'http://webseal.sinochem.com/ihr/hcm_sso'.
          ELSEIF SY-MANDT EQ '500'.
            "LS_BCSY_TEXT-LINE = 'http://sehrqas.sinochemenergy.com/hcm#RemunerationStatement-displayExt'.
            LS_BCSY_TEXT-LINE = 'http://webseal.sinochem.com/ihr/hcm_sso'.
          ELSEIF SY-MANDT EQ '800'.
            "LS_BCSY_TEXT-LINE = 'http://ihr.sinochemenergy.com/hcm?sap-client=800&sap-language=ZH#RemunerationStatement-displayExt'.
            LS_BCSY_TEXT-LINE = 'http://webseal.sinochem.com/ihr/hcm_sso'.
          ENDIF.

          APPEND LS_BCSY_TEXT TO LT_BCSY_TEXT.
        ENDAT.
      ENDLOOP.
            GS_MAIL-PERNR = GS_PAYDT-PERNR.
            GS_MAIL-EMAIL = <FS_PA0105>-USRID.


            LV_EMAIL_FM = GS_MAIL-EMAIL.
            CALL FUNCTION 'ZZF_SENT_MAIL'
              EXPORTING
                IN_TITLE           = LV_TITLE
                IN_EMAIL           = LV_EMAIL_FM
                "IN_HTML            = 'X'
              TABLES
                ET_BCSY_TEXT       = LT_BCSY_TEXT
                .
            GS_MAIL-ICON = '@08@'.
            GS_MAIL-MESSAGE = '发布成功'.
            APPEND GS_MAIL TO GT_MAIL.

2、发送审批邮件

*&---------------------------------------------------------------------*
*& Form SENT_EMAIL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> LT_BCSY_TEXT
*&      --> <FS_SWHACTOR>_OBJID
*&      --> I_WI_RHTEXT
*&      --> LV_ENAME
*&---------------------------------------------------------------------*
FORM SENT_EMAIL_APPROVE  USING    P_OBJID
                          P_I_WI_RHTEXT
                          P_LV_ENAME
                          LV_URL

    .


   DATA:LV_TITLE        TYPE CHAR50,
        LV_EMAIL_FM     TYPE CHAR40,
        LT_BCSY_TEXT    TYPE BCSY_TEXT.

  "发送待办邮件
   SELECT SINGLE *
     INTO @DATA(LV_EMAIL_APPROVE)
     FROM PA0105 AS 0105_1
    WHERE SUBTY = '0014'
      AND PERNR EQ (
   SELECT PERNR
    FROM PA0105 AS 0105_2
    WHERE SUBTY = '0001'
      AND USRID = @P_OBJID ).
  IF SY-SUBRC EQ 0.
    LV_TITLE = '审批提醒:' && P_I_WI_RHTEXT && '-' && P_LV_ENAME && '-' && SY-DATUM+0(4) && '-' && SY-DATUM+4(2) && '-' && SY-DATUM+6(2)." '统一待办-创建办结'.
    LV_EMAIL_FM = lv_email_approve-usrid.
    TRANSLATE  LV_EMAIL_FM TO LOWER CASE.
    LT_BCSY_TEXT = VALUE #(
      ( LINE = '审批提醒:您有新的工作流需要审批,' )
      ( LINE = '请到收件箱中审批:' && '<html><body><a href="' && LV_URL && '">' && P_I_WI_RHTEXT && '</a></body></html>' )
    ).
    CALL FUNCTION 'ZZF_SENT_MAIL'
      EXPORTING
        IN_TITLE           = LV_TITLE
        IN_EMAIL           = LV_EMAIL_FM
        IN_HTML            = 'X'
      TABLES
        ET_BCSY_TEXT       = LT_BCSY_TEXT
        .
  ELSE.
    "发送待办邮件
     SELECT SINGLE *
       INTO @LV_EMAIL_APPROVE
       FROM PA0105 AS 0105_1
      WHERE SUBTY = '0006'
        AND PERNR EQ (
     SELECT PERNR
      FROM PA0105 AS 0105_2
      WHERE SUBTY = '0001'
        AND USRID = @P_OBJID ).
      IF SY-SUBRC EQ 0.
        LV_TITLE = '审批提醒:' && P_I_WI_RHTEXT && '-' && P_LV_ENAME && '-' && SY-DATUM+0(4) && '-' && SY-DATUM+4(2) && '-' && SY-DATUM+6(2)." '统一待办-创建办结'.
        LV_EMAIL_FM = lv_email_approve-usrid.
        TRANSLATE  LV_EMAIL_FM TO LOWER CASE.
        LT_BCSY_TEXT = VALUE #(
          ( LINE = '审批提醒:您有新的工作流需要审批,' )
          ( LINE = '请到收件箱中审批:' && '<html><body><a href="' && LV_URL && '">' && P_I_WI_RHTEXT && '</a></body></html>' )
        ).
        CALL FUNCTION 'ZZF_SENT_MAIL'
          EXPORTING
            IN_TITLE           = LV_TITLE
            IN_EMAIL           = LV_EMAIL_FM
            IN_HTML            = 'X'
          TABLES
            ET_BCSY_TEXT       = LT_BCSY_TEXT
            .
      ENDIF.
  ENDIF.
ENDFORM.

3、工作流发送邮件

*&---------------------------------------------------------------------*
*& Form WF_SENT_MAIL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> LR_USRID
*&      --> LV_MAIL_CONTEN
*&---------------------------------------------------------------------*
FORM wf_sent_mail  TABLES   "p_usrid STRUCTURE GS_USRID
                            LT_MAIL STRUCTURE GS_MAIL
                   USING    p_mail_content
                            APPLY_NAME
                            APPLY_PERNR
                            APPLY_EMAIL
                            APPLY_PLANS
                            APPLY_PROVE_TYPE
                            ZZAPPLY_REASON
                            ZZREASON_LONG_TEXT
                            APPLY_TYPE_TEXT

  .

  DATA:LV_TITLE        TYPE CHAR50,
       LV_EMAIL_FM     TYPE CHAR40,
       LT_BCSY_TEXT    TYPE BCSY_TEXT,
       LT_BCSY_TEXT_END    TYPE BCSY_TEXT,
       LV_APPLY_PROVE_TYPE_TEXT TYPE STRING,
       LV_ZZAPPLY_REASON_TEXT TYPE STRING.

  DATA:LV_URL TYPE STRING.


  IF sy-mandt EQ '300'.
    LV_URL = 'http://webseal.sinochem.com/nyhrdev1/hcm_sso'.

  ELSEIF SY-MANDT EQ '500'.
    LV_URL = 'http://webseal.sinochem.com/nyhrqas1/hcm_sso'.
  ELSEif sy-MANDT eq '800'.
    LV_URL = 'http://webseal.sinochem.com/ihr/hcm_sso'.
  ENDIF.
  "人事范围
  SELECT SINGLE NAME1
     INTO @DATA(LV_NAME1)
     FROM PA0001 JOIN T500P ON PA0001~WERKS EQ T500P~PERSA
    WHERE PERNR EQ @APPLY_PERNR
      AND BEGDA LE @SY-DATUM
      AND ENDDA GE @SY-DATUM.

  "职位名称
  SELECT SINGLE MC_STEXT
    INTO @DATA(lv_PLANC_STEXT)
    FROM HRP1000
   WHERE OTYPE EQ 'S'
     AND OBJID EQ @APPLY_PLANS.



  LV_TITLE = '证明申请提醒' && '-' && SY-DATUM+0(4) && '-' && SY-DATUM+4(2) && '-' && SY-DATUM+6(2).

  SELECT *
    INTO TABLE @DATA(LT_DD07T)
    FROM DD07T
   WHERE DOMNAME IN ( 'ZD_ZZPROVE_TYPE', 'ZD_ZZAPPLY_REASON'  )
     AND DDLANGUAGE EQ @SY-LANGU
     and DOMVALUE_L IN ( @APPLY_PROVE_TYPE,@ZZAPPLY_REASON ).

  SORT LT_DD07T BY DOMNAME DOMVALUE_L.

  LOOP AT LT_DD07T ASSIGNING FIELD-SYMBOL(<FS_DD07T>).
    IF <FS_DD07T>-DOMNAME = 'ZD_ZZPROVE_TYPE'  AND <FS_DD07T>-DOMVALUE_L = APPLY_PROVE_TYPE.
      LV_APPLY_PROVE_TYPE_TEXT = <FS_DD07T>-DDTEXT.
    ELSEIF <FS_DD07T>-DOMNAME = 'ZD_ZZAPPLY_REASON'  AND <FS_DD07T>-DOMVALUE_L = ZZAPPLY_REASON.
      LV_ZZAPPLY_REASON_TEXT = <FS_DD07T>-DDTEXT.
    ENDIF.
  ENDLOOP.



  LOOP AT LT_MAIL ASSIGNING FIELD-SYMBOL(<FS_MAIL>).
    LV_EMAIL_FM  = <FS_MAIL>-EMAIL.
    TRANSLATE  LV_EMAIL_FM TO LOWER CASE.

    LT_BCSY_TEXT = VALUE #(
      "&nbsp&nbsp&nbsp
      ( LINE = '<html><body><p>' && '尊敬的' && <FS_MAIL>-UNAME && ':</p></body></html>' )
      ( LINE = '<html><body><p>' && APPLY_NAME && '员工已经成功提交申请开具' && LV_APPLY_PROVE_TYPE_TEXT && ',申请原因是:' && LV_ZZAPPLY_REASON_TEXT && ZZREASON_LONG_TEXT && '。' && '</p></body></html>' )
      ( LINE = '<html><body><p>' && '员工信息如下:' && '</p></body></html>' )
      ( LINE = '<html><body><p>' && '</p></body></html>' )
      ( LINE = '<html><body><p>' && '姓名:'     && APPLY_NAME && '</p></body></html>' )
      ( LINE = '<html><body><p>' && '员工编号:' && APPLY_PERNR && '</p></body></html>' )
      ( LINE = '<html><body><p>' && '邮箱:'     && APPLY_EMAIL && '</p></body></html>' )
      ( LINE = '<html><body><p>' && '单位名称:' && LV_NAME1  && '</p></body></html>' )
      ( LINE = '<html><body><p>' && '职位:'     && lv_PLANC_STEXT  && '</p></body></html>' )
      ( LINE = '<html><body><p>' && '</p></body></html>' )
      "( LINE = '请登录' && '<html><body><a href="' && LV_URL && '">' && 'iHR系统' && '</a></body></html>' && '选择' && APPLY_TYPE_TEXT && '磁贴,选择员工并下载打印。'  )
    ).

    IF <FS_MAIL>-apprlevel = 0.
      LT_BCSY_TEXT_END = VALUE #(
        ( LINE = '<html><body><p>' && '请等待本单位人力部门邮件或电话沟通处理结果。'  && '</p></body></html>' )
        ( LINE = '<html><body><p>' && '</p></body></html>' )
        ( LINE = '<html><body><p>' && 'iHR'   && '</p></body></html>' )
       ).
      APPEND LINES OF LT_BCSY_TEXT_END TO LT_BCSY_TEXT.
    ELSE.
      LT_BCSY_TEXT_END = VALUE #(
        ( LINE = '请及时登录' && '<html><body><a href="' && LV_URL && '">' && 'iHR系统打印证明并盖章处理' && '</a></body></html>' )
        ( LINE = '<html><body><p>' && '</p></body></html>' )
        ( LINE = '<html><body><p>' && 'iHR'   && '</p></body></html>' )
       ).
      APPEND LINES OF LT_BCSY_TEXT_END TO LT_BCSY_TEXT.
    ENDIF.


    CALL FUNCTION 'ZZF_SENT_MAIL'
      EXPORTING
        IN_TITLE           = LV_TITLE
        IN_EMAIL           = LV_EMAIL_FM
        IN_HTML            = 'X'
      TABLES
        ET_BCSY_TEXT       = LT_BCSY_TEXT
        .
  ENDLOOP.




ENDFORM.
posted @ 2020-07-15 22:18  linhuang  阅读(30)  评论(0编辑  收藏  举报  来源