## Java專題十七:JavaMail
[TOC]
對JavaMail封裝,提供更多的功能([https://github.com/15045120/mail4j](https://github.com/15045120/mail4j)):
1. 定時發送
2. 加密郵件成壓縮包發送
3. 全文搜索
### 問題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即可,具體使用如下:
協議名(recProtocolor 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)`
```java
/**
* 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`發送郵件,就像下面代碼所示:
```java
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,使用方法如下:
```java
/* protocol 為郵件協議,muid為每封郵件的unique ID,msg為郵件Message對象 */
if(protocol.indexOf("pop") != -1){
muid = ((POP3Folder)f).getUID(msg);
}else{
muid = Long.toString(((IMAPFolder)f).getUID(msg));
}
```
- JavaCook
- Java專題零:類的繼承
- Java專題一:數據類型
- Java專題二:相等與比較
- Java專題三:集合
- Java專題四:異常
- Java專題五:遍歷與迭代
- Java專題六:運算符
- Java專題七:正則表達式
- Java專題八:泛型
- Java專題九:反射
- Java專題九(1):反射
- Java專題九(2):動態代理
- Java專題十:日期與時間
- Java專題十一:IO與NIO
- Java專題十一(1):IO
- Java專題十一(2):NIO
- Java專題十二:網絡
- Java專題十三:并發編程
- Java專題十三(1):線程與線程池
- Java專題十三(2):線程安全與同步
- Java專題十三(3):內存模型、volatile、ThreadLocal
- Java專題十四:JDBC
- Java專題十五:日志
- Java專題十六:定時任務
- Java專題十七:JavaMail
- Java專題十八:注解
- Java專題十九:淺拷貝與深拷貝
- Java專題二十:設計模式
- Java專題二十一:序列化與反序列化
- 附加專題一:MySQL
- MySQL專題零:簡介
- MySQL專題一:安裝與連接
- MySQL專題二:DDL與DML語法
- MySQL專題三:工作原理
- MySQL專題四:InnoDB存儲引擎
- MySQL專題五:sql優化
- MySQL專題六:數據類型
- 附加專題二:Mybatis
- Mybatis專題零:簡介
- Mybatis專題一:配置文件
- Mybatis專題二:映射文件
- Mybatis專題三:動態SQL
- Mybatis專題四:源碼解析
- 附加專題三:Web編程
- Web專題零:HTTP協議
- Web專題一:Servlet
- Web專題二:Cookie與Session
- 附加專題四:Redis
- Redis專題一:數據類型
- Redis專題二:事務
- Redis專題三:key的過期
- Redis專題四:消息隊列
- Redis專題五:持久化