自学内容网 自学内容网

ABAP 发送正文含图片邮件

背景:

        客户要求系统发送的邮件内容中含logo图片

解决:

        参考outlook中带图片的邮件,有两种形式,一种为url链接,需要点击下载才展示图片,一种为直接显示;如果使用ABAP发送该类型的邮件,则需要发送HTML格式邮件,参考HTML展示图片,有如下三种实现方式

实现方式一
实现效果

        需要点击下载图片才会展示对应内容,效果比较差

实现方式

        上传图片到MIME资源库,然后通过公开链接访问该图片

代码示例:

DATA: lt_content    TYPE soli_tab,   "Email Content
      lv_subject    TYPE so_obj_des, "Email Subject
      ls_return     TYPE bapiret2,
      lv_sender     TYPE ad_smtpadr,
      ls_content    TYPE soli,
      lt_accept     TYPE bcsy_smtpa,
      lt_ccaccept   TYPE bcsy_smtpa,
      lv_accept     TYPE ad_smtpadr,
      lt_attachment TYPE  tfpattachments.

DATA: lv_url  TYPE string VALUE 'https://XXX/sap/public/bc/abap/mime_demo/header.jpg?sap-client=260'.

lv_accept = 'tutu@xie.com'.
APPEND lv_accept TO lt_accept.

lv_subject = |测试图片|.

lv_sender = 'fireworsk@xie.com'.

CLEAR ls_content.
ls_content-line = |<img src="&URL&" alt="image" /><br/>|.
REPLACE '&URL&' WITH  lv_url INTO ls_content.
APPEND ls_content TO lt_content.

CLEAR ls_content.
APPEND ls_content TO lt_content.

ls_content-line = '您好,'.
APPEND ls_content TO lt_content.

*--------------------------------------------------------------------*
" 邮件发送
*--------------------------------------------------------------------*
zcl_tool=>t_email(
   EXPORTING
     pi_type        = 'HTM'
     pi_subject     = lv_subject
     pi_sender      = lv_sender
     pi_sender_name = '测试'
     pt_accept      = lt_accept
     pt_ccaccept    = lt_ccaccept
     pt_content     = lt_content
     pt_attachment  = lt_attachment
    IMPORTING
      ps_return   = ls_return
).
实现方式二
实现效果

该实现方式在outlook中如上图,但是在移动端可能会出现图片附件或者图片未加载图标。

代码示例
DATA: lt_content    TYPE soli_tab,   "Email Content
      lv_subject    TYPE so_obj_des, "Email Subject
      ls_return     TYPE bapiret2,
      lv_sender     TYPE ad_smtpadr,
      ls_content    TYPE soli,
      lt_accept     TYPE bcsy_smtpa,
      lt_ccaccept   TYPE bcsy_smtpa,
      lv_accept     TYPE ad_smtpadr,
      lt_attachment TYPE  tfpattachments.

lv_accept = 'tutu@xie.com'.
APPEND lv_accept TO lt_accept.

lv_subject = |测试图片|.

lv_sender = 'fireworsk@xie.com'.

CLEAR ls_content.
ls_content-line = |<img src="cid:logo.jpg" alt="image" /><br/>|.
APPEND ls_content TO lt_content.

CLEAR ls_content.
APPEND ls_content TO lt_content.

ls_content-line = '您好,'.
APPEND ls_content TO lt_content.



cl_mime_repository_api=>get_api( )->get( EXPORTING i_url = `/sap/public/ydemo/header.jpg` IMPORTING e_content = DATA(lv_imgx) ).

lt_attachment = VALUE #( ( filename = 'logo'  mimetype = 'jpg' data = lv_imgx ) ).

*--------------------------------------------------------------------*
" 邮件发送
*--------------------------------------------------------------------*
zcl_tool=>t_email(
   EXPORTING
     pi_type        = 'HTM'
     pi_subject     = lv_subject
     pi_sender      = lv_sender
     pi_sender_name = '测试'
     pt_accept      = lt_accept
     pt_ccaccept    = lt_ccaccept
     pt_content     = lt_content
     pt_attachment  = lt_attachment
    IMPORTING
      ps_return   = ls_return
).
实现方式三
实现效果

outlook中展示和实现方式二一致,该方式为移动端和PC端均合适的实现方式

代码示例

DATA: lt_content         TYPE soli_tab,
      ls_content         TYPE soli,
      lt_attach_header   TYPE soli_tab,
      ls_attach_header   TYPE soli,
      lt_att_content_hex TYPE solix_tab,
      lv_outlength       TYPE i,
      lv_attch_size      TYPE so_obj_len,
      lv_content_size    TYPE so_obj_len,
      lv_send_return     TYPE os_boolean.

DATA: lo_send     TYPE REF TO cl_bcs,
      lo_document TYPE REF TO cl_document_bcs,
      lo_sender   TYPE REF TO cl_cam_address_bcs,
      lo_accept   TYPE REF TO cl_cam_address_bcs,
      lo_ccaccept TYPE REF TO cl_cam_address_bcs,
      lo_sap_user TYPE REF TO cl_sapuser_bcs,
      lo_bcs      TYPE REF TO cx_bcs.

DATA: lv_subject      TYPE so_obj_des,
      lv_sender        TYPE adr6-smtp_addr,
      lv_address_name TYPE adr6-smtp_addr.

