假设有这么一个场景:
你有一些很重要的后台JOB在跑,但是你不想守着GUI,你想出去玩,或者忙其他的事情,但是你需要时刻关注这些JOB是不是失败了,你身边没有机器的情况下,还希望能看到JOB的日志和假脱机内容。
这个时候你就很希望能够有一封邮件发给你,里面是JOB执行的日志和假脱机内容,如下图:
附件就是HTML格式的假脱机:
下面代码是发送指定JOBNAME 和 JOBCOUNT的代码。
注意:如果是假脱机文件太大,有发送不出去的风险!
*&---------------------------------------------------------------------*
*& Report ZJOBLOGMAIL
*&---------------------------------------------------------------------*
*& BAITIANZHEN
*&---------------------------------------------------------------------*
REPORT zjoblogmail NO STANDARD PAGE HEADING.
DATA: gs_head TYPE tbtcjob.
DATA: gt_step TYPE TABLE OF tbtcstep,
gs_step TYPE tbtcstep.
DATA: BEGIN OF gs_atta,
type TYPE so_obj_tp ,
size TYPE so_obj_len,
subject TYPE so_obj_des,
content TYPE solix_tab ,
END OF gs_atta.
DATA: gt_atta LIKE TABLE OF gs_atta.
PARAMETERS: p_jobnam TYPE btcjob,
p_jobcnt TYPE btcjobcnt,
p_email TYPE ad_smtpadr.
START-OF-SELECTION.
PERFORM joblog_sendmail USING p_jobnam p_jobcnt.
*&---------------------------------------------------------------------*
*& 发送后台JOB的日志和假脱机
*& 日志以表格的形式包含在邮件内容中,假脱机以HTML格式作为邮件附件
*&---------------------------------------------------------------------*
FORM joblog_sendmail USING pv_jobname pv_jobcount.
DATA: lt_log TYPE TABLE OF tbtc5 WITH HEADER LINE.
DATA: lv_desc TYPE string.
DATA: lv_stat TYPE string.
DATA: lt_list TYPE TABLE OF solisti1.
DATA: lt_smtp TYPE TABLE OF ad_smtpadr.
DATA: lv_len TYPE i.
DATA: BEGIN OF lt_slog OCCURS 0,
enterdate TYPE tbtc5-enterdate,
entertime TYPE tbtc5-entertime,
text TYPE tbtc5-text ,
msgid TYPE tbtc5-msgid ,
msgno TYPE tbtc5-msgno ,
msgtype TYPE tbtc5-msgtype ,
END OF lt_slog.
CALL FUNCTION 'BP_JOB_READ'
EXPORTING
job_read_jobname = pv_jobname
job_read_jobcount = pv_jobcount
job_read_opcode = '20'
IMPORTING
job_read_jobhead = gs_head
TABLES
job_read_steplist = gt_step
EXCEPTIONS
OTHERS = 99.
IF sy-subrc NE 0.
MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
RETURN.
ENDIF.
CASE gs_head-status.
WHEN 'S'. lv_stat = '已释放'.
WHEN 'Y'. lv_stat = '就绪 '.
WHEN 'R'. lv_stat = '运行中'.
WHEN 'F'. lv_stat = '已完成'.
WHEN 'A'. lv_stat = '已取消'.
WHEN 'Z'. lv_stat = '已暂停'.
ENDCASE.
CONCATENATE '作 业: ' gs_head-jobname '<br/>'
'创 建 者: ' gs_head-sdluname '<br/>'
'计划开始: ' gs_head-sdlstrtdt gs_head-sdlstrttm '<br/>'
'实际开始: ' gs_head-strtdate gs_head-strttime '<br/>'
'Client :' gs_head-authckman '<br/>'
'状 态: ' lv_stat '<br/><br/>'
'JOB日志: ' INTO lv_desc SEPARATED BY space.
CALL FUNCTION 'BP_JOBLOG_READ'
EXPORTING
jobcount = pv_jobcount
jobname = pv_jobname
TABLES
joblogtbl = lt_log
EXCEPTIONS
OTHERS = 8.
LOOP AT lt_log.
MOVE-CORRESPONDING lt_log TO lt_slog.
APPEND lt_slog.
ENDLOOP.
PERFORM mail_body TABLES lt_slog lt_list
USING lv_desc '日期,时间,文本,消息类别,消息号,消息类型'
'XXXXXX' 5.
LOOP AT gt_step INTO gs_step WHERE listident IS NOT INITIAL.
PERFORM spooltohtml TABLES gs_atta-content
USING gs_step-listident CHANGING lv_len.
gs_atta-size = lv_len.
gs_atta-type = 'BIN'.
CONCATENATE gs_step-program '.html' INTO gs_atta-subject.
APPEND gs_atta TO gt_atta.
CLEAR gs_atta.
ENDLOOP.
APPEND p_email TO lt_smtp.
PERFORM mail_send_immed TABLES lt_list lt_smtp gt_atta
USING '测试JOB日志、假脱机Mail' .
ENDFORM. "job_log_mail
*&---------------------------------------------------------------------*
*& 假脱机转为HTML格式
*&---------------------------------------------------------------------*
FORM spooltohtml TABLES t_bintab USING pv_rqident CHANGING cv_blen.
DATA: lt_list TYPE TABLE OF abaplist.
DATA: lt_icon TYPE TABLE OF char32 WITH HEADER LINE.
DATA: lt_html TYPE TABLE OF w3html WITH HEADER LINE.
DATA: lv_html TYPE string.
DATA: lv_xstr TYPE xstring.
SUBMIT rspolst2 EXPORTING LIST TO MEMORY AND RETURN
WITH rqident = pv_rqident
WITH first = 1.
CALL FUNCTION 'LIST_FROM_MEMORY'
TABLES
listobject = lt_list
EXCEPTIONS
not_found = 1
OTHERS = 2.
CHECK sy-subrc = 0.
CALL FUNCTION 'WWW_HTML_FROM_LISTOBJECT'
EXPORTING
charset = '<meta http-equiv="Content-Type" content="text/html;charset=utf-8">'
TABLES
html = lt_html
listobject = lt_list
listicons = lt_icon.
LOOP AT lt_icon.
PERFORM icon_atta USING lt_icon.
ENDLOOP.
LOOP AT lt_html.
CONCATENATE lv_html lt_html INTO lv_html.
ENDLOOP.
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
EXPORTING
text = lv_html
mimetype = 'utf-8'
IMPORTING
buffer = lv_xstr
EXCEPTIONS
failed = 1
OTHERS = 2.
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
EXPORTING
buffer = lv_xstr
IMPORTING
output_length = cv_blen
TABLES
binary_tab = t_bintab.
ENDFORM. "spooltohtml
*&---------------------------------------------------------------------*
*& Form icon_atta
*&---------------------------------------------------------------------*
FORM icon_atta USING pv_objid.
DATA ls_key LIKE wwwdatatab.
DATA lt_mime TYPE TABLE OF w3mime.
ls_key-relid = 'MI'.
ls_key-objid = pv_objid.
READ TABLE gt_atta INTO gs_atta WITH KEY subject = pv_objid.
CHECK sy-subrc NE 0.
CALL FUNCTION 'WWWDATA_IMPORT'
EXPORTING
key = ls_key
TABLES
mime = lt_mime
EXCEPTIONS
OTHERS = 1.
CHECK sy-subrc = 0.
gs_atta-type = 'BIN'.
gs_atta-subject = pv_objid && '.gif'.
gs_atta-content = lt_mime.
APPEND gs_atta TO gt_atta.
CLEAR gs_atta.
ENDFORM. "icon_atta
*&---------------------------------------------------------------------*
*& 内表写到邮件表格
*&---------------------------------------------------------------------*
FORM mail_body TABLES t_intab t_body STRUCTURE solisti1
USING pv_str pv_coldesc pv_mask pv_toline.
DATA: lt_conts TYPE TABLE OF solisti1 WITH HEADER LINE,
lt_title TYPE TABLE OF char40 WITH HEADER LINE.
DATA: subrc TYPE sy-subrc,
index TYPE sy-index,
charc TYPE char2048,
charstr TYPE string,
lmask TYPE char200,
omitnum TYPE i,
ftype.
FIELD-SYMBOLS <fs_fld>.
CHECK t_intab[] IS NOT INITIAL.
SPLIT pv_coldesc AT ',' INTO TABLE lt_title.
lmask = pv_mask.
CALL FUNCTION 'SCMS_STRING_TO_FTEXT'
EXPORTING
text = pv_str
TABLES
ftext_tab = lt_conts.
APPEND:
`<style type="text/css">.solid{BORDER-TOP: 1px solid;` TO lt_conts,
`BORDER-RIGHT:1px solid;BORDER-BOTTOM: 1px solid; ` TO lt_conts,
`BORDER-LEFT: 1px solid}</style><table border=1 ` TO lt_conts,
`cellpadding=2 style='border-collapse:collapse;font- ` TO lt_conts,
`size:10.5pt'><tbody><tr style="background:#DDD9C4;">` TO lt_conts.
IF pv_toline > 0.
LOOP AT lt_title.
CONCATENATE '<td class="solid">' lt_title '</td>' INTO lt_conts-line.
APPEND lt_conts.
ENDLOOP.
APPEND `</tr>` TO lt_conts.
ENDIF.
LOOP AT t_intab FROM 0 TO pv_toline.
APPEND '<tr>' TO lt_conts.
CLEAR omitnum.
DO.
index = sy-index - 1.
ASSIGN COMPONENT sy-index OF STRUCTURE t_intab TO <fs_fld>.
IF sy-subrc NE 0.
EXIT.
ENDIF.
CHECK lmask+index(1) = 'X' OR lmask = ''.
omitnum = omitnum + 1.
DESCRIBE FIELD <fs_fld> TYPE ftype.
CASE ftype.
WHEN 'I' OR 'P' OR 'F' OR 'a' OR 'e' OR 'b' OR 's'.
charc = abs( <fs_fld> ).
CONDENSE charc NO-GAPS.
IF <fs_fld> < 0.
CONCATENATE '-' charc INTO charc.
ENDIF.
charstr = charc.
WHEN 'D' OR 'T'.
IF <fs_fld> IS INITIAL OR <fs_fld> = ''.
charc = ''.
ELSE.
WRITE <fs_fld> TO charc.
ENDIF.
charstr = charc.
WHEN 'X' OR 'y' OR 'g'.
charstr = <fs_fld>.
WHEN OTHERS.
WRITE <fs_fld> TO charc.
charstr = charc.
ENDCASE.
CONCATENATE '<td class="solid">' charstr '</td>' INTO lt_conts-line.
APPEND lt_conts.
ENDDO.
APPEND `</tr>` TO lt_conts.
ENDLOOP.
IF lines( t_intab ) > pv_toline.
APPEND '<tr>' TO lt_conts.
DO omitnum TIMES.
lt_conts-line = '<td class="solid">...</td>'.
APPEND lt_conts.
ENDDO.
APPEND '</tr>' TO lt_conts.
ENDIF.
APPEND '</tbody></table> <br/> ' TO lt_conts.
APPEND LINES OF lt_conts TO t_body.
ENDFORM. "mail_body
*&---------------------------------------------------------------------*
*& 邮件发送
*&---------------------------------------------------------------------*
FORM mail_send_immed TABLES t_body t_smtp t_atta USING p_subject.
DATA lr_email TYPE REF TO cl_bcs.
DATA lr_body TYPE REF TO cl_document_bcs.
DATA lr_receiver TYPE REF TO cl_cam_address_bcs.
DATA lr_sender TYPE REF TO if_sender_bcs.
DATA lv_result TYPE os_boolean.
TRY.
lr_email = cl_bcs=>create_persistent( ).
lr_body = cl_document_bcs=>create_document(
i_type = 'HTM'
i_text = t_body[]
i_subject = p_subject ).
LOOP AT t_atta INTO gs_atta.
CALL METHOD lr_body->add_attachment
EXPORTING
i_attachment_type = gs_atta-type
i_attachment_subject = gs_atta-subject
i_attachment_size = gs_atta-size
i_att_content_hex = gs_atta-content.
ENDLOOP.
lr_email->set_document( lr_body ).
LOOP AT t_smtp.
lr_receiver = cl_cam_address_bcs=>create_internet_address( t_smtp ).
lr_email->add_recipient( i_recipient = lr_receiver ).
ENDLOOP.
lr_sender = cl_sapuser_bcs=>create( sy-uname ).
lr_email->set_sender( lr_sender ).
lr_email->set_send_immediately( 'X' ).
lv_result = lr_email->send( i_with_error_screen = '' ).
CATCH cx_send_req_bcs.
CATCH cx_address_bcs.
CATCH cx_document_bcs.
ENDTRY.
IF lv_result = 'X'.
COMMIT WORK.
MESSAGE s000(oo) WITH '邮件已发送'.
ELSE.
MESSAGE s000(oo) WITH '发送邮件失败'.
ENDIF.
ENDFORM. "mail_send_immed