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.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/777172.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Educational Codeforces Round 167(Div.2) A~D

A.Catch the Coin&#xff08;思维&#xff09; 题意&#xff1a; Monocarp 参观了一家有街机柜的复古街机俱乐部。在那里&#xff0c;他对"抓硬币"游戏机产生了好奇。 游戏非常简单。屏幕上的坐标网格是这样的 X X X轴从左到右&#xff1b; Y Y Y轴从下往上&…

Java毕业设计 基于SSM vue新生报到系统小程序 微信小程序

Java毕业设计 基于SSM vue新生报到系统小程序 微信小程序 SSM 新生报到系统小程序 功能介绍 学生 登录 注册 忘记密码 首页 学校公告 录取信息 录取详情 师资力量 教师详情 收藏 评论 用户信息修改 宿舍安排 签到信息 在线缴费 教室分配 我的收藏管理 我要发贴 我的发贴 管理…

海外金融机构银行保险证券数字化转型营销销售数字化成功案例讲师培训师讲授开户销售营销客户AI人工智能创新思维

金融机构需要数字营销的主要原因 数字银行、直接存款和移动网络的兴起让客户无需前往当地分行即可轻松办理银行业务。这些举措不仅提升了用户体验&#xff0c;也迫使银行向数字化世界迈进。 金融服务公司需要在数字营销渠道上保持稳固的地位&#xff0c;以免落后于大型机构。…

罗剑锋的C++实战笔记学习(一):const、智能指针、lambda表达式

1、const 1&#xff09;、常量 const一般的用法就是修饰变量、引用、指针&#xff0c;修饰之后它们就变成了常量&#xff0c;需要注意的是const并未区分出编译期常量和运行期常量&#xff0c;并且const只保证了运行时不直接被修改 一般的情况&#xff0c;const放在左边&…

深度卷积神经网络 AlexNet

一、机器学习深度学习的发展 1、机器学习SVM方法 &#xff08;1&#xff09;20世纪90年代&#xff0c;基于统计学习理论的结果&#xff0c;开发了一种新型的学习算法——支持向量机&#xff08;SVM&#xff09;。这就产生了一类新的理论上优雅的学习机器&#xff0c;它们将SVM…

大厂面试官问我:MySQL宕机重启了,怎么知道哪些事务是需要回滚的哪些是需要提交的?【后端八股文九:Mysql事务八股文合集】

本文为【Mysql事务八股文合集】初版&#xff0c;后续还会进行优化更新&#xff0c;欢迎大家关注交流~ 大家第一眼看到这个标题&#xff0c;不知道心中是否有答案了&#xff1f;在面试当中&#xff0c;面试官经常对项目亮点进行深挖&#xff0c;来考察你对这个项目亮点的理解以及…

2024/7/6 英语每日一段

More than half of late-teens are specifically calling for more youth work that offers “fun”, with older teenagers particularly hankering for more jollity, according to a study carried out by the National Youth Agency. One in 10 said they have zero option…

vite+vue3整合less教程

