拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

在 SAP ABAP 中接入 Amazon Pinpoint:使用 AWS SDK for SAP ABAP 发送邮件、短信与模板消息实战指南

在 SAP ABAP 中接入 Amazon Pinpoint:使用 AWS SDK for SAP ABAP 发送邮件、短信与模板消息实战指南
  • 示例工程
  • 教程
  • 后端

【免费下载链接】aws-doc-sdk-examples

Welcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.

项目地址:https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples
点击查看免费下载

导读

本文基于 AWS 官方代码示例仓库aws-doc-sdk-examples中 sap-abab/services/ppt 目录的示例,完整讲解如何在 SAP ABAP 环境中通过 AWS SDK for SAP ABAP 调用 Amazon Pinpoint 的SendMessages服务接口。读完本文,你将掌握 Pinpoint 项目(Application)与模板的创建方式、邮件/短信/模板消息四条发送链路的完整 ABAP 实现、响应中消息 ID 的提取方法,以及配套 ABAP 单元测试的资源编排与最小权限 IAM 设计。

Amazon Pinpoint 通过邮件、SMS、语音消息和推送通知帮助企业与客户互动。本示例把该能力搬进了 SAP 技术栈:SAP 系统(如 S/4HANA)可通过 SDK 直接调用 Pinpoint,在业务流程中实时触达客户。

示例概览:仓库中与 Pinpoint 相关的文件

整个示例位于 sap-abap/services/ppt 目录,包含以下文件:

文件作用
#awsex#cl_ppt_actions.clas.abap核心示例类/awsex/cl_ppt_actions,封装了 4 个与 Pinpoint 消息发送相关的方法
#awsex#cl_ppt_actions.clas.testclasses.abap本地测试类ltc_awsex_cl_ppt_actions,覆盖 4 个方法的自动化验证与资源清理
#awsex#cl_ppt_actions.clas.xml类对象的 abapGit 元数据(描述为 "Pinpoint Code Example",启用单元测试WITH_UNIT_TESTS)
package.devc.xml开发包定义("Package for Pinpoint")
README.md官方示例说明文档(本文的骨架)

类定义中暴露了 4 个公开方法,全部围绕 Pinpoint 的SendMessages服务函数展开:

METHODS send_email_message IMPORTING iv_app_id TYPE /aws1/ppt__string " Pinpoint 项目 ID iv_sender TYPE /aws1/ppt__string " 发件人地址 it_to_addresses TYPE ...tt_listof__string " 收件人地址列表 iv_char_set TYPE /aws1/ppt__string " 字符集,如 UTF-8 iv_subject TYPE /aws1/ppt__string " 邮件主题 iv_html_message TYPE /aws1/ppt__string " HTML 正文 iv_text_message TYPE /aws1/ppt__string " 纯文本正文 EXPORTING ot_message_ids TYPE ...tt_mapofmessageresult RAISING /aws1/cx_rt_generic. METHODS send_sms_message IMPORTING iv_app_id / iv_origination_number / iv_destination_number iv_message / iv_message_type(pptmessagetype) EXPORTING ov_message_id RAISING /aws1/cx_rt_generic. METHODS send_templated_email_msg IMPORTING iv_app_id / iv_sender / it_to_addresses iv_template_name / iv_template_version EXPORTING ot_message_ids RAISING /aws1/cx_rt_generic. METHODS send_templated_sms_message IMPORTING iv_app_id / iv_destination_number / iv_message_type iv_origination_number / iv_template_name / iv_template_version EXPORTING ov_message_id RAISING /aws1/cx_rt_generic.

从源码结构可以看出,四条发送链路共用同一套 Pinpoint 客户端工厂/aws1/cl_ppt_factory=>create,仅在消息配置与模板配置上有所差异,这正是理解本文后续四个小节的主线。

环境准备:前置条件与 AWS 连接配置

在运行示例前需要完成以下准备(与 sap-abap 目录 README 中列出的全局要求一致):

  • AWS 账户:拥有可访问 Amazon Pinpoint 的 AWS 账户;
  • 默认凭证与区域:按 AWS SDK for SAP ABAP 的全局设置文档配置默认凭证(Access Key/Secret Key)与默认区域,SDK 运行时会读取这些全局配置;
  • SAP 系统环境:示例代码通过 abapGit 序列化(类、测试类、开发包均为 abapGit 格式),需将仓库导入 SAP 系统;
  • ABAP 运行时版本:代码依赖 AWS SDK for SAP ABAP 提供的/aws1/命名空间下的运行时类与类型(如cl_rt_session_aws、cl_ppt_factory及各请求/响应对象类)。

