消息服务MNS的主题支持邮件推送,即发送到主题里的消息可以同时被阿里云邮件推送服务推送到邮箱。本文介绍在控制台上将消息推送至邮箱的具体步骤,并提供相应示例代码。

前提条件

您已完成以下操作:

注意 不支持动态设置回信地址。

创建主题

使用消息服务MNS创建一个主题,在以下的示例中命名为MyTopic。

  1. 登录MNS控制台
  2. 在顶部菜单栏,选择地域。
  3. 在左侧导航栏,单击主题
  4. 主题页面的右上角,单击创建主题
  5. 创建主题对话框,输入主题名称,输入消息最大长度,然后单击确定

创建邮件推送订阅

  1. 主题页面,找到MyTopic主题,在其操作列单击订阅详情
  2. 在展开区域的右上角,单击创建订阅创建订阅
  3. 在弹出的创建订阅对话框中,执行以下操作,然后单击确定
    • 推送类型:选择邮箱
    • 订阅名称:输入订阅的名称。
    • 接收端地址:输入邮箱地址。
    • 消息过滤标签:输入标签用于消息过滤。
    • 重试策略:选择重试策略,决定向接收端推送消息时的重试策略。
    • 消息推送格式:选择消息推送格式,默认格式为SIMPLIFIED

发布消息

  1. 主题页面,找到MyTopic,在其右侧操作列单击发布消息
  2. 发布消息页面,执行以下操作,然后单击发布消息
    1. 消息内容:输入待发布消息的正文。
    2. 推送类型:选中邮箱
    3. 邮箱推送设置对话框中,执行以下操作,然后单击确定
      • 邮件主题:输入邮件的主题信息。
      • 发信地址:输入您在邮件推送服务中配置的发信地址。
      • 回信地址:打开后用户回信发送到您在邮件推送服务中配置的回信地址(状态必须是验证通过)。
      • 地址类型:选择发信账号类型。
      • 是否HTML正文:打开后邮件正文为HTML格式。

示例代码

此外,您也可以通过SDK将消息推送至邮箱。下文以Java SDK为例说明。

Endpoint格式为mail:directmail:XXX@YYY.com,其中XXX@YYY.com是您的邮箱地址。

  • Java SDK订阅代码示例 :
    CloudAccount cloudAccount = new CloudAccount(ACCESS_ID, ACCESS_KEY, ENDPOINT);
    MNSClient client = cloudAccount.getMNSClient();
    
    CloudTopic topic = null;
    try {
        // 1. 创建主题。
        String topicName = "TOPICNAME";
        TopicMeta meta = new TopicMeta();
        meta.setTopicName(topicName);
        topic = client.createTopic(meta);
    
        // 2. 设置邮箱Endpoint。
        String mailEndpoint = topic.generateMailEndpoint("mymailbox@alibaba-inc.com");
    
        // 3. 创建订阅。
        SubscriptionMeta subMeta = new SubscriptionMeta();
        subMeta.setSubscriptionName(SUBNAME);
        subMeta.setEndpoint(mailEndpoint);
    
        topic.subscribe(subMeta);
    
        // 4. 发布消息。
        RawTopicMessage msg = new RawTopicMessage();
        msg.setMessageBody("hello topic");
    
        // 设置邮箱属性。
        MessageAttributes messageAttributes = new MessageAttributes();
        MailAttributes mailAttributes = new MailAttributes();
        mailAttributes.setAccountName("direct_mail_account_name@aliyun-inc.com");
        mailAttributes.setSubject("TestMailSubject");
        messageAttributes.setMailAttributes(mailAttributes);
    
        TopicMessage msg2 = topic.publishMessage(msg, messageAttributes);
        System.out.println(msg2.getMessageId());
        System.out.println(msg2.getMessageBodyMD5());
    } catch (ServiceException se) {
        System.out.println(se.getErrorCode() + se.getRequestId());
        System.out.println(se.getMessage());
        se.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
  • HTTP Request Body示例:
    POST /topics/$TopicName/messages HTTP/1.1
    Host: $AccountId.mns.cn-hangzhou.aliyuncs.com
    Date: Tue, 08 Dec 2015 06:13:40 GMT
    Content-Length:500
    Content-Type:text/xml;charset=utf-8
    Authorization: MNS 15B4D3461F177624206A:aibzWu1iDEx9LwO56+kHgA3eqmI=
    x-mns-version: 2015-06-06
    
    <?xml version="1.0" encoding="UTF-8"?>
    <Message xmlns="http://mns.aliyuncs.com/doc/v1">
        <MessageBody>hello topic</MessageBody>
        <MessageAttributes>
            <DirectMail>{"Subject":"TestMailSubject","AccountName":"direct_mail_account_name@aliyun-inc.com","ReplyToAddress":0,"AddressType":0,"IsHtml":0}</DirectMail>
        </MessageAttributes>
    </Message>