【实践】mandrillapp模板邮件发送功能

前置情景:

        1. 已有mailchimp账号,没有请自行申请,免费版本即可完成功能开发测试       

        2. 具备一定的英文文档阅读能力

        3. 相关地址:

                mailchimp: Login | Mailchimp

                mandrillapp: Log in to Mandrill

                Transactional API(含Guides、Documentation自行阅读):

                Mailchimp Transactional API Reference | Mailchimp Developer

实践背景:

        现海外服务中存在两种发送邮件方式:

        1. 使用公司内部邮件依赖包       

        2. 使用第三方平台mandrillapp

        现需要改造海外服务,统一使用mailchimp方式发送邮件,不再使用公司内部的邮件依赖包

实践过程:

注意不是mailchimp的API-KEY)

mandrillapp入口:Log in to Mandrill

Settings -> SMTP & API Info -> API Keys -> New API Key

mailgun邮件发送demo_java

mailgun邮件发送demo_mailgun邮件发送demo_02

mailchimp入口:Login | Mailchimp

左下角头像 -> Account & billing -> Extras -> API keys -> Your API keys -> Create A Mandrill API Key 然后就会跳转到mandrillapp那边去了

mailgun邮件发送demo_后端_03

         2. 创建邮件模板

 mandrillapp入口:建议使用

Outbound -> Templates -> Create a Template

mailgun邮件发送demo_postman_04

mailgun邮件发送demo_后端_05

说明:

        1. Template Info中slug为创建第一步输入的模板名称全小写字符串,后续可使用name/slug在代码中标识使用的模板

        2. Template Defaults请务必填写完善,否则后续接口测试可能出现 rejected & invalid-sender 的响应。From Address为邮箱格式,有强校验

        3. 记得制作完成模板后点击右上 Save Draft、Publish

 mailchimp入口:

首页 -> Campaigns -> Email templates -> Create template

mailgun邮件发送demo_postman_06

说明:

        1. 创建时可以视情况选择对应的格式模板,一般邮件simple足够了 

        2. 创建成功后记得推送到 mandrillapp,推送后就可以在Templates中看到了

        3. 之所以推荐使用 mandrillapp 直接创建,就是因为通过 mailchimp 创建的模板不会有让你输入默认三项的步骤,推送到 mandrillapp 后如不进行二次编辑,很可能忽略默认三项,这将会造成后续测试接口时的 rejected、invalid-sender响应,调用接口成功但没有发出去邮件的现象。

        4. 模板有内容需要替换时使用 *|xxx|* 进行标识,并在接口入参message中使用global_merge_vars指定替换的内容,mandrillapp详见api文档

       3. 接口测试

API文档:Send using message template | Mailchimp Transactional API Reference | Mailchimp Developer

mailgun邮件发送demo_postman_07

mailgun邮件发送demo_java_08

mailgun邮件发送demo_java_09

  说明:

        1. 此接口需要4个必填请求体参数:

key:mandrillapp 的 API-KEY

template_name:创建的模板name/slug,建议使用slug

template_content:用于动态替换邮件内容的参数,需要在模板中通过 mc:edit="xxx" 配置,此处不详细展开,详见文档 Documentation -> Templates and Dynamic Content -> Editable content areas

message: 配置具体的邮件基础信息,一般常用 to(接收方)、global_merge_vars/merge_vars(模板内容替换)、from_email(发送方)等等,可选很多,请自行阅读文档,此处不做展开(当然也可以一个都不配置,接口会调用成功,但邮件不会发送(发了但没完全发)

template_content / global_merge_vars / merge_vars方式,详见 Documentation -> Templates and Dynamic Content, 三种方式在模板中占位标识不同,需注意

"status": "rejected" & "reject_reason": "invalid-sender" 情况,请自行检查模板是否配置默认三项,若已配置请检查发送方、接收方邮箱地址是否正确等其他配置。

       4. 后端代码编写 (以Java为例):

采用HttpClients方式实现mailchimp接口调用:

/**
     * 通过mailchimp发送邮件
     *
     * @author kennys.shang
     * @param mapParam              参数map
     * @param secretKey             秘钥
     * @param template              邮件模板
     * @param templateContent       模板内容
     * @param sendToReqList         接收方集合
     * @param globalMergeVars       局部替换内容
     * @return SendEmailRes         邮件发送响应对象
     */
    private List<SendEmailRes> sendEmailByMailchimp(Map<String, Object> mapParam, String secretKey, String template,
                                                    List<SendEmailTemplateContentReq> templateContent,
                                                    List<SendToReq> sendToReqList,
                                                    List<SendEmailGlobalVarReq> globalMergeVars) {
        // 组装参数map
        mapParam.put("key", secretKey);
        mapParam.put("template_name", template);
        mapParam.put("template_content", templateContent);
        Map<String, Object> messageParam = Maps.newHashMap();
        messageParam.put("to", sendToReqList);
        messageParam.put("global_merge_vars", globalMergeVars);
        mapParam.put("message", messageParam);

        // http方式发送邮件
        HttpHelper.RequestParameter<List<SendEmailRes>> parameter = HttpHelper.RequestParameter.<List<SendEmailRes>>builder()
                .url(emailProperties.getAccountUrl())
                .parameter(mapParam)
                .typeReference(new TypeReference<List<SendEmailRes>>() {})
                .build();
        return httpHelper.post(parameter);
    }

说明:

        1. 此处只作核心代码展示,秘钥、模板等读取自配置文件,模板内容、接收方、局部替换内容视所需自行组装,其实本质还是对应第3步接口测试的请求体参数

        2. HttpHelper为经公司封装的公共HttpClients,自行替换为原生HttpClients方式即可

总结:

        其实需求丢过来时还是一头雾水,但静心分析后将其拆分为多个步骤就会发现并不困难,前后加起来大概花费了1天时间,主要还是现在摆渡上 mailchimp 相关文献太少了,技术探索、阅读官方文档以及那个 invalid-sender 踩坑浪费了不少时间。

        愿这篇实践能对后来者有所帮助