1. 程式人生 > >553 Mail from must equal authorized user

553 Mail from must equal authorized user

在本人工作的過程中,遇到了形形色色的問題。當時琢磨了好久才琢磨出這樣的總結,貼出來供大家參考參考。以下觀點僅代表本人在工作過程中的觀點,望大家能夠共同討論,查漏補缺。



那麼首先先貼出我原本的配置給大家看看哈.

#default
MailServerHost=smtp.qiye.163.com
MailServerPort=25
UserName[email protected]
Password=123456
FromAddress[email protected]
Subject=default mail
Product=Default

#test
MailServerHost_1
=smtp.qiye.163.com MailServerPort_1=25 UserName_1[email protected] Password_1=123456 FromAddress_1[email protected] Subject_1=test mail Product_1=test

由於專案中是需要多個郵箱進行不同的操作,所以我們一開始需要在配置檔案中配置不同的郵箱配置,從而讀取不同的郵箱配置進行郵件的收發。
而最近由於公司的業務要求,我們就將其中的一個郵箱的配置進行了修改,具體就是將test的配置進行了修改,修改如下:

#test
MailServerHost_1=smtp.qiye.163.com
MailServerPort_1
=25 UserName_1[email protected] Password_1=654321 FromAddress_1[email protected] Subject_1=demo mail Product_1=demo

不難看出修改的地方是使用者名稱、密碼、主題。

通過對業務邏輯進行修改,即通過讀取配置檔案中不同的郵箱資訊,從而達到使用不同的郵箱進行郵件的傳送功能。

修改完畢後,重啟專案後,執行!
通過第一個郵箱配置進行郵件的傳送,傳送成功。而正當我通過第二個郵箱配置進行郵件的傳送的時候,程式就出錯了!

這裡寫圖片描述

看錯誤的log,似乎是有戶名還有密碼不匹配。但是檢查了很多次配置,都沒有問題。
在網上一找資料,原來是Session

搗的亂。


我們找到我們的程式碼,不難發現我們在傳送郵件的時候是根據郵件會話屬性和密碼驗證器構造一個傳送郵件的session

 // 根據郵件會話屬性和密碼驗證器構造一個傳送郵件的session 
Session sendMailSession = Session.getDefalutInstance(pro,authenticator); 

問題就是出在getDefaultInstance()這個方法。
getDefaultInstance()這個方法的處理方式是這樣的:

1、首先會在快取中查詢是否存在著properties。
2、如果快取中不存在,那麼才會載入一個新的使用者自定義的properties。
3、如果快取中存在,那麼就不會新載入一個properties,而用以前的配置。

因此,當我們具有兩個不相同的配置的時候,程式在讀取了第一個配置之後,則此配置會一直存在快取中,下次無論是想要讀取其他配置都會返回此預設快取配置。

那麼這時候問題就明顯了,我們解決這個問題只需要將getDefaultInstance()方法改為getInstance()就可以解決啦!