問題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));
}