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

前言

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

簡介

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

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

郵件提醒特色:python

  • 本地配置文件設置郵件帳戶密碼和smtpgit

  • 使用post來調用發送郵件請求,post中使用json數據填充:發件人暱稱,收件人暱稱,收件人郵箱,主題,正文。github

  • 調用接口返回狀態碼定義:(1=正常,2=錯誤,3=未登陸,4=自定義錯誤(直接拋出errorMes))web

  • 發件人,收件人支持別名。算法

本項目待完成:spring

    x調用接口鑑權:防止無權限人員調用json

    x調用接口頻率限制:防止濫用接口

    x調用日誌存儲

項目結構以下:

├─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"
}

若是不一致,或者填寫了用戶別名,就會報以下錯誤:

我就很納悶,由於以前我用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

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

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

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

我的博客:

  • CSDN:@qqxx6661

  • 知乎:@Zhendong

  • 簡書:@蠻三刀把刀

  • 掘金:@蠻三刀把刀

原創博客主要內容

  • Java知識點複習全手冊

  • Leetcode算法題解析

  • 劍指offer算法題解析

  • SpringCloud菜鳥入門實戰系列

  • SpringBoot菜鳥入門實戰系列

  • Python爬蟲相關技術文章

  • 後端開發相關技術文章

我的公衆號:Rude3Knife

我的公衆號:Rude3Knife

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


本文分享自微信公衆號 - 後端技術漫談(Rude3Knife)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索