abap - 发送邮件,邮件正文带表格和excel附件

发送内容 的数据获取:

  •  正文部分使用cl_document_bcs=>create_document静态方法实现
  •  传入参数为html内表结构 
      CLEAR lo_document .
      lo_document =  cl_document_bcs=>create_document(
                      i_type =    'HTM'
                      i_text =     lt_html
                      i_length =  conlengths
                      i_subject = lv_subject ).
  • 添加附件使用lo_document->add_attachment 
  • 传入参数为二进制数据(Excel的制作使用ZXLSX_WORKBENCH方式,百度搜ZXLSX_WORKBENCH就可以了)
      CALL METHOD lo_document->add_attachment
        EXPORTING
          i_attachment_type    = 'BIN'
          i_attachment_subject = lv_att_subject
          i_attachment_size    = lv_att_size
          i_att_content_hex    = lt_doc_table.

示例代码:

  DATA: lv_subject      TYPE so_obj_des,
        lo_send_request TYPE REF TO cl_bcs,
        lo_document     TYPE REF TO cl_document_bcs,
        conlengths      TYPE so_obj_len,
        bcs_exception   TYPE REF TO cx_bcs,
        bcs_message     TYPE string,
        lt_html         TYPE STANDARD TABLE OF w3html,  "存放HTML5代码的内表
        lw_html         TYPE w3html,                    "工作区
        lo_sender       TYPE REF TO cl_sapuser_bcs,     "发送人
        lv_to           TYPE adr6-smtp_addr,            "接收人
        lo_bcs_to       TYPE REF TO if_recipient_bcs,
        lv_cc           TYPE adr6-smtp_addr,            "抄送人
        lo_bcs_cc       TYPE REF TO if_recipient_bcs,
        lv_rawdata_01   TYPE mime_data,
        lv_doc_size     TYPE i,                                             "文件大小
        lt_doc_table    TYPE solix_tab,                                     "文件内容
        lv_att_size     TYPE so_obj_len,                                    "附件长度
        lv_att_subject  TYPE so_obj_des,                                    "附件名称
        lv_result       TYPE os_boolean,                "发送结果
        lo_fail         TYPE REF TO cx_bcs.             "异常信息

  DEFINE %%add_html.
    lw_html-line = &1.
    APPEND lw_html TO lt_html.
    CLEAR lw_html.
  END-OF-DEFINITION.

  SELECT * INTO TABLE @DATA(lt_emp) FROM ztlbmm_emp_email.

** 邮件主题
  lv_subject = '大仓多库位库存预警表'.
