美文网首页SpringBoot实战系列
[SpringBoot实战系列]实现发送邮件API/发件人中文别

[SpringBoot实战系列]实现发送邮件API/发件人中文别

作者: 蛮三刀酱 | 来源:发表于2019-04-25 16:48 被阅读0次

    前言

    由于价格监控项目的需求,实现了一个小的邮件发送接口服务,使用了一个单独的SpringBoot项目,给他取名为spring-mail-sender,开源在了Github上。内部我给他命名为提醒服务,因为未来希望还能扩展下,用来做短信发送服务,或者安卓等推送服务的API。

    简介

    本项目使用springboot,采用web api的方式提供邮件,短信等服务的调用接口,目前仅支持邮件提醒。

    https://github.com/qqxx6661/spring-mail-sender

    邮件提醒特点:

    • 本地配置文件设置邮件账户密码和smtp
    • 使用post来调用发送邮件请求,post中使用json数据填充:发件人昵称,收件人昵称,收件人邮箱,主题,正文。
    • 调用接口返回状态码定义:(1=正常,2=错误,3=未登录,4=自定义错误(直接抛出errorMes))
    • 发件人,收件人支持别名。

    本项目待完成:

    • 调用接口鉴权:防止无权限人员调用
    • 调用接口频率限制:防止滥用接口
    • 调用日志存储

    项目结构如下:

    ├─main
    │  ├─java
    │  │  └─com
    │  │      └─demo
    │  │          └─springmailsender
    │  │              │  SpringMailSenderApplication.java
    │  │              │  SwaggerConfig.java
    │  │              │
    │  │              ├─domain
    │  │              │      EmailRequest.java
    │  │              │      ResponseData.java
    │  │              │
    │  │              ├─service
    │  │              │      EmailService.java
    │  │              │      EmailServiceImpl.java
    │  │              │
    │  │              └─web
    │  │                      EmailController.java
    │  │
    │  └─resources
    │          application.properties
    │
    └─test
        └─java
            └─com
                └─demo
                    └─springmailsender
                            SpringMailSenderApplicationTests.java
    

    问题解决

    发件人无法自定义别名

    发现邮件发件人,也就是simpleMailMessage.setFrom只能以用户的邮箱地址作为昵称,发件效果是这样的:

    {
      "address": "xxxxx@qq.com",
      "from": "2897788509@qq.com", // 必须和发件邮箱完全一致
      "msg": "string",
      "subject": "string",
      "to": "xxxxxxx@qq.com"
    }
    
    image

    如果不一致,或者填写了用户别名,就会报如下错误:

    image

    我就很纳闷,因为之前我用python写了个发送邮件的api,明明是可以别名的啊,于是我打开了python的邮件api,看到如下代码,我将名称编码为了UTF-8:

    @staticmethod
        def _format_addr(s):
            # format the email address
            name, addr = parseaddr(s)
            return formataddr((Header(name, 'utf-8').encode(), addr))
    

    随后我又去谷歌了一阵,参考:

    https://blog.csdn.net/yiifaa/article/details/78264962

    原来想要使用发件人别名,就必须对发件字段进行编码:

    严格格式为:别名<邮件地址>

    image

    然而,网上很多种答案要么引入了new InternetAddress(alias + " <"+from+">"),要么编码为GBK,我最后还是直接编码为UTF-8:

    String fromByte = new String((emailRequest.getFrom() + " <" + fromAddress + ">")
                    .getBytes("UTF-8"));
            String toByte = new String((emailRequest.getTo() + " <" + emailRequest.getAddress() + ">")
                    .getBytes("UTF-8"));
            simpleMailMessage.setFrom(fromByte);
            simpleMailMessage.setTo(toByte);
            simpleMailMessage.setSubject(emailRequest.getSubject());
            simpleMailMessage.setText(emailRequest.getMsg());
    

    大功告成:

    image

    相关文章

      网友评论

        本文标题:[SpringBoot实战系列]实现发送邮件API/发件人中文别

        本文链接:https://www.haomeiwen.com/subject/nnbzgqtx.html