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

news2024/11/19 3:16:57

发送内容 的数据获取:

  •  正文部分使用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.

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分享springboot框架的一个开源的本地开发部署教程(若依开源项目开发部署过程分享持续更新二开宝藏项目PostgresSQL数据库版)

1首先介绍下若依项目&#xff1a; 若依是一个基于Spring Boot和Spring Cloud技术栈开发的多租户权限管理系统。该开源项目提供了一套完整的权限管理解决方案&#xff0c;包括用户管理、角色管理、菜单管理、部门管理、岗位管理等功能。 若依项目采用前后端分离的架构&#xf…

Zephyr NRF7002 实现AppleJuice

BLE的基础知识 ble的信道和BR/EDR的信道是完全不一样的。但是范围是相同的&#xff0c;差不多也都是2.4Ghz的频道。可以简单理解为空中有40个信道0~39信道。两个设备在相同的信道里面可以进行相互通信。 而这些信道SIG又重新编号&#xff1a; 这个编号就是把37 38 39。 3个信道…

idea(2023.3.3 ) spring boot热部署,修改热部署延迟时间

1、添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional> </dependency>载入依赖 2、设置编辑器 设置两个选项 设置热部署更新延迟时…

seatunnel数据集成(一)简介与安装

seatunnel数据集成&#xff08;一&#xff09;简介与安装seatunnel数据集成&#xff08;二&#xff09;数据同步seatunnel数据集成&#xff08;三&#xff09;多表同步seatunnel数据集成&#xff08;四&#xff09;连接器使用 1、背景 About Seatunnel | Apache SeaTunnel …

构建高效直播美颜系统:美颜SDK集成与性能优化指南

如今&#xff0c;美颜技术的广泛应用成为各类直播平台的标配之一。今天&#xff0c;小编将与大家进一步讨论如何构建高效的直播美颜系统&#xff0c;重点关注美颜SDK的集成和性能优化方面。 一、美颜SDK的选择与集成 选择合适的美颜SDK是构建高效直播美颜系统的第一步。不同的…

Go语言每日一练 ——链表篇(三)

