SAP 发送邮件 带附件(内表)
前提
SAP发送邮件需BASIS进行配置,
view pic

附件添加逻辑
SAP发送邮件将ALV内表添加到附件,需要先将内表转换为二进制文件,邮件发送通过类:CL_BCS实现。
1.创建请求
view code
LO_SEND_REQUEST = CL_BCS=>CREATE_PERSISTENT( ).
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 ).
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.
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.
view code
*设置状态属性
LO_SEND_REQUEST->SET_STATUS_ATTRIBUTES(
I_REQUESTED_STATUS = 'E'
I_STATUS_MAIL = 'E' ).
LO_SEND_REQUEST->SET_SEND_IMMEDIATELY( ABAP_TRUE ).
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.
浙公网安备 33010602011771号