package com.zz.mail;  

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.NoSuchProviderException;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeUtility; /**
* 邮件接受测试
*
*/
public class POP3MailReceiverTest {
public POP3MailReceiverTest() {
try {
// 1. 设置连接信息, 生成一个 Session
String protocol = "pop3";
boolean isSSL = true;
String host = "pop.163.com";
int port = 995;
String username = "xxxx@163.com";
String password = "****"; Properties props = new Properties();
props.put("mail.pop3.ssl.enable", isSSL);
props.put("mail.pop3.host", host);
props.put("mail.pop3.port", port); Session session = Session.getDefaultInstance(props);
// 2. 获取 Store 并连接到服务器
Store store = session.getStore(protocol);
store.connect(username, password);
Folder folder = store.getDefaultFolder();// 默认父目录
if (folder == null) {
System.out.println("服务器不可用");
return;
}
/*
System.out.println("默认信箱名:" + folder.getName()); Folder[] folders = folder.list();// 默认目录列表
for(int i = 0; i < folders.length; i++) {
System.out.println(folders[0].getName());
}
System.out.println("默认目录下的子目录数: " + folders.length);
*/
Folder popFolder = folder.getFolder("INBOX");// 获取收件箱
popFolder.open(Folder.READ_WRITE);// 可读邮件,可以删邮件的模式打开目录
// 4. 列出来收件箱 下所有邮件
Message[] messages = popFolder.getMessages();
// 取出来邮件数
int msgCount = popFolder.getMessageCount();
System.out.println("共有邮件: " + msgCount + "封");
// FetchProfile fProfile = new FetchProfile();// 选择邮件的下载模式,
// 根据网速选择不同的模式
// fProfile.add(FetchProfile.Item.ENVELOPE);
// folder.fetch(messages, fProfile);// 选择性的下载邮件
// 5. 循环处理每个邮件并实现邮件转为新闻的功能
for (int i = 0; i < msgCount; i++) {
// 单个邮件
System.out.println("第" + i +"邮件开始");
mailReceiver(messages[i]);
System.out.println("第" + i +"邮件结束");
//邮件读取用来校验
messages[i].writeTo(new FileOutputStream("D:/pop3MailReceiver"+ i +".eml"));
}
// 7. 关闭 Folder 会真正删除邮件, false 不删除
popFolder.close(true);
// 8. 关闭 store, 断开网络连接
store.close();
} catch (NoSuchProviderException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} /**
* 解析邮件
*
* @param messages 邮件对象
* @param i
* @return
* @throws IOException
* @throws MessagingException
* @throws FileNotFoundException
* @throws UnsupportedEncodingException
*/
private void mailReceiver(Message msg)throws Exception{
// 发件人信息
Address[] froms = msg.getFrom();
if(froms != null) {
//System.out.println("发件人信息:" + froms[0]);
InternetAddress addr = (InternetAddress)froms[0];
System.out.println("发件人地址:" + addr.getAddress());
System.out.println("发件人显示名:" + addr.getPersonal());
}
System.out.println("邮件主题:" + msg.getSubject());
// getContent() 是获取包裹内容, Part相当于外包装
Object o = msg.getContent();
if(o instanceof Multipart) {
Multipart multipart = (Multipart) o ;
reMultipart(multipart);
} else if (o instanceof Part){
Part part = (Part) o;
rePart(part);
} else {
System.out.println("类型" + msg.getContentType());
System.out.println("内容" + msg.getContent());
}
} /**
* @param part 解析内容
* @throws Exception
*/
private void rePart(Part part) throws MessagingException,
UnsupportedEncodingException, IOException, FileNotFoundException {
if (part.getDisposition() != null) { String strFileNmae = MimeUtility.decodeText(part.getFileName()); //MimeUtility.decodeText解决附件名乱码问题
System.out.println("发现附件: " + MimeUtility.decodeText(part.getFileName()));
System.out.println("内容类型: " + MimeUtility.decodeText(part.getContentType()));
System.out.println("附件内容:" + part.getContent());
InputStream in = part.getInputStream();// 打开附件的输入流
// 读取附件字节并存储到文件中
java.io.FileOutputStream out = new FileOutputStream(strFileNmae);
int data;
while((data = in.read()) != -1) {
out.write(data);
}
in.close();
out.close();
} else {
if(part.getContentType().startsWith("text/plain")) {
System.out.println("文本内容:" + part.getContent());
} else {
//System.out.println("HTML内容:" + part.getContent());
}
}
} /**
* @param multipart // 接卸包裹(含所有邮件内容(包裹+正文+附件))
* @throws Exception
*/
private void reMultipart(Multipart multipart) throws Exception {
//System.out.println("邮件共有" + multipart.getCount() + "部分组成");
// 依次处理各个部分
for (int j = 0, n = multipart.getCount(); j < n; j++) {
//System.out.println("处理第" + j + "部分");
Part part = multipart.getBodyPart(j);//解包, 取出 MultiPart的各个部分, 每部分可能是邮件内容,
// 也可能是另一个小包裹(MultipPart)
// 判断此包裹内容是不是一个小包裹, 一般这一部分是 正文 Content-Type: multipart/alternative
if (part.getContent() instanceof Multipart) {
Multipart p = (Multipart) part.getContent();// 转成小包裹
//递归迭代
reMultipart(p);
} else {
rePart(part);
}
}
} /**
* @param args
*/
public static void main(String[] args) {
new POP3MailReceiverTest();
}
}

java读取邮件的更多相关文章

