因为价格监控项目的需求,实现了一个小的邮件发送接口服务,使用了一个单独的SpringBoot项目,给他取名为spring-mail-sender,开源在了Github上。内部我给他命名为提醒服务,由于将来但愿还能扩展下,用来作短信发送服务,或者安卓等推送服务的API。java
本项目使用springboot,采用web api的方式提供邮件,短信等服务的调用接口,目前仅支持邮件提醒。python
邮件提醒特色:github
本项目待完成:web
项目结构以下:算法
├─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
只能以用户的邮箱地址做为昵称,发件效果是这样的:spring
{
"address": "xxxxx@qq.com",
"from": "2897788509@qq.com", // 必须和发件邮箱彻底一致
"msg": "string",
"subject": "string",
"to": "xxxxxxx@qq.com"
}
复制代码
若是不一致,或者填写了用户别名,就会报以下错误:json
我就很纳闷,由于以前我用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))
复制代码
随后我又去谷歌了一阵,参考:api
原来想要使用发件人别名,就必须对发件字段进行编码:
严格格式为:别名<邮件地址>
然而,网上不少种答案要么引入了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());
复制代码
大功告成:
我目前是一名后端开发工程师。技术领域主要关注后端开发,数据爬虫,数据安全,5G,物联网等方向。
微信:yangzd1102
Github:@qqxx6661
我的博客:
若是文章对你有帮助,不妨收藏起来并转发给您的朋友们~