收邮件主要有pop3和imap两种协议。两种方式都可用来读取邮件,但是有处理上的区别。
1.pop3是不支持判断邮件是否为已读的,也就是说不能直接从收件箱里面取到未读邮件,需要进行判断处理。
2.imap提供了读取未读邮件功能,可判断该邮件是否为已读或未读。
另外, 收件箱中的每一封邮件对应一个MessageNumber,可通过一个MessageNumber拿到对应邮件。
如:Message message = folder.getMessage(messageNumber); 定时任务每次读邮箱邮件不用全量读取。
pom.xml
一、pop3协议模式下读取
public class ReadEmail {
public static final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
public static void main(String[] args) throws Exception {
// 输入你的邮箱用户名和密码
String emailUsername = "邮件用户名@163.com";
String emailPassword = "密码";
// 邮件服务器的属性
Properties props = new Properties();
//收件配置
props.setProperty("mail.pop3.host", "pop.163.com");
props.setProperty("mail.pop3.socketFactory.class", SSL_FACTORY);
props.setProperty("mail.pop3.ssl.trust", "*");
props.setProperty("mail.pop3.socketFactory.fallback", "false");
props.setProperty("mail.pop3.port", "XXX");
props.setProperty("mail.pop3.socketFactory.port", "XXX");
props.setProperty("mail.pop3.auth", "true");
props.setProperty("mail.store.protocol", "pop3");
//发送配置
props.setProperty("mail.smtp.host", "smtp.163.com");
props.setProperty("mail.smtp.port", "XXX");
props.setProperty("mail.smtp.auth", "true");
// 创建邮件会话
Session emailSession = Session.getInstance(props);
// 获取邮件存储对象
Store store = emailSession.getStore();
store.connect(emailUsername, emailPassword);
// 获取INBOX文件夹
Folder emailFolder = store.getFolder("INBOX");
emailFolder.open(Folder.READ_ONLY);
// 找到未读邮件
Message[] messages = emailFolder.getMessages();
for (Message message : messages) {
System.out.println("邮件标题:" + message.getSubject());
}
// 关闭文件夹和存储对象
emailFolder.close(false);
store.close();
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
二、imap协议模式下读取
public static void readMail() {
String protocol = "imap";
Properties props = new Properties();
props.setProperty("mail.transport.protocol", protocol); // 使用的协议(JavaMail规范要求)
props.setProperty("mail.smtp.host", host); // 发件人的邮箱的 SMTP服务器地址
// 获取连接
Session session = Session.getInstance(props);
session.setDebug(false);
// 获取Store对象
Store store = session.getStore(protocol);
store.connect(host, userName, password);
IMAPFolder inbox = (IMAPFolder)store.getFolder("INBOX");
//如果需要在取得邮件数后将邮件置为已读则这里需要使用READ_WRITE,否则READ_ONLY就可以
inbox.open(Folder.READ_WRITE);
// 全部邮件数
int messageCount = inbox.getMessageCount();
System.out.println(messageCount);
//folder.getUnreadMessageCount() 未读取邮件总数
Message[] messages = inbox.getMessages(folder.getMessageCount()-inbox.getUnreadMessageCount()+1,inbox.getMessageCount());
List<Message> mesList=new ArrayList<>();
for (int i = 0; i < messages.length; i++) {
Message message = messages[i];
System.out.println(message.getSubject());
//保存我将要设置为已读的message列表
mesList.add(message);
//解析邮件内容
.......
}
//将刚才我获取的邮件设置为已读
if (mesList.size() > 0) {
Message[] savedMailMessage = new Message[mesList.size()];
mesList.toArray(savedMailMessage);
inbox.setFlags(savedMailMessage, new Flags(Flags.Flag.SEEN),true);
}
folder.close(true);
store.close();
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.