[SpringBoot實戰系列]實現發送郵件API/發件人中文別名

前言

因爲價格監控項目的需求,實現了一個小的郵件發送接口服務,使用了一個單獨的SpringBoot項目,給他取名爲spring-mail-sender,開源在了Github上。內部我給他命名爲提醒服務,由於將來但願還能擴展下,用來作短信發送服務,或者安卓等推送服務的API。java

簡介

本項目使用springboot,採用web api的方式提供郵件,短信等服務的調用接口,目前僅支持郵件提醒。python

github.com/qqxx6661/sp…git

郵件提醒特色:github

  • 本地配置文件設置郵件帳戶密碼和smtp
  • 使用post來調用發送郵件請求,post中使用json數據填充:發件人暱稱,收件人暱稱,收件人郵箱,主題,正文。
  • 調用接口返回狀態碼定義:(1=正常,2=錯誤,3=未登陸,4=自定義錯誤(直接拋出errorMes))
  • 發件人,收件人支持別名。

本項目待完成: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

blog.csdn.net/yiifaa/arti…

原來想要使用發件人別名,就必須對發件字段進行編碼:

嚴格格式爲:別名<郵件地址>

然而,網上不少種答案要麼引入了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

我的博客:

原創博客主要內容

  • Java知識點複習全手冊
  • Leetcode算法題解析
  • 劍指offer算法題解析
  • SpringCloud菜鳥入門實戰系列
  • SpringBoot菜鳥入門實戰系列
  • Python爬蟲相關技術文章
  • 後端開發相關技術文章

我的公衆號:Rude3Knife

我的公衆號:Rude3Knife

若是文章對你有幫助,不妨收藏起來並轉發給您的朋友們~

相關文章
相關標籤/搜索