本文介绍邮件推送服务如何通过集成阿里云事件总线服务,实现邮件投递结果的分发通知。
用户成功进行事件总线相关配置后,通过邮件推送服务发送的邮件,其投递结果将按照在事件总线中设置的事件分发规则,发送至指定的事件目标(钉钉、轻量消息队列、HTTP等),实现投递结果的异步获取。
下文将详细介绍如何完成事件分发设置。
邮件推送控制台开启事件分发功能
在邮件推送控制台打开事件分发开关。

事件总线服务开通与访问授权
1.在阿里云首页搜索事件总线或 EventBridge,免费开通事件总线服务




创建事件规则
在控制台-事件总线-云服务专用事件总线-创建规则,创建邮件推送服务的事件分发规则,配置基本信息,填写规则名称和描述;


配置事件模式,事件源类型为阿里云官方事件源,事件源选择acs.dm,事件类型目前支持发送失败、发送成功、点击链接、打开邮件,用户可按需添加,未添加的事件类型会被过滤。

配置事件目标,选择服务类型(钉钉、轻量消息队列、HTTP等,相关文档:管理事件规则)


这里以轻量消息队列为例,指定发送到的目标队列(轻量消息队列服务的开通与队列的创建请参考下文“开通轻量消息队列并创建消息接收的队列”章节),消息体默认选择完整事件,不进行base64编码,重试和死信选型可按需设置,设置完成后点击创建规则。

规则创建完成后,可在事件总线概览中进行查看。

事件类型和修改方式
目前支持的事件类型
事件类型 | type参数值 |
dm:Deliver:Fail | |
dm:Deliver:Succeed | |
dm:Feedback:FblReport | |
dm:Feedback:Subscribe | |
dm:Feedback:UnSubscribe | |
dm:Trace:Click | |
dm:Trace:Open | |
dm:Validator:GrayListResult |
修改各类事件的统计
左侧导航栏点击事件规则-编辑事件模式-事件类型,可对事件类型进行修改。


打开或者点击事件的统计的前提
如果需要对邮件的打开和点击行为事件进行通知分发,前提是开启数据跟踪功能,详细操作可参考如何开启数据跟踪功能?。
接收事件分发消息,验证链路已通
以上文流程设置的事件目标轻量消息队列为例,验证事件分发链路。
开通轻量消息队列并创建消息接收的队列
进入轻量消息队列控制台,若未开通轻量消息队列服务,则按引导先开通轻量消息队列服务。
单击左侧导航栏中队列,进入队列页面。
单击页面创建队列按钮,将会弹出新建队列对话框。
输入队列名称(队列名称用户可自由定义,本示例创建
delivery-result-queue名称的队列),其他按默认值即可,然后单击确认。

触发事件分发并查看
使用邮件推送服务发送一封邮件后,在事件总线控制台查看到事件的追踪记录;


查看事件分发目标的结果
打开轻量消息队列控制台,在队列列表选择事件总线目标配置的队列(案例中为delivery-result-queue)点击收发消息按钮,跳转至收发消息快速体验页面;

点击页面下方接收消息按钮,可查看到刚刚的事件消息,点击详情,可查看到对应的完整事件消息内容(可以看到事件ID与事件总线中的记录一致,事件即成功分发到了轻量消息队列);


设置发信地址级事件分发示例
按照以上示例流程配置的事件分发对邮件推送服务下所有的发信域名和地址生效,用户可根据实际业务需求,修改事件规则的JSON串,来实现按照发信地址等过滤条件进行事件分发。
以下是指定发信地址test@hangzhou.dmtest.top进行邮件推送事件分发的示例,通过进行规则配置,使得只有从test@hangzhou.dmtest.top发出的邮件,其记录消息才会由事件总线分发到事件目标。
1.在创建事件规则时,在模式内容中指定事件模式的具体内容,对指定字段内容进行过滤。