** 邮件正文
  %%add_html:'<html>',
               '<head>',
                 '<meta charset="utf-8" />',
                 '<title></title>',
                 '<style>table {text-align: center;}</style>',
               '</head>',
               '<body>',
                 '<h3>    为避免单个SKU存放多库位交货时,产品不能按批次先进先出原则,导致存在呆滞风险,',
                     '烦请仓库重点关注对产品库位进行管控;单个SKU多库位存放的成品预警明细见附件:</h3>',
                 '<table border="1" width="550px" height="150px" cellspacing="0" align="center">',
                   '<thead><tr>',
                     '<th>装运点</th>',
                     '<th>数据获取时间</th>',
                     '<th>SKU总数</th>',
                     '<th>多库位SKU总数</th>',
                     '<th>多库位SKU占比</th>',
                     '<th>增长率</th>',
                  '</tr></thead>'.
  LOOP AT lt_email INTO lw_email.   "存放表格数据
    %%add_html: '<tbody><tr>',
                  '<td>',  lw_email-name1,  '</td>',
                  '<td>',  lw_email-zdate,  '</td>',
                  '<td>',  lw_email-skun1,  '</td>',
                  '<td>',  lw_email-skun2,  '</td>',
                  '<td>',  lw_email-zcent,  '</td>',
                  '<td>',  lw_email-zupsn,  '</td>',
                '</tr></tbody>'.
    CLEAR:lw_email.
  ENDLOOP.
  %%add_html:   '</table>',
               '</body>',
             '</html>'.
    
  "开源项目ZXLSX_WORKBENCH使用方式
  CALL FUNCTION 'ZXLWB_CALLFORM'
    EXPORTING
      iv_formname         = 'ZMMR05B_TEMP'    "Excel 模板
      iv_context_ref      = lt_excel[]        "Excel 映射内表 会自动填充到模板
      iv_viewer_suppress  = 'X'
    IMPORTING
      ev_document_rawdata = lv_rawdata_01     "把EXCEL 转换为String类型的字符串
    EXCEPTIONS
      OTHERS              = 2.

  "附件部分
  CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
      EXPORTING
        buffer        = lv_rawdata_01        "传入ZXLSX_WORKBENCH处理的Excel字符串
      IMPORTING
        output_length = lv_doc_size
      TABLES
        binary_tab    = lt_doc_table.        "传出二进制内容
  "附件长度
  lv_att_size = lv_doc_size.
  "附件名称
  lv_att_subject = |{ sy-datum }_多库位预警报表.xlsx|.
 

  IF sy-subrc NE 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

    RETURN.
  ENDIF.
  
  " 开始发送流程
  TRY.
      "正文部分
      CLEAR lo_document .
      lo_document =  cl_document_bcs=>create_document(
                      i_type =    'HTM'         "正文选择HTML格式显示
                      i_text =     lt_html      "显示的内容
                      i_length =  conlengths   
                      i_subject = lv_subject ). "邮件主题
      
      "添加附件
      CALL METHOD lo_document->add_attachment
        EXPORTING
          i_attachment_type    = 'BIN'
          i_attachment_subject = lv_att_subject "附件主题
          i_attachment_size    = lv_att_size   
          i_att_content_hex    = lt_doc_table.  "附件内容

      "创建传输请求对象
      CLEAR lo_send_request.
      lo_send_request = cl_bcs=>create_persistent( ).
      
      "将文件对象放进传输请求对象
      CALL METHOD lo_send_request->set_document( lo_document ).
      
      " 发件人:前提是这个邮箱地址能发邮件,并且不需要密码
      lo_sender = cl_sapuser_bcs=>create( sy-uname ).
      lo_send_request->set_sender( lo_sender ).

      " 收件人
      lv_to = '这里填收件人邮箱'
      lo_bcs_to = cl_cam_address_bcs=>create_internet_address( lv_to ).
      CALL METHOD lo_send_request->add_recipient
         EXPORTING
           i_recipient = lo_bcs_to.

      " 抄送人
      lv_cc = '这里填抄送人邮箱'.
      lo_bcs_cc = cl_cam_address_bcs=>create_internet_address( lv_cc ).
      CALL METHOD lo_send_request->add_recipient
        EXPORTING
          i_recipient = lo_bcs_cc
          i_copy      = 'X'.

      "设置立即发送
      lo_send_request->set_send_immediately( 'X' ).

      "与outbox关联
      lo_send_request->send_request->set_link_to_outbox( 'X' ).

      "发送邮件
      CALL METHOD lo_send_request->send(
        EXPORTING
          i_with_error_screen = 'X'
        RECEIVING
          result              = lv_result ).
    CATCH cx_bcs INTO bcs_exception.
      bcs_message = bcs_exception->get_text( ).
      MESSAGE bcs_exception TYPE 'E'.
      EXIT.
  ENDTRY.

  IF lv_result EQ 'X'.
    COMMIT WORK AND WAIT.   "提交事务
  ELSE.
    ROLLBACK WORK.          "事务回滚
  ENDIF.

  IF sy-subrc NE 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

    RETURN.
  ENDIF.

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

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

相关文章

深入理解vqvae

