## 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专题五:持久化