1、安装依赖 pnpm install -D less less-loader2、定义全局css变量文件 src/assets/css/global.less :root {--public_background_font_Color: red;--publicHouver_background_Color: #fff;--header_background_Color: #fff;--menu_background: #fff; }3、引入less src/main.…

罗剑锋的C++实战笔记学习(二):容器、算法库、多线程

4、容器 1&#xff09;、容器的通用特性 所有容器都具有的一个基本特性&#xff1a;它保存元素采用的是值&#xff08;value&#xff09;语义&#xff0c;也就是说&#xff0c;容器里存储的是元素的拷贝、副本&#xff0c;而不是引用 容器操作元素的很大一块成本就是值的拷贝…

重大更新来袭!!《植物大战僵尸杂交版V2.1+修改器+融合版》

大家好&#xff01;每个软件更新总是令人兴奋不已。前段时间介绍的《植物大战僵尸》系列以其独特的策略玩法和丰富的植物角色&#xff0c;赢得了很多玩家的喜爱。而在今天&#xff0c;这款经典游戏全网最新版本——《植物大战僵尸&#xff1a;杂交版V2.1》正式推出&#xff0c;…

【Mindspore进阶】实战ResNet50图像分类

ResNet50图像分类 图像分类是最基础的计算机视觉应用&#xff0c;属于有监督学习类别&#xff0c;如给定一张图像(猫、狗、飞机、汽车等等)&#xff0c;判断图像所属的类别。本章将介绍使用ResNet50网络对CIFAR-10数据集进行分类。 ResNet网络介绍 ResNet50网络是2015年由微…

vue require引入静态文件报错

如果是通过向后端发送请求&#xff0c;动态的获取对应的文件数据流很容易做到文件的显示和加载。现在研究&#xff0c;一些不存放在后端而直接存放在vue前端项目中的静态媒体文件如何加载。 通常情况下&#xff0c;vue项目的图片jpg&#xff0c;png等都可以直接在/ass…

量化机器人:金融市场的智能助手

引言 想象一下&#xff0c;在繁忙的金融市场中&#xff0c;有一位不知疲倦、冷静客观的“超级交易员”&#xff0c;它能够迅速分析海量数据&#xff0c;精准捕捉交易机会&#xff0c;并自动完成买卖操作。这位“超级交易员”不是人类&#xff0c;而是我们今天要聊的主角——量…

Qt5.9.9 关于界面拖动导致QModbusRTU(QModbusTCP没有测试过)离线的问题

问题锁定 参考网友的思路&#xff1a; Qt5.9 Modbus request timeout 0x5异常解决 网友认为是Qt的bug&#xff0c; 我也认同&#xff1b;网友认为可以更新模块&#xff0c; 我也认同&#xff0c; 我也编译了Qt5.15.0的code并成功安装到Qt5.9.9中进行使用&#xff0c;界面拖…

从CPU的视角看C++的构造函数和this指针

从汇编角度&#xff0c;清晰的去看构造函数和this指针到底是个什么东西呢&#xff1f;也许可以解决你的一点小疑问 首先写一个很简单的代码demo&#xff1a; class A{ public:int a;A(){;}void seta(int _a){a_a;}A* getA(){return this;} };int fun1(int px){return px; }in…

全新桌面编辑器

目录 前言 一、链接 ONLYOFFICE 8.1版本 官网下载链接&#xff1a; ONLYOFFICE 在线工具&#xff1a; 下载版本推荐&#xff1a; 二、使用体验 1. 界面设计&#xff1a; 2. 文档编辑功能&#xff1a; 3. 电子表格功能&#xff1a; 4. 演示文稿功能&#xff1a; 5.PDF编…

python-开关灯(赛氪OJ)

[题目描述] 假设有 N 盏灯&#xff08;N 为不大于 5000 的正整数&#xff09;&#xff0c;从 1 到到 N 按顺序依次编号&#xff0c;初始时全部处于开启状态&#xff1b;第一个人&#xff08; 1 号&#xff09;将灯全部关闭&#xff0c;第二个人&#xff08; 2 号&#xff09;将…

nginx修改网站默认根目录及发布(linux、centos、ubuntu)openEuler软件源repo站点

目录 安装nginx配置nginx其它权限配置 安装nginx dnf install -y nginx配置nginx whereis nginxcd /etc/nginx llcd conf.d touch vhost.conf vim vhost.conf 命令模式下输入:set nu或:set number可以显示行号 复制如下内容&#xff1a; server {listen 80;server_name…

基于java+springboot+vue实现的流浪动物管理系统(文末源码+Lw)277

摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对流浪动物信息管理的提升&…

玩转Easysearch语法

Elasticsearch 是一个基于Apache Lucene的开源分布式搜索和分析引擎&#xff0c;广泛应用于全文搜索、结构化搜索、分析等多种场景。 Easysearch 作为Elasticsearch 的国产化替代方案&#xff0c;不仅保持了与原生Elasticsearch 的高度兼容性&#xff0c;还在功能、性能、稳定性…