深入理解vqvae TL; DR&#xff1a;通过 vector quantize 技术&#xff0c;训练一个离散的 codebook&#xff0c;实现了图片的离散表征。vqvae 可以实现图片的离散压缩和还原&#xff0c;在图片自回归生成、Stable Diffusion 中&#xff0c;有重要的应用。 从 AE 和 VAE 说起 …

如何在电脑上恢复查看iPhone短信?4个有效方法给你!

在当今科技发达的世界&#xff0c;能够在计算机上查看 iPhone 短信将彻底改变游戏规则。无论是存档珍贵的对话还是管理与工作相关的聊天&#xff0c;这都是一项至关重要的技能。在本指南中&#xff0c;我们将引导您了解如何在计算机上查看 iPhone 短信的四种高效方法。通过执行…

AI专题:AI应用落地的商业模式探索

今天分享的是AI 系列深度研究报告&#xff1a;《AI专题&#xff1a;AI应用落地的商业模式探索》。 &#xff08;报告出品方&#xff1a;国金证券&#xff09; 报告共计&#xff1a;27页 AI基座模型提供按量收费服务 以 ChatGPT 为代表的大模型能力涌现,为基座模型厂商带来增…

C++类和对象入门(三)

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 前言 在c中&#xff0c;类型分为两类&#xff0c;一类是内置类型&#xff0c;另一类是自定义类型。 1.内置类型&#xf…

作业:单身狗1

思路&#xff1a; 一&#xff1a;题目一开始就规定了这个数组的标准——只有一个数字出现一次&#xff0c;其他数字都是成对出现的&#xff0c;因此&#xff0c;重点就是如何排除成对的数&#xff0c;和保留单独的数 二&#xff1a;^的特点&#xff1a;相同为0&#xff0c;不…

docker自定义镜像并使用

写在前面 本文看下如何自定义镜像。 ik包从这里 下载。 1&#xff1a;自定义带有ik的es镜像 先看下目录结构&#xff1a; /opt/program/mychinese [rootlocalhost mychinese]# ll total 16 -rw-r--r-- 1 root root 1153 Feb 5 04:18 docker-compose.yaml -rw-rw-r-- 1 el…

Web课程学习笔记--CSS选择器的分类

CSS 选择器的分类 基本规则 通过 CSS 可以向文档中的一组元素类型应用某些规则 利用 CSS&#xff0c;可以创建易于修改和编辑的规则&#xff0c;且能很容易地将其应用到定义的所有文本元素 规则结构 每个规则都有两个基本部分&#xff1a;选择器和声明块&#xff1b;声明块由一…

06-Java适配器模式 ( Adapter Pattern )

原型模式 摘要实现范例 适配器模式&#xff08;Adapter Pattern&#xff09;是作为两个不兼容的接口之间的桥梁 适配器模式涉及到一个单一的类&#xff0c;该类负责加入独立的或不兼容的接口功能 举个真实的例子&#xff0c;读卡器是作为内存卡和笔记本之间的适配器。您将内…

2、ChatGPT 在数据科学中的应用

ChatGPT 在数据科学中的应用 ChatGPT 可以成为数据科学家的绝佳工具。以下是我所了解到的关于它擅长的地方和不那么擅长的地方。 我从使用 ChatGPT 中学到了一个教训。它在数据科学中非常有帮助,但你必须仔细检查它输出的所有内容。它非常适合某些任务,并且可以非常快速准确…

Linux Rootkit实验|01 基于修改系统调用表的Hook

Linux Rootkit实验&#xff5c;01 基于修改系统调用表的Hook 文章目录 Linux Rootkit实验&#xff5c;01 基于修改系统调用表的Hook实验说明实验环境实验过程一 基于修改sys_call_table的系统调用挂钩1 寻找sys_call_table内存地址2 关掉写保护3 修改sys_call_table 二 基于系统…

告别mPDF迎来TCPDF和中文打印遇到的问题

