邮件发送SAP后台作业日志及假脱机内容

假设有这么一个场景:
你有一些很重要的后台JOB在跑,但是你不想守着GUI,你想出去玩,或者忙其他的事情,但是你需要时刻关注这些JOB是不是失败了,你身边没有机器的情况下,还希望能看到JOB的日志和假脱机内容。
这个时候你就很希望能够有一封邮件发给你,里面是JOB执行的日志和假脱机内容,如下图:

17a94834ec64b55fa9fbfab867a7adcf.png

附件就是HTML格式的假脱机:

764961cff14c4a16a02ec641c2446266.png

下面代码是发送指定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

64054b1e41ea4fbe71c4d5840648a5bb.jpeg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值