  1. Java读取property配置文件

    读取配置文件已经成了Java程序员工作的一项必备技能. 配置文件的优点: 可维护性好 怎么个可维护性好呢? 它会让程序中变化的地方很灵活的配置,不需要修改代码. Java程序部署到服务器上去之后就变成 ...

  2. javamail 发送、读取邮件

    概述 1.邮件相关的标准 厂商所提供的 JavaMail 服务程序可以有选择地实现某些邮件协议,常见的邮件协议包括: SMTP(Simple Mail Transfer Protocol) :即简单邮 ...

  3. 使用 EWS(Exchange Web Service)协议读取邮件、发送邮件

    问题: 公司之前可以通过POP3协议收发邮件,因而在SoapUI中用JavaMail可以读取邮件,后来配置了Office 365,POP3协议端口不再开放,邮件全部读取失败,报login timeou ...

  4. java分享第十六天( java读取properties文件的几种方法&java配置文件持久化:static块的作用)

     java读取properties文件的几种方法一.项目中经常会需要读取配置文件(properties文件),因此读取方法总结如下: 1.通过java.util.Properties读取Propert ...

  5. 【转】Java读取matlab的.mat数据文件

    参考:Java读取mat文件 下载链接:ujmp  jmatio 下载完两个.jar文件之后,如何引用到java项目当中?项目名称->右键->Property->Java Build ...

  6. java读取输入流

    java读取输入流两种 private static byte[] readStream(InputStream in){ if(in==null){ return null; } byte[] bu ...

  7. Java读取Level-1行情dbf文件极致优化(3)

    最近架构一个项目,实现行情的接入和分发,需要达到极致的低时延特性,这对于证券系统是非常重要的.接入的行情源是可以配置,既可以是Level-1,也可以是Level-2或其他第三方的源.虽然Level-1 ...

  8. Java读取Level-1行情dbf文件极致优化(2)

    最近架构一个项目,实现行情的接入和分发,需要达到极致的低时延特性,这对于证券系统是非常重要的.接入的行情源是可以配置,既可以是Level-1,也可以是Level-2或其他第三方的源.虽然Level-1 ...

  9. java读取properties配置文件总结

    java读取properties配置文件总结 在日常项目开发和学习中,我们不免会经常用到.propeties配置文件,例如数据库c3p0连接池的配置等.而我们经常读取配置文件的方法有以下两种: (1) ...

随机推荐

  1. 初探数位DP-hdu2089

    一开始刷dp就遇到了数位dp,以前程序设计艺术上看过一点,基本没懂,于是趁今天遇到题目,想把它搞会,但就目前状态来看仍然是似懂非懂啊,以后还要反复搞 统计区间[l,r]的满足题意的数的个数,可以转换成 ...

  2. PMP 第二章 项目生命周期与组织

    1 项目组织机构类型有哪些? 区别是什么? 职能型  矩阵型  项目性 2 什么是事业环境因素? 什么是组织过程资产? 如何区分事业环境因素和组织过程资产? 事业环境因素:事业环境因素指围绕项目或能影 ...

  3. 机器学习公开课笔记(5):神经网络(Neural Network)——学习

    这一章可能是Andrew Ng讲得最不清楚的一章,为什么这么说呢?这一章主要讲后向传播(Backpropagration, BP)算法,Ng花了一大半的时间在讲如何计算误差项$\delta$,如何计算 ...

  4. hdu 4826(dp + 记忆化搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4826 思路:dp[x][y][d]表示从方向到达点(x,y)所能得到的最大值,然后就是记忆化了. #i ...

  5. cf 二分图

    题目链接:http://vjudge.net/contest/133033#problem/C 题目大意:给你n个点,m条边,将其分成两个集合,集合A是图的一个点覆盖,集合B也是图的一个点覆盖,要求集 ...

  6. 分享Kali Linux 2016.2第48周虚拟机

    分享Kali Linux 2016.2第48周虚拟机该虚拟机使用Kali Linux 2016.2第48周的64位镜像安装而成.基本配置如下:(1)该系统默认设置单CPU双核,内存为2GB,硬盘为50 ...

  7. PHP 生成二维码

    利用PHP QRcode生成二维码: php QRcode 官网 http://phpqrcode.sourceforge.net/ 在官网下载 phpqrcode.php就ok啦: 然后,查看自己的 ...

  8. JS 中面向对象的5种写法

    //第1种写法 function Circle(r) { this.r = r; } Circle.PI = 3.14159; Circle.prototype.area = function() { ...

  9. fzu月赛 2203 单纵大法好 二分

    Accept: 8    Submit: 18Time Limit: 5000 mSec    Memory Limit : 65536 KB  Problem Description 人在做,天在看 ...

  10. Webstorm & PhpStorm

    WebStorm注册码 User Name: EMBRACE License Key: ===== LICENSE BEGIN ===== 24718-12042010 00001h6wzKLpfo3 ...