设置事件分发

本文介绍邮件推送服务如何通过集成阿里云事件总线服务,实现邮件投递结果的分发通知。

用户成功进行事件总线相关配置后,通过邮件推送服务发送的邮件,其投递结果将按照在事件总线中设置的事件分发规则,发送至指定的事件目标(轻量消息队列、HTTP等),实现投递结果的异步获取。

下文将详细介绍如何完成事件分发设置。

事件总线服务开通与访问授权

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

image.png

image.png

image.png

image.png

创建事件规则

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

image.png

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

image.png

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

image.png

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

image.png

事件类型和修改方式

目前支持的事件类型

  • 投递成功:Deliver:Success

  • 投递失败:Deliver:Fail

  • 打开邮件:Deliver:Open

  • 点击邮件中的链接:Deliver:Click

修改各类事件的统计

左侧导航栏点击事件规则-编辑事件模式-事件类型,可对事件类型进行修改。

image.png

image.png

打开或者点击事件的统计的前提

如果需要对邮件的打开和点击行为事件进行通知分发,前期是开启数据跟踪功能,详细操作可参考如何开启数据跟踪功能?

接收事件分发消息,验证链路已通

以上文流程设置的事件目标轻量消息队列为例,验证事件分发链路。

开通轻量消息队列并创建消息接收的队列

  1. 进入轻量消息队列控制台,若未开通轻量消息队列服务,则按引导先开通轻量消息队列服务。

  2. 单击左侧导航栏中队列,进入队列页面。

  3. 单击页面创建队列按钮,将会弹出新建队列对话框。

  4. 输入队列名称(队列名称用户可自由定义,本示例创建delivery-result-queue名称的队列),其他按默认值即可,然后单击确认。

image.png

触发事件分发并查看

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

image.png

image.png

查看事件分发目标的结果

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

image.png

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

image.png

image.png

设置发信地址级事件分发示例

按照以上示例流程配置的事件分发对邮件推送服务下所有的发信域名和地址生效,用户可根据实际业务需求,修改事件规则的JSON串,来实现按照发信地址等过滤条件进行事件分发。

以下是指定发信地址test@hangzhou.dmtest.top进行邮件推送事件分发的示例,通过进行规则配置,使得只有从test@hangzhou.dmtest.top发出的邮件,其记录消息才会由事件总线分发到事件目标。

1.在创建事件规则时,在模式内容中指定事件模式的具体内容,对指定字段内容进行过滤。

image.png

本示例中,模式内容如下:

{
    "source": [
        "acs.dm"
    ],
    "type": [
        "dm:Deliver:Fail",
        "dm:Deliver:Succeed",
        "dm:Trace:Click",
        "dm:Trace:Open"
    ],
    "data": {
        "from": [
            "test@hangzhou.dmtest.top"
        ]
    }
}

这里是一个完整的事件消息体,用户可基于事件体的内容和结构,参考事件模式,编写事件规则的模式内容。

  • 模式内容中的所有字段名都必须存在于事件体中,否则此事件消息会被过滤。

  • 事件模式里的字段名必须和事件中的字段名具有相同嵌套结构。

  • 事件模式是逐个字符精确匹配的 ,需注意大小写,匹配过程中不会对字符串进行任何标准化的操作。

  • 要匹配的值遵循JSON规则:用引号引起来的字符串、数字以及不带引号的关键字truefalsenull

  • 事件模式支持OR的语义,事件模式匹配中各个Key支持AND语义,Key的Value值支持数组OR的语义。

{
    "datacontenttype": "application/json;charset=utf-8",
    "aliyunaccountid": "1491110661959791",
    "data": {
        "rcpt": "example@example.com",
        "deliver_time": "2024-05-22T08:27:42Z",
        "err_code": "250",
        "failed_type": "SendOk",
        "env_id": "600000083914199845",
        "send_time": "2024-05-22T08:27:41Z",
        "err_msg": "250 Send Mail OK",
        "header": {},
        "from": "example2@aliyun.com",
        "event": "dm:Deliver:Succeed",
        "region": "cn-hangzhou",
        "msg_id": "d93a742c-adec-487d-8c39-98069c583760@example.net",
        "account": "example2@aliyun.com",
        "status": 0
    },
    "subject": "acs:dm:cn-hangzhou:1491110661959791:*",
    "aliyunoriginalaccountid": "1491110661959791",
    "source": "acs.dm",
    "type": "dm:Deliver:Succeed",
    "aliyunpublishtime": "2024-05-22T08:27:42.539Z",
    "specversion": "1.0",
    "aliyuneventbusname": "default",
    "id": "1223c134-b66d-4d53-b05e-780c0261ce22",
    "time": "2024-05-22T08:27:42.462Z",
    "aliyunregionid": "cn-hangzhou"
}

2.进行发信验证,通过test@hangzhou.dmtest.top发送一封邮件;

image.png

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

image.png

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

image.png

image.png