本示例中,模式内容如下:
{
"source": [
"acs.dm"
],
"type": [
"dm:Deliver:Fail",
"dm:Deliver:Succeed",
"dm:Trace:Click",
"dm:Trace:Open",
"dm:Feedback:FblReport"
],
"data": {
"from": [
"test@hangzhou.dmtest.top"
]
}
}这里是一个完整的事件消息体,用户可基于事件体的内容和结构,参考事件模式,编写事件规则的模式内容。
模式内容中的所有字段名都必须存在于事件体中,否则此事件消息会被过滤。
事件模式里的字段名必须和事件中的字段名具有相同嵌套结构。
事件模式是逐个字符精确匹配的 ,需注意大小写,匹配过程中不会对字符串进行任何标准化的操作。
要匹配的值遵循JSON规则:用引号引起来的字符串、数字以及不带引号的关键字true、false和null。
事件模式支持OR的语义,事件模式匹配中各个Key支持AND语义,Key的Value值支持数组OR的语义。
以下是事件默认的消息体
邮件投递失败
邮件投递失败时,事件总线EventBridge接收到的示例事件如下所示。
{
"data": {
"header": {
"X-Notify-Message-ID": "test******@******"
},
"env_id": "60000******",
"account": "batch******@top",
"from": "batch******@top",
"rcpt": "xxx******@aliyun.com",
"msg_id": "1df******@******",
"channel_name": "bg:vip_*",
"outbound_ip": "8.*.*.7",
"send_time": "2024-04-29T11:07:04",
"deliver_time": "2024-04-29T11:07:12",
"status": "2",
"event": "dm:Deliver:Fail",
"region": "cn-hangzhou",
"err_code": "554",
"err_msg": "554 RCPT xxx******@aliyun.com dosn't exist",
"failed_type": "SmtpNxBox",
"esp": "*mail.com",
"ip_pool_id": "10306c37-****-****-a82f-1dafb56a9dd2",
"is_dedicated_ip": true,
"tag": "xxxxx"
},
"id": "8734hhidu983hi457",
"source": "acs:dm",
"specversion": "1.0",
"subject": "acs:dm:cn-hangzhou:{AccountId}:*",
"time": "2024-04-29T11:07:12+08:00",
"type": "dm:Deliver:Fail",
"aliyunaccountid": "123456789098****",
"aliyunpublishtime": "2024-04-29T11:07:13.179PRC",
"aliyuneventbusname": "default",
"aliyunregionid": "cn-hangzhou",
"aliyunpublishaddr": "172.25.XX.XX"
}data字段包含的参数解释如下表所示。
参数 | 类型 | 示例值 | 描述 |
header | Object | 与电子邮件相关的头。 | |
X-Notify-Message-ID | String | test****@example.com | 自定义头X-Notify-Message-ID。 |
env_id | String | 60000**** | 发送邮件时系统返回的邮件ID。 |
account | String | batch****@top | 发件人的邮箱地址。 |
from | String | batch****@top | 发件人的邮箱地址。 |
rcpt | String | a****@aliyun.com | 收件人的邮箱地址。 |
msg_id | String | 1df****@example.com | 邮件的Message-ID字段。 |
channel_name | String | bg:vip_* | 本次投递外发IP所在的通道名称。 |
outbound_ip | String | 8.*.*.7 | 本次投递外发IP。 |
send_time | String | 2024-04-29T11:07:04 | 邮件接收时间。 |
deliver_time | String | 2024-04-29T11:07:12 | 邮件投递完成时间。 |
status | String | 2 | 投递结果状态。
|
event | String | dm:Deliver:Fail | 事件消息的类型。和type相同。 |
region | String | cn-hangzhou | 事件发生的区域。 |
err_code | String | 554 | 投递完成时接收方ESP返回的码。 |
err_msg | String | 554 RCPT a****@aliyun.com dosn't exist | 投递完成时接收方ESP返回的信息。 |
failed_type | String | SmtpNxBox | 投递结果分类。 |
esp | String | *mail.com | 收信人的电子邮件提供商分类。 |
ip_pool_id | String | 10306c37-****-****-a82f-1dafb56a9dd2 | 发送邮件使用的IP池ID。 |
is_dedicated_ip | Boolean | true | 是否使用了独立IP。 |
tag | String | xxxxx | 发送邮件使用的tag。 |
邮件投递成功
邮件投递成功时,事件总线EventBridge接收到的示例事件如下所示。
{
"data": {
"header": {
"X-Notify-Message-ID": "test******@******"
},
"env_id": "60000******",
"account": "batch******@top",
"from": "batch******@top",
"rcpt": "xxx******@aliyun.com",
"msg_id": "1df******@******",
"channel_name": "bg:vip_*",
"outbound_ip": "8.*.*.7",
"send_time": "2024-04-29T11:07:04",
"deliver_time": "2024-04-29T11:07:12",
"status": "0",
"event": "dm:Deliver:Succeed",
"region": "cn-hangzhou",
"err_code": "250",
"err_msg": "250 Send Mail OK",
"failed_type": "SendOk",
"esp": "*mail.com",
"ip_pool_id": "10306c37-****-****-a82f-1dafb56a9dd2",
"is_dedicated_ip": true,
"tag": "xxxxx"
},
"id": "8734hhidu983hi457",
"source": "acs:dm",
"specversion": "1.0",
"subject": "acs:dm:cn-hangzhou:{AccountId}:*",
"time": "2024-04-29T11:07:12+08:00",
"type": "dm:Deliver:Succeed",
"aliyunaccountid": "123456789098****",
"aliyunpublishtime": "2024-04-29T11:07:13.179PRC",
"aliyuneventbusname": "default",
"aliyunregionid": "cn-hangzhou",
"aliyunpublishaddr": "172.25.XX.XX"
}关于data字段包含的参数解释,请参见参数解析。
邮件FBL举报数据
邮件FBL举报数据时,事件总线EventBridge接收到的示例事件如下所示。
{
"id": "45ef4dewdwe1-7c35-447a-bd93-fab****",
"source": "acs.dm",
"specversion": "1.0",
"subject": "acs.dm:cn-hangzhou:123456789098****:215672",
"time": "2020-11-19T21:04:41+08:00",
"type": "dm:Feedback:FblReport",
"aliyunaccountid": "123456789098****",
"aliyunpublishtime": "2020-11-19T21:04:42Z",
"aliyuneventbusname": "default",
"aliyunregionid": "cn-hangzhou",
"aliyunpublishaddr": "172.25.XX.XX",
"data": {
"send_time": "1726821644",
"send_email": "from@xxx.com",
"block_email": "to@yyy.com",
"subject": "Hello Mr.xxx",
"message_id": "<msgid***@xxx.com>",
"block_time": "1726821667",
"fbl_isp": "outlook**",
"fingerprint": "SMTPD_abc****"
}
}
data字段包含的参数解释如下表所示。
参数 | 类型 | 示例值 | 描述 |
send_time | String | 1726821644 | 邮件发送时间。 |
send_email | String | from@xxx.com | 发件人邮箱地址。 |
block_email | String | to@yyy.com | 被拦截的收件人邮箱地址。 |
subject | String | Hello Mr.xxx | 邮件主题。 |
message_id | String | <msgid***@xxx.com> | 邮件的唯一标识符。 |
block_time | String | 1726821667 | 邮件被拦截的时间。 |
fbl_isp | String | outlook** | 发件人使用的邮件服务提供商(ISP)。 |
fingerprint | String | SMTPD_abc**** | 邮件的特征指纹。 |
邮件重新订阅数据
邮件重新订阅数据时,事件总线EventBridge接收到的示例事件如下所示。
{
"id": "45ef4dewdwe1-7c35-447a-bd93-fab****",
"source": "acs.dm",
"specversion": "1.0",
"subject": "acs.dm:cn-hangzhou:123456789098****:215672",
"time": "2020-11-19T21:04:41+08:00",
"type": "dm:Feedback:Subscribe",
"aliyunaccountid": "123456789098****",
"aliyunpublishtime": "2020-11-19T21:04:42Z",
"aliyuneventbusname": "default",
"aliyunregionid": "cn-hangzhou",
"aliyunpublishaddr": "172.25.XX.XX",
"data": {
"operate_time": "2024-04-29T11:25:48",
"envid": "6000*********",
"from": "from@xxx.com",
"rcpt": "to@yyy.com",
"client_ip": "102.**.**.1"
}
}
data字段包含的参数解释如下表所示。
参数 | 类型 | 示例值 | 描述 |
operate_time | String | 2024-04-29T11:25:48 | 事件操作时间(UTC时间) |
env_id | String | 6000********* | 发送邮件时系统返回的邮件ID |
from | String | from@xxx.com | 发件人地址 |
rcpt | String | to@yyy.com | 收件人地址 |
client_ip | String | 102.**.**.1 | 打开事件的客户端IP |
邮件退订数据
邮件退订数据时,事件总线EventBridge接收到的示例事件如下所示。
{
"id": "45ef4dewdwe1-7c35-447a-bd93-fab****",
"source": "acs.dm",
"specversion": "1.0",
"subject": "acs.dm:cn-hangzhou:123456789098****:215672",
"time": "2020-11-19T21:04:41+08:00",
"type": "dm:Feedback:UnSubscribe",
"aliyunaccountid": "123456789098****",
"aliyunpublishtime": "2020-11-19T21:04:42Z",
"aliyuneventbusname": "default",
"aliyunregionid": "cn-hangzhou",
"aliyunpublishaddr": "172.25.XX.XX",
"data": {
"operate_time": "2024-04-29T11:25:48",
"envid": "6000*********",
"from": "from@xxx.com",
"rcpt": "to@yyy.com",
"client_ip": "102.**.**.1"
}
}
data字段包含的参数解释如下表所示。
参数 | 类型 | 示例值 | 描述 |
operate_time | String | 2024-04-29T11:25:48 | 事件操作时间(UTC时间) |
env_id | String | 6000********* | 发送邮件时系统返回的邮件ID |
from | String | from@xxx.com | 发件人地址 |
rcpt | String | to@yyy.com | 收件人地址 |
client_ip | String | 102.**.**.1 | 打开事件的客户端IP |
点击事件
点击事件时,事件总线EventBridge接收到的示例事件如下所示。
{
"id": "45ef4dewdwe1-7c35-447a-bd93-fab****",
"source": "acs.dm",
"specversion": "1.0",
"subject": "acs.dm:cn-hangzhou:123456789098****:215672",
"time": "2020-11-19T21:04:41+08:00",
"type": "dm:Trace:Click",
"aliyunaccountid": "123456789098****",
"aliyunpublishtime": "2020-11-19T21:04:42Z",
"aliyuneventbusname": "default",
"aliyunregionid": "cn-hangzhou",
"aliyunpublishaddr": "172.25.XX.XX",
"data": {
"operate_time": "2024-04-29T11:25:48",
"client_ip": "202.**.**.1",
"env_id": "60000******",
"from": "batch******@top",
"rcpt": "xxx******@aliyun.com",
"msg_id": "1df******@******",
"event": "dm:Trace:Click",
"region": "cn-hangzhou",
"url": "https://www.aliyun.com",
"outbound_ip": "102.**.**.1",
"esp": "*mail.com",
"ip_pool_id": "10306c37-****-****-a82f-1dafb56a9dd2",
"is_dedicated_ip": true,
"user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X ****) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1",
"tag": "xxxxx"
}
}
data字段包含的参数解释如下表所示。
参数 | 类型 | 示例值 | 描述 |
operate_time | String | 2024-04-29T11:25:48 | 事件操作时间。 |
client_ip | String | 202.**.**.1 | 点击事件的客户端IP。 |
env_id | String | 60000****** | 发送邮件时系统返回的邮件ID。 |
from | String | batch****@top | 发件人地址。 |
rcpt | String | xxx******@aliyun.com | 收件人地址。 |
msg_id | String | 1df******@****** | 邮件中的Message-ID字段。 |
event | String | dm:Trace:Click | 事件类型。 |
region | String | cn-hangzhou | 事件发生的区域。 |
url | String | https://www.aliyun.com | 点击的URL。 |
outbound_ip | String | 102.**.**.1 | 发送邮件的出口IP。 |
esp | String | *mail.com | 收信人的电子邮件提供商分类。 |
ip_pool_id | String | 10306c37-****-****-a82f-1dafb56a9dd2 | 发送邮件使用的IP池的ID。 |
is_dedicated_ip | Boolean | true | 是否使用了独立IP。 |
user_agent | String | Mozilla/5.0 (Macintosh; Intel Mac OS X ****) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1 | 点击事件的UserAgent。 |
tag | String | xxxxx | 发送邮件使用的tag。 |
打开事件
打开事件时,事件总线EventBridge接收到的示例事件如下所示。
{
"id": "45ef4dewdwe1-7c35-447a-bd93-fab****",
"source": "acs.dm",
"specversion": "1.0",
"subject": "acs.dm:cn-hangzhou:123456789098****:215672",
"time": "2020-11-19T21:04:41+08:00",
"type": "dm:Trace:Open",
"aliyunaccountid": "123456789098****",
"aliyunpublishtime": "2020-11-19T21:04:42Z",
"aliyuneventbusname": "default",
"aliyunregionid": "cn-hangzhou",
"aliyunpublishaddr": "172.25.XX.XX",
"data": {
"operate_time": "2024-04-29T11:25:48",
"client_ip": "202.**.**.1",
"env_id": "60000******",
"from": "batch******@top",
"rcpt": "xxx******@aliyun.com",
"msg_id": "1df******@******",
"event": "dm:Trace:Open",
"region": "cn-hangzhou",
"outbound_ip": "102.**.**.1",
"esp": "*mail.com",
"ip_pool_id": "10306c37-****-****-a82f-1dafb56a9dd2",
"is_dedicated_ip": true,
"user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X ****) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1",
"tag": "xxxxx"
}
}
data字段包含的参数解释如下表所示。
参数 | 类型 | 示例值 | 描述 |
operate_time | String | 2024-04-29T11:25:48 | 事件操作时间。 |
client_ip | String | 192.168.XX.XX | 打开事件的客户端IP。 |
env_id | String | 60000****** | 发送邮件时系统返回的邮件ID。 |
from | String | batch****@top | 发件人地址。 |
rcpt | String | a****@aliyun.com | 收件人地址。 |
msg_id | String | 1df****@example.com | 邮件中的Message-ID字段。 |
event | String | dm:Trace:Click | 事件类型。 |
region | String | cn-hangzhou | 事件发生的区域。 |
outbound_ip | String | 102.**.**.1 | 发送邮件的出口IP。 |
esp | String | *mail.com | 收信人的电子邮件提供商分类。 |
ip_pool_id | String | 10306c37-****-****-a82f-1dafb56a9dd2 | 发送邮件使用的IP池的ID。 |
is_dedicated_ip | Boolean | true | 是否使用了独立IP。 |
user_agent | String | Mozilla/5.0 (Macintosh; Intel Mac OS X ****) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1 | 打开事件的UserAgent。 |
tag | String | xxxxx | 发送邮件使用的tag。 |
地址校验灰名单异步结果
地址校验灰名单异步结果时,事件总线EventBridge接收到的示例事件如下所示。
{
"id": "45ef4dewdwe1-7c35-447a-bd93-fab****",
"source": "acs.dm",
"specversion": "1.0",
"subject": "acs.dm:cn-hangzhou:123456789098****:215672",
"time": "2020-11-19T21:04:41+08:00",
"type": "dm:Validator:GrayListResult",
"aliyunaccountid": "123456789098****",
"aliyunpublishtime": "2020-11-19T21:04:42Z",
"aliyuneventbusname": "default",
"aliyunregionid": "cn-hangzhou",
"aliyunpublishaddr": "172.25.XX.XX",
"data": {
"request_id": "45ef4dewdwe1-7c35-447a-bd93-fab****",
"submission_time": "1763541726",
"completion_time": "1763541793",
"email": "xxxxxx@yyy.com",
"status": "INVALID",
"sub_status": "MAILBOX_NOT_EXISTS",
"provider": "XXXX",
"is_free_mail": false,
"local_part": "xxxxxx",
"domain_part": "yyy.com"
}
}
data字段包含的参数解释如下表所示。
参数 | 类型 | 示例值 | 描述 |
request_id | String | 45ef4dewdwe1-7c35-447a-bd93-fab**** | 提交请求时OPENAPI返回的请求ID |
submission_time | String | 1763541726 | 提交校验请求时间(UTC时间) |
completion_time | String | 1763541793 | 校验完成时间(UTC时间) |
String | xxxxxx@yyy.com | 校验的电子邮件地址 | |
status | String | INVALID | 校验得到的电子邮件地址状态 |
sub_status | String | MAILBOX_NOT_EXISTS | 校验得到的电子邮件地址子状态,是对状态的详细描述 |
provider | String | XXXX | 地址的电子邮件提供商分类 |
is_free_mail | Boolean | false | 地址是否为免费邮箱 |
local_part | String | xxxxxx | 语法校验解析得到的电子邮件地址的本地部分(经过小写化与去掉+号部分) |
domain_part | String | yyy.com | 语法校验解析得到的电子邮件地址的域名部分(经过小写化) |
相关文档:邮件推送事件
事件详情里的时间字段统一是UTC时间格式
2.进行发信验证,通过test@hangzhou.dmtest.top发送一封邮件;

3.在轻量消息队列的队列中(本示例和设置事件分发流程一样,采用轻量消息队列作为事件目标接收事件消息,用户可自行设置事件目标)可查询到此条消息。

4.使用其他发信地址发信后,在事件总线-事件追踪中查询到了该事件的详情,但在轻量消息队列侧,不会收到此条事件消息,即实现了指定发信地址的回调通知。