每个方法内部统一通过如下两行建立 Pinpoint 客户端,其中ZCODE_DEMO是会话使用的 AWS 配置 Profile ID:

CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). DATA(lo_ppt) = /aws1/cl_ppt_factory=>create( lo_session ).

关于成本与权限,仓库 README 明确提示:

  • 运行本代码(含测试)可能产生 AWS 费用;
  • 测试类被标记为RISK LEVEL DANGEROUS(见下文测试小节),会真实创建并删除 AWS 资源,只应在合适的测试 AWS 账户中运行;
  • 官方强烈建议遵循最小权限原则(Grant least privilege),只授予完成任务所需的最低权限。

单动作示例:四条 SendMessages 消息发送链路

README 中列出的单动作(Single actions)为 SendMessages。SendMessages是 Pinpoint 向端点(端点地址映射 + 消息配置)批量发送消息的核心 API。下面结合源码逐条拆解 4 个封装方法。

1. 发送普通邮件(send_email_message)

对应源码 第 66 行起的实现,核心代码分为三步:

第一步:把收件人列表转换为 Pinpoint 的地址配置映射表

Pinpoint 的MessageRequest要求地址以MapOfAddressConfiguration形式提供,每个收件人需要声明消息渠道(channelType):

DATA lt_addresses TYPE /aws1/cl_pptaddressconf=>tt_mapofaddressconfiguration. LOOP AT it_to_addresses INTO DATA(lo_address). INSERT VALUE /aws1/cl_pptaddressconf=>ts_mapofaddressconf_maprow( key = lo_address->get_value( ) value = NEW /aws1/cl_pptaddressconf( iv_channeltype = 'EMAIL' ) ) INTO TABLE lt_addresses. ENDLOOP.

第二步:组装消息请求并调用 sendmessages

DATA(lo_result) = lo_ppt->sendmessages( iv_applicationid = iv_app_id io_messagerequest = NEW /aws1/cl_pptmessagerequest( it_addresses = lt_addresses io_messageconfiguration = NEW /aws1/cl_pptdirectmessageconf( io_emailmessage = NEW /aws1/cl_pptemailmessage( iv_fromaddress = iv_sender io_simpleemail = NEW /aws1/cl_pptsimpleemail( io_subject = NEW /aws1/cl_pptsimpleemailpart( iv_charset = iv_char_set iv_data = iv_subject ) io_htmlpart = NEW /aws1/cl_pptsimpleemailpart( iv_charset = iv_char_set iv_data = iv_html_message ) io_textpart = NEW /aws1/cl_pptsimpleemailpart( iv_charset = iv_char_set iv_data = iv_text_message ) ) ) ) ) ).

请求对象层级为:MessageRequest → DirectMessageConfiguration → EmailMessage → SimpleEmail → (Subject/HtmlPart/TextPart)。邮件正文同时支持 HTML 与纯文本两种表示,且均需指定字符集(示例与测试均使用UTF-8)。

第三步:从响应中提取消息 ID

DATA(lo_message_response) = lo_result->get_messageresponse( ). ot_message_ids = lo_message_response->get_result( ).

get_result返回MapOfMessageResult(键为端点/收件人地址,值为MessageResult),调用方可据此判断每个收件人的投递结果。

2. 发送普通短信(send_sms_message)

实现位于 第 118 行起。与邮件不同,短信的地址映射表直接以目的地手机号为键,channelType声明为'SMS':

INSERT VALUE /aws1/cl_pptaddressconf=>ts_mapofaddressconf_maprow( key = iv_destination_number value = NEW /aws1/cl_pptaddressconf( iv_channeltype = 'SMS' ) ) INTO TABLE lt_addresses.

消息配置改为SMSMessage,需要提供短信正文body、消息类型messageType与发送方号码originationNumber:

