总结
针对发送邮件内容封装公用函数,针对不同业务场景,比如邮件统计排名晾晒类,各类业务催办类知会类邮件等,实现AUTO MAIL自动触发邮件。
1. 邮件发送内容:正文,附件,超链接等等
1.1 正文可以是一般内容或表格明细清单,涉及到很多格式的设置,用HTML格式设置。
1.2 附件可以是DOC, PDF ,EXCEL,JPG/PNG图片等等格式,附件以二进制流XSTRING类型
1.3 邮件中可设置超链接地址,比如用户催办邮件,用户点超链接,可以直接调整到待办单据页面。
2. 邮件发送监控
发送邮件tcode: scot 可以监控邮件发送状态及内容
如果系统中所有邮件发送不出去 跟BASIS排查系统问题;若单据功能发送不出,排查程序的问题。
相关事务代码:SO00,SCOT,SOST
- sost : 所有待发送的邮件清单,也可以监视邮件发送状态,也可以在此页面发送邮件!
- sbwp:发送邮件功能
- 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_CONTENT | TYPE | STRING | 邮件正文 | |
IM_SUBJECT | TYPE | SO_OBJ_DES | 邮件主题 | |
IM_MAIL | TYPE | BCSY_SMTPA | 主送邮件地址 | |
IM_CCMAIL | TYPE | BCSY_SMTPA | 抄送邮件地址 | |
IM_CCMAIL_BLIND | TYPE | BCSY_SMTPA | 密抄送邮件地址 | |
IM_SENDER | TYPE | SYST_UNAME | 'ICP-NOTICE' | 邮件发送人 |
IM_OTF | TYPE | TT_ITCOO | 附件PDF格式内表数据 | |
IM_CONTENT_HEX | TYPE | SOLIX_TAB | 附件EXCEL文件 | |
IM_CONTENT_DOC | TYPE | SOLIX_TAB | 附件WORD文件 | |
IM_CONTENT_PNG | TYPE | SOLIX_TAB | 附件图片文件 | |
IT_EXPERTS | TYPE | ZTTFI_GENERAL_RANGE | Table type for general range table | |
IM_IMG_TOP_NAME | TYPE | STRING | 顶部图片 | |
IM_IMG_BOTTOM_NAME | TYPE | STRING | 底部图片 | |
IM_ATTACHMENT_SUBJECT | TYPE | SO_OBJ_DES | 附件名称 | |
IM_XSTRING | TYPE | XSTRING | ||
IM_EXCEL_SIZE | TYPE | SO_OBJ_LEN | EXCEL文档内容大小 | |
IT_CONTENT_HEX | TYPE | ZTEXCEL_FJ | 邮件附件表类型 | |
IM_XLSX | TYPE | CHAR1 | 附件格式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/>'
&& '    每个月将下发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/> <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>' && ' 共计【' && 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>  下面为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.