因爲價格監控項目的需求,實現了一個小的郵件發送接口服務,使用了一個單獨的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
我的博客:
若是文章對你有幫助,不妨收藏起來並轉發給您的朋友們~