DATA(lo_result) = lo_ppt->sendmessages( iv_applicationid = iv_app_id io_messagerequest = NEW /aws1/cl_pptmessagerequest( it_addresses = lt_addresses io_messageconfiguration = NEW /aws1/cl_pptdirectmessageconf( io_smsmessage = NEW /aws1/cl_pptsmsmessage( iv_body = iv_message iv_messagetype = iv_message_type iv_originationnumber = iv_origination_number ) ) ) ).

响应提取时,由于MapOfMessageResult以目的地号码为键,源码遍历结果表匹配iv_destination_number后取出messageid:

DATA(lt_results) = lo_message_response->get_result( ). LOOP AT lt_results INTO DATA(ls_result). IF ls_result-key = iv_destination_number. ov_message_id = ls_result-value->get_messageid( ). EXIT. ENDIF. ENDLOOP.

messageType类型为/aws1/pptmessagetype,测试中使用'TRANSACTIONAL'(事务型消息,不占用促销配额)。短信发送在 SMS 渠道未启用或账户处于沙箱环境时可能失败,这一约束在测试部分有专门处理,见下文。

3. 使用模板发送邮件(send_templated_email_msg)

实现位于 第 162 行起。模板消息与普通消息的差异在于:MessageRequest中新增templateConfiguration,并复用DirectMessageConfiguration → EmailMessage指定发件人:

DATA(lo_result) = lo_ppt->sendmessages( iv_applicationid = iv_app_id io_messagerequest = NEW /aws1/cl_pptmessagerequest( it_addresses = lt_addresses io_messageconfiguration = NEW /aws1/cl_pptdirectmessageconf( io_emailmessage = NEW /aws1/cl_pptemailmessage( iv_fromaddress = iv_sender ) ) io_templateconfiguration = NEW /aws1/cl_ppttemplateconf( io_emailtemplate = NEW /aws1/cl_ppttemplate( iv_name = iv_template_name iv_version = iv_template_version ) ) ) ).

模板配置对象为TemplateConfiguration → EmailTemplate,通过name(模板名)与version(版本号)定位具体模板;模板内容(主题、HTML/文本正文)由 Pinpoint 服务端渲染,客户端不再携带正文。测试中传入的版本号为'1'。

4. 使用模板发送短信(send_templated_sms_message)

实现位于 第 206 行起。这是模板机制在 SMS 渠道上的复用:地址映射与普通短信相同(键为目的地号码、channelType='SMS'),消息配置保留SMSMessage(messageType、originationNumber),模板配置则指向TemplateConfiguration → SmsTemplate:

io_templateconfiguration = NEW /aws1/cl_ppttemplateconf( io_smstemplate = NEW /aws1/cl_ppttemplate( iv_name = iv_template_name iv_version = iv_template_version ) ).

响应处理与普通短信完全一致:遍历结果表、按目的地号码取messageid。四条链路全部结束于MESSAGE ... TYPE 'I'状态提示(如'Email message sent successfully.'),便于在 ABAP 环境中直接观察执行结果。

源码级支撑:模板与项目的创建/清理约定

模板消息要真正可用,前提是 Pinpoint 侧已存在模板。测试类的class_setup展示了最小可用实践,可作为真实项目落地参考:

  • 创建 Pinpoint 项目:调用createapp,项目名形如abap-ppt-app-<uuid>,并打上convert_test=true标签;随后轮询getapp(wait_for_app_ready最多尝试 10 次、每次等待 2 秒)确认项目可用;
  • 创建邮件模板:createemailtemplate,请求包含subject、htmlPart(如<html><body><h1>Test Email</h1>...</body></html>)与textPart;
  • 创建短信模板:createsmstemplate,请求仅包含body文本;
  • 清理:class_teardown中依次调用deleteemailtemplate、deletesmstemplate、deleteapp删除测试资源。

模板创建是可选步骤(对应mobiletargeting:CreateEmailTemplate等权限):若创建失败,测试类会记录告警并CLEAR模板名,模板相关测试将跳过,而普通邮件/短信测试不受影响。uuid来自 sap-abab/util 目录 的/awsex/cl_utils=>get_random_string(内部调用GENERAL_GET_RANDOM_STRING生成 10 位随机串),用于保证每次测试资源名全局唯一。

单元测试:DANGEROUS 级别测试与测试地址约定

测试类 ltc_awsex_cl_ppt_actions 声明为:

CLASS ltc_awsex_cl_ppt_actions DEFINITION FOR TESTING DURATION SHORT RISK LEVEL DANGEROUS.