传送门 牛客面试笔试必刷101题 ---------------- 链表中的节点每k个一组翻转 题目以及解析 题目 解题代码及解析 package main import _"fmt" import . "nc_tools" /** type ListNode struct{* Val int* Next *ListNode* }*//*** 代码中的类名、方…

MongoDB从入门到实战之Docker快速安装MongoDB

前言 在上一篇文章中带领带同学们快速入门MongoDB这个文档型的NoSQL数据库&#xff0c;让大家快速的了解了MongoDB的基本概念。这一章开始我们就开始实战篇教程&#xff0c;为了快速把MongoDB使用起来我将会把MongoDB在Docker容器中安装起来作为开发环境使用。然后我这边MongoD…

MySQL学习一、库和表的基础操作

目录 一、常用数据类型 1.数值类型 2.字符串类型 3.日期类型 ​二、数据库的基础操作 三、表的基础操作 一、常用数据类型 1.数值类型 数值类型可以指定为无符号&#xff08;unsigned &#xff09;&#xff0c;但不建议取 2.字符串类型 3.日期类型 二、数据库的基础操作…

牛客“迎新春,过大年”多校程序设计竞赛A题

题目描述&#xff1a; 这里有个小trick 当时也看到数据范围的问题了 n 是 1 e 6 ∑ i 1 n a [ i ] < 5 e 7 n是1e6 \quad \sum_{i1}^na[i]<5e7 n是1e6∑i1n​a[i]<5e7 我们考虑不同的数 1 2 . . . k − 1 k 1 \quad 2 \quad ... k-1 \quad k 12...k−1k s u m …

如何在Windows系统上部署docker

上次在Windows系统上部署成功Ubuntu系统&#xff0c;这次准备在Windows上部署docker desktop应用 这个应用软件类似于虚拟机&#xff0c;可以在该应用软件上部署多个镜像容器。其最直观的表现就是可以借用Windows和Ubuntu终端来访问docker“模拟的系统”。 Docker简介 Docke…

(已解决)vue+element-ui实现个人中心,仿照原神

差一个个人中心页面&#xff0c;看到了这个博主的个人中心&#xff0c;真的很不错 地址&#xff1a;vueelement仿原神实现好看的个人中心 最终效果&#xff1a;

【论文研读】Better Together:Unifying Datalog and Equality Saturation

最近研究ReassociatePass整的头大&#xff0c;翻两篇Datalog的论文看看。 今天看的一篇是比较新的文章&#xff0c;23年4月贴到arxiv上的。 本文的主要贡献是提出了egglog,将Datalog和Eqsat结合起来&#xff0c;继承了Datalog的efficient incremental execution, cooperating a…

CISCRISC? CPU架构有哪些? x86 ARM?

编者按&#xff1a;鉴于笔者水平有限&#xff0c;文中难免有不当之处&#xff0c;还请各位读者海涵。 是为序 我猜&#xff0c;常年混迹CSDN的同学应该不会没听说过CPU吧&#xff1f; 但你真的了解CPU吗&#xff1f;那笔者问你CPU有哪些架构呢&#xff1f; 如果你对你的答案…

MC34063异常发热分析

问题描述&#xff1a; 工程现场反馈若干电源转换模块损坏&#xff0c;没有输出。拿到问题模块后&#xff0c;查看有一个MC34063周围的PCB有比较明显的高温痕迹&#xff0c;配套的电感也有明显的高温过热痕迹。 问题调查&#xff1a; MC34063的电路非常经典&#xff08;虽然自…

npm 上传一个自己的应用(3) 在项目中导入及使用自己上传到NPM的工具

上文 npm 上传一个自己的应用(2) 创建一个JavaScript函数 并发布到NPM 我们创建了一个函数 并发上了npm 最后 我们这里 我们可以看到它的安装指令 这里 我们可以打开一个vue项目 终端输入 我们的安装指令 npm i 自己的包 如下代码 npm i grtest我们在 node_modules目录 下…

《爬虫职海录》卷二 • 爬在广州

HI&#xff0c;朋友们好&#xff0c;「爬虫职海录」第二期更新啦&#xff01; 本栏目的内容方向会以爬虫相关的“岗位分析”和“职场访谈”为主&#xff0c;方便大家了解一下当下的市场行情。 本栏目持续更新&#xff0c;暂定收集国内主要城市的爬虫岗位相关招聘信息&#xf…

BUUCTF-Real-[ThinkPHP]IN SQL INJECTION

目录 漏洞描述 漏洞分析 漏洞复现 漏洞描述 漏洞发现时间&#xff1a; 2018-09-04 CVE 参考&#xff1a;CVE-2018-16385 最高严重级别&#xff1a;低风险 受影响的系统&#xff1a;ThinkPHP < 5.1.23 漏洞描述&#xff1a; ThinkPHP是一款快速、兼容、简单的轻量级国产P…

React 实现表单组件

表单是html的基础元素&#xff0c;接下来我会用React实现一个表单组件。支持包括输入状态管理&#xff0c;表单验证&#xff0c;错误信息展示&#xff0c;表单提交&#xff0c;动态表单元素等功能。 数据状态 表单元素的输入状态管理&#xff0c;可以基于react state 实现。 …

ubuntu22.04@laptop OpenCV Get Started: 000_hello_opencv

ubuntu22.04laptop OpenCV Get Started: 000_hello_opencv 1. 源由2. Hello OpenCV2.1 C应用Demo2.2 Python应用Demo 3. 参考资料 1. 源由 之前&#xff0c;通过敲门砖已经砸开了OpenCV的大门&#xff0c;接下来是体验下“Hello World&#xff01;”程序。 2. Hello OpenCV …

LeetCode:13.罗马数字转整数

13. 罗马数字转整数 - 力扣&#xff08;LeetCode&#xff09; 目录 思路&#xff1a; 官解代码&#xff1a; 作者辣眼代码: 每日表情包&#xff1a; 思路&#xff1a; 思路已经很明了了&#xff0c;题目已经给出一般规则和特殊规则&#xff08;而且题目确保给定的是正确的…