前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[SpringBoot实战系列]实现发送邮件API/发件人中文别名

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

作者头像
蛮三刀酱
发布2019-05-10 10:58:28
1.8K0
发布2019-05-10 10:58:28
举报

版权声明:本文为博主原创文章,转载请注明原文作者和原文地址链接,谢谢。 https://cloud.tencent.com/developer/article/1423569

前言

由于价格监控项目的需求,实现了一个小的邮件发送接口服务,使用了一个单独的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))
  • 发件人,收件人支持别名。

本项目待完成:

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

项目结构如下:

代码语言:javascript
复制
├─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只能以用户的邮箱地址作为昵称,发件效果是这样的:

代码语言:javascript
复制
{
  "address": "xxxxx@qq.com",
  "from": "2897788509@qq.com", // 必须和发件邮箱完全一致
  "msg": "string",
  "subject": "string",
  "to": "xxxxxxx@qq.com"
}

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

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

代码语言:javascript
复制
@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

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

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

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

代码语言:javascript
复制
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());

大功告成:

关注我

我目前是一名后端开发工程师。技术领域主要关注后端开发,数据爬虫,数据安全,5G,物联网等方向。

微信:yangzd1102

Github:@qqxx6661

个人博客:

原创博客主要内容

  • Java知识点复习全手册
  • Leetcode算法题解析
  • 剑指offer算法题解析
  • SpringCloud菜鸟入门实战系列
  • SpringBoot菜鸟入门实战系列
  • Python爬虫相关技术文章
  • 后端开发相关技术文章

如果文章对你有帮助,不妨收藏起来并转发给您的朋友们~

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年04月25日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 简介
  • 问题解决
    • 发件人无法自定义别名
      • 原创博客主要内容
  • 关注我
相关产品与服务
短信
腾讯云短信(Short Message Service,SMS)可为广大企业级用户提供稳定可靠,安全合规的短信触达服务。用户可快速接入,调用 API / SDK 或者通过控制台即可发送,支持发送验证码、通知类短信和营销短信。国内验证短信秒级触达,99%到达率;国际/港澳台短信覆盖全球200+国家/地区,全球多服务站点,稳定可靠。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档