RISK LEVEL DANGEROUS意味着测试会真实创建/删除 AWS 资产,与 sap-abab 根 README 中的警示一致:只应在合适的测试 AWS 账户中运行。4 个测试方法(send_email_message、send_sms_message、send_templated_email_msg、send_templated_sms_message)覆盖 4 个动作方法,关键断言包括:

  • 邮件与模板邮件:断言ot_message_ids非空且恰好返回 1 条消息 ID;
  • 短信与模板短信:允许两种情况——正常返回message_id;或 API 调用成功但无消息 ID(SMS 渠道未配置),此时记录信息性消息;若抛出cx_pptbadrequestex(BadRequest),则检查错误文本是否与SMS/channel/phone/number相关,匹配则视为"调用结构正确、仅需配置 SMS 渠道",否则重新抛出异常。

测试数据使用了两类官方认可的虚拟地址/号码,无需真实申请即可跑通邮件链路:

  • 邮件:使用 Amazon SES 邮箱模拟器(mailbox simulator)地址success@simulator.amazonses.com,作为发件人iv_fromaddress与收件人均可,无需验证邮箱且不会投递真实邮件;
  • 短信:使用虚构测试号码,发件方originationNumber为+12065550100,目的地为+12065550142(206 区号、555-01XX 段的假号码)。

IAM 最小权限设计

测试类在源码注释中给出了完整的最小权限清单,这是把该示例接入生产环境的直接依据。按职责分组如下:

职责IAM 权限
发送消息(四条链路共用)mobiletargeting:SendMessages
创建/查询/删除 Pinpoint 项目mobiletargeting:CreateApp、mobiletargeting:TagResource、mobiletargeting:GetApp、mobiletargeting:DeleteApp(清理用)
创建/删除模板(可选)mobiletargeting:CreateEmailTemplate、mobiletargeting:CreateSmsTemplate、mobiletargeting:DeleteEmailTemplate、mobiletargeting:DeleteSmsTemplate
创建/管理 IAM 角色(可选)iam:CreateRole、iam:PutRolePolicy、iam:TagRole、iam:GetRole、iam:DeleteRole、iam:DeleteRolePolicy(清理用)

测试类的create_iam_role展示了角色配置细节:信任策略允许pinpoint.amazonaws.com服务主体执行sts:AssumeRole;内联策略PinpointSESPolicy授予ses:SendEmail、ses:SendRawEmail与sns:Publish,使 Pinpoint 可以经 SES 发送邮件、经 SNS 发送消息。若角色已存在(捕获cx_iamentityalrdyexex),则回退为getrole获取既有角色 ARN;角色创建失败时测试仍继续(记录告警),因为该角色只是可选增强项。

如何运行示例与测试

从 sap-abab 根 README 的说明可知,本仓库的 ABAP 示例通过SE24(类构建器)运行:将仓库通过 abapGit 导入 SAP 系统后,打开类/awsex/cl_ppt_actions即可逐个执行示例方法,或运行其测试类ltc_awsex_cl_ppt_actions完成自动化验证。

运行前请务必确认:

  1. AWS 凭证与默认区域已按 SDK 全局设置配置,Profile 名为ZCODE_DEMO;
  2. 使用的是测试/开发 AWS 账户,且拥有上表所列权限;
  3. 已了解运行会产生 AWS 费用(SMS 沙箱、SES 模拟器地址等场景下费用或限制因账户而异)。

结语

本示例以极简的单动作形式展示了 AWS SDK for SAP ABAP 与 Amazon Pinpoint 集成的完整闭环:从会话创建、客户端工厂、地址映射表构建,到普通/模板化邮件与短信的SendMessages调用、响应消息 ID 提取,再到 DANGEROUS 级别单元测试的资源编排与最小权限设计。若要进一步扩展,可在 sap-abab/services 目录中探索其他 AWS 服务在 SAP ABAP 环境下的同类示例模式。


Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.

SPDX-License-Identifier: Apache-2.0

  • 示例工程
  • 教程
  • 后端

【免费下载链接】aws-doc-sdk-examples

Welcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.

项目地址:https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples
点击查看免费下载
上一篇:ToolBench终极指南:打造智能工具调用大模型的完整教程
下一篇:Builder.IO:无头CMS的终极革命与现代化Web开发新范式

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

返回列表