本文介紹Direct Mail服務如何通過整合阿里雲事件匯流排服務,實現郵件投遞結果的分發通知。
使用者成功進行事件匯流排相關配置後,通過Direct Mail服務發送的郵件,其投遞結果將按照在事件匯流排中設定的事件分發規則,發送至指定的事件目標(DingTalk、輕量訊息佇列、HTTP等),實現投遞結果的非同步擷取。
下文將詳細介紹如何完成事件分發設定。
Direct Mail控制台開啟事件分發功能
在Direct Mail控制台開啟事件分發開關。

事件匯流排服務開通與訪問授權
1.在阿里雲首頁搜尋事件匯流排或 EventBridge,免費開通事件匯流排服務




建立事件規則
在控制台-事件匯流排-雲端服務專用事件匯流排-建立規則,建立Direct Mail服務的事件分發規則,配置基本資料,填寫規則名稱和描述;


配置事件模式,事件來源類型為阿里雲官方事件來源,事件來源選擇acs.dm,事件類型目前支援發送失敗、發送成功、點選連結、開啟郵件,使用者可按需添加,未添加的事件類型會被過濾。

配置事件目標,選擇服務類型(DingTalk、輕量訊息佇列、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 |
從郵件發出的時間開始,30天內的各類事件都會被推送到事件匯流排。
修改各類事件的統計
左側導覽列點擊事件規則-編輯事件模式-事件類型,可對事件類型進行修改。


開啟或者點擊事件的統計的前提
如果需要對郵件的開啟和點擊行為事件進行通知分發,前提是開啟資料跟蹤功能,詳細操作可參考如何開啟資料跟蹤功能?。
接收事件分發訊息,驗證鏈結路已通
以上文流程設定的事件目標輕量訊息佇列為例,驗證事件分發鏈路。
開通輕量訊息佇列並建立訊息接收的隊列
進入輕量訊息佇列控制台,若未開通輕量訊息佇列服務,則按引導先開通輕量訊息佇列服務。
單擊左側導覽列中隊列,進入隊列頁面。
單擊頁面建立隊列按鈕,將會彈出建立隊列對話方塊。
輸入隊列名稱(隊列名稱使用者可自由定義,本樣本建立
delivery-result-queue名稱的隊列),其他按預設值即可,然後單擊確認。

觸發事件分發並查看
使用Direct Mail服務發送一封郵件後,在事件匯流排控制台查看到事件的追蹤記錄;


查看事件分發目標的結果
開啟輕量訊息佇列控制台,在隊列列表選擇事件匯流排目標配置的隊列(案例中為delivery-result-queue)點擊收發訊息按鈕,跳轉至收發訊息快速體驗頁面;

點擊頁面下方接收訊息按鈕,可查看到剛剛的事件訊息,點擊詳情,可查看到對應的完整事件訊息內容(可以看到事件ID與事件匯流排中的記錄一致,事件即成功分發到了輕量訊息佇列);


設定發信地址級事件分發樣本
按照以上樣本流程配置的事件分發對Direct Mail服務下所有的發信網域名稱和地址生效,使用者可根據實際業務需求,修改事件規則的JSON串,來實現按照發信地址等過濾條件進行事件分發。
以下是指定發信地址test@hangzhou.dmtest.top進行Direct Mail事件分發的樣本,通過進行規則配置,使得只有從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 | 文法校正解析得到的電子郵件地址的網域名稱部分(經過小寫化) |
相關文檔:Direct Mail事件
事件詳情裡的時間欄位統一是UTC時間格式
2.進行發信驗證,通過test@hangzhou.dmtest.top發送一封郵件;

3.在輕量訊息佇列的隊列中(本樣本和設定事件分發流程一樣,採用輕量訊息佇列作為事件目標接收事件訊息,使用者可自行設定事件目標)可查詢到此條訊息。

4.使用其他發信地址發信後,在事件匯流排-事件追蹤中查詢到了該事件的詳情,但在輕量訊息佇列側,不會收到此條事件訊息,即實現了指定發信地址的回調通知。

