JavaMail使用問題總結

問題1:怎樣使用SSL在傳輸層對網絡連接進行加密

JavaMail對郵件操作分爲兩類:
1.收取郵件Store類,收取郵件使用IMAP和POP協議,使用Store store = session.getStore(recProtocol);時,會根據recProtocol自動選擇IMAPStore、IMAPSSLStore、POP3Store、POP3SSLStore對象返回

2.發送郵件Transport類,發送郵件使用SMTP協議,使用Transport transport = session.getTransport(sendProtocol);時,會根據sendProtocol自動選擇SMTPTransport、SMTPSSLTransport對象返回

所以我們想使用SSL協議,只需要改變recProtocol和sendProtocol即可,具體使用如下:

協議名(sendProtocol or sendProtocol) 默認端口 類對象
imap 143 IMAPStore
pop3 110 POP3Store
smtp 25 SMTPTransport
imaps 993 IMAPSSLStore
pop3s 995 POP3SSLStore
smtps 465 SMTPSSLTransport

問題2:pop協議時,使用store.getFolder(folder)只支持INBOX,獲取草稿箱等其他目錄會報異常

具體看下面com.sun.mail.pop3.POP3Store#getFolder(String name)

/**
 * Only the name "INBOX" is supported.
 */
@Override
public Folder getFolder(String name) throws MessagingException {
	checkConnected();
	return new POP3Folder(this, name);
}

問題3:阿里雲服務器使用JavaMail通過25端口發送SMTP郵件出錯

由於阿里雲限制了25號端口,因此我們使用Javamail郵件發送時,使用SSL協議下的645端口發送郵件,也就是使用SMTPSSLTransport發送郵件,就像下面代碼所示:

transport = session.getTransport("smtps");
transport.connect(host, 465, account, password);
transport.sendMessage(msg, msg.getRecipients(Message.RecipientType.TO));
transport.close();

問題4:判斷一封郵件是否爲新郵件或者說是否已收取

開始使用的是Message-ID來判斷郵件是否在本地中存在,但這種方法存一個問題就是當我們調用((MimeMessage)msg).getMessageID()獲取MessageId時會自動郵件頭,非常消耗時間,這裏我們使用UIDL命令獲取message unique ID,使用方法如下:

/* protocol 爲郵件協議,muid爲每封郵件的unique ID,msg爲郵件Message對象 */
if(protocol.indexOf("pop") != -1){
	muid = ((POP3Folder)f).getUID(msg);
}else{
	muid = Long.toString(((IMAPFolder)f).getUID(msg));
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章