DATA:lo_cx_send_req_bcs TYPE REF TO cx_send_req_bcs,
     lo_cx_address_bcs  TYPE REF TO cx_address_bcs.

DATA: lv_accept  TYPE ad_smtpadr,
      lv_message TYPE bapiret2-message.

DATA: ls_attachment TYPE sfpattachments,
      lv_doctype    TYPE so_obj_tp,
      lv_attsubject TYPE so_obj_des.

DATA: lo_mime TYPE REF TO cl_gbt_multirelated_service.

lv_subject = |测试图片|.

lv_sender       = 'tutu@xie.com'.
lv_address_name = '测试'.

lv_accept = 'fireworsk@xie.com'.

CLEAR ls_content.
ls_content-line = |<img src="cid:logo.jpg" alt="image" /><br/>|.
APPEND ls_content TO lt_content.

CLEAR ls_content.
APPEND ls_content TO lt_content.

ls_content-line = '您好,'.
APPEND ls_content TO lt_content.

CREATE OBJECT lo_mime.
cl_mime_repository_api=>get_api( )->get( EXPORTING i_url = `/sap/public/ydemo/header.jpg` IMPORTING e_content = DATA(lv_imgx) ).
DATA(lt_solix) = cl_bcs_convert=>xstring_to_solix( lv_imgx ).
DATA(lv_len)   = CONV so_obj_len( xstrlen( lv_imgx ) ).
CALL METHOD lo_mime->add_binary_part
  EXPORTING
    content      = lt_solix
    filename     = 'logo.jpg'
    extension    = 'jpg'
    content_type = 'image/jpg'
    length       = lv_len
    content_id   = 'logo.jpg'.

CALL METHOD lo_mime->set_main_html
  EXPORTING
    content = lt_content
*   filename    =
*   description =
  .

*&------Create Send Request
TRY.
    CALL METHOD cl_bcs=>create_persistent
      RECEIVING
        result = lo_send.
  CATCH cx_send_req_bcs INTO lo_cx_send_req_bcs.

ENDTRY.
IF lo_cx_send_req_bcs IS NOT INITIAL.
  lv_message = lo_cx_send_req_bcs->get_text( ).
  RETURN.
ENDIF.

*&------Get The Sender Email Adress
TRY.
    CALL METHOD cl_cam_address_bcs=>create_internet_address
      EXPORTING
        i_address_string = lv_sender
        i_address_name   = lv_address_name
*       i_incl_sapuser   =
      RECEIVING
        result           = lo_sender.

*&---------Set Sender
    CALL METHOD lo_send->set_sender
      EXPORTING
        i_sender = lo_sender.

  CATCH cx_address_bcs INTO lo_cx_address_bcs.
  CATCH cx_send_req_bcs INTO lo_cx_send_req_bcs.
ENDTRY.

" Error Deal
IF lo_cx_address_bcs IS NOT INITIAL.
  lv_message = lo_cx_address_bcs->get_text( ).
  RETURN.
ENDIF.

*&------Create Send Document Content
TRY.
    lo_document = cl_document_bcs=>create_from_multirelated(
        i_subject           = lv_subject
        i_multirel_service  = lo_mime ).
  CATCH cx_document_bcs INTO lo_bcs.
ENDTRY.

IF lo_bcs IS NOT INITIAL.
  lv_message = lo_bcs->get_text( ).
  RETURN.
ENDIF.

*&------Set Send Document For Send Request
TRY.
    CALL METHOD lo_send->set_document
      EXPORTING
        i_document = lo_document.
  CATCH cx_send_req_bcs INTO lo_bcs.
ENDTRY.
IF lo_bcs IS NOT INITIAL.
  lv_message = lo_bcs->get_text( ).
  RETURN.
ENDIF.

*&------Add Accept For Email
TRY.
    CLEAR lo_accept.
    CALL METHOD cl_cam_address_bcs=>create_internet_address
      EXPORTING
        i_address_string = lv_accept
*       i_address_name   =
*       i_incl_sapuser   =
      RECEIVING
        result           = lo_accept.

    CALL METHOD lo_send->add_recipient
      EXPORTING
        i_recipient  = lo_accept
        i_express    = 'X'
        i_copy       = ''
        i_blind_copy = ''
        i_no_forward = ''.
  CATCH cx_send_req_bcs INTO lo_bcs.
    lv_message = lo_bcs->get_text( ).
  CATCH cx_address_bcs INTO lo_bcs.
    lv_message = lo_bcs->get_text( ).
ENDTRY.

TRY.
    CALL METHOD lo_send->set_send_immediately
      EXPORTING
        i_send_immediately = 'X'.
  CATCH cx_send_req_bcs INTO lo_bcs.
    lv_message = lo_bcs->get_text( ).
    RETURN.
ENDTRY.

*&------Send Email
TRY.
    CALL METHOD lo_send->send
      EXPORTING
        i_with_error_screen = space
      RECEIVING
        result              = lv_send_return.

  CATCH cx_send_req_bcs INTO lo_bcs.
    lv_message = lo_bcs->get_text( ).
    RETURN.
ENDTRY.

COMMIT WORK AND WAIT.


原文地址:https://blog.csdn.net/xiefireworks/article/details/139421786

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!