mPDF是一个用PHP编写的开源PDF生成库。它最初由Claus Holler创建&#xff0c;于2004年发布。原来用开源软件打印中文没有问题&#xff0c;最近发现新的软件包中mPDF被TCPDF代替了&#xff0c;当然如果只用西文的PDF是没有发现问题&#xff0c;但要打印中文就有点抓瞎了如图1&am…

【python数据分析基础】—dataframe中index的相关操作(添加、修改index的列名、修改index索引值等)

文章目录 前言一、添加、修改index的列名二、修改index索引值 前言 本文主要讲dataframe结构中index的相关操作&#xff0c;index相当于是数据表的行。 一、添加、修改index的列名 新建一个dataframe表&#xff0c;我们可以自定义index的值&#xff0c;如下&#xff1a; imp…

数据结构高级算法

目录 最小生成树 Kruskal(克鲁斯卡尔)(以边为核心) 9) 不相交集合(并查集合) 基础 Union By Size 图-相关题目 4.2 Greedy Algorithm 1) 贪心例子 Dijkstra Prim Kruskal 最优解(零钱兑换)- 穷举法 Leetcode 322 最优解(零钱兑换)- 贪心法 Leetcode 322 3)…

html5 audio video

DOMException: play() failed because the user didn‘t interact with the document first.-CSDN博客 不可用&#xff1a; 可用&#xff1a; Google Chrome Close AutoUpdate-CSDN博客

基于CNN+LSTM深度学习网络的时间序列预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 卷积神经网络&#xff08;CNN&#xff09; 4.2 长短时记忆网络&#xff08;LSTM&#xff09; 4.3 CNNLSTM网络结构 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MA…

2020年通信工程师初级 综合能力 真题

文章目录 第1章 通信职业道德&#xff0c;1-4第2章 法律法规&#xff0c;5-16第3章 计算机应用基础&#xff0c;第5章 现代通信网&#xff0c;38英语题&#xff0c;91 第1章 通信职业道德&#xff0c;1-4 1、职业道德在形式上具有()特点。 A.一致性 B.统一性 C.多样性 D.一般性…

PHP实现DESede/ECB/PKCS5Padding加密算法兼容Java SHA1PRNG

这里写自定义目录标题 背景JAVA代码解决思路PHP解密 背景 公司PHP开发对接一个Java项目接口&#xff0c;接口返回数据有用DESede/ECB/PKCS5Padding加密&#xff0c;并且key也使用了SHA1PRNG加密了&#xff0c;网上找了各种办法都不能解密&#xff0c;耗了一两天的时间&#xf…

【UE】游戏运行流程的简单理解

流程图 官方的游戏流程图&#xff1a; 一般顺序为初始化引擎、创建并初始化 GameInstance、加载关卡&#xff0c;最后开始游戏。 总的来说就是&#xff1a; 开始游戏-》游戏实例-》关卡-》游戏模式-》玩家控制器-》Pawn、玩家状态、HUD、UMG&#xff08;可有可无&#xff09; …

idea运行程序报错 java 程序包org.junit不存在

在 IntelliJ IDEA 中运行程序时遇到错误提示&#xff1a;“java: 程序包org.junit不存在”&#xff0c;针对这一问题&#xff0c;我们可以考虑以下三步来解决&#xff1a; 第一步&#xff1a;检查JUnit依赖 尽管现代项目创建时通常会默认引入JUnit依赖&#xff0c;但仍需检查…

postman 文档、导出json脚本 导出响应数据 response ,showdoc导入postman json脚本 导出为文档word或markdown

保存、补全尽可能多的数据、描述 保存响应数据 Response&#xff1a;&#xff08;如果导出接口数据&#xff0c;会同步导出响应数据&#xff09; 请求接口后&#xff0c;点击下方 Save as Example 可以保存响应数据到本地&#xff08;会在左侧接口下新增一个e.g. 文件用来保…