解析读取收件箱中邮件:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties; import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility; /**
* @ClassName: RecipientMail
* @Description: 查询收件箱邮件并输出,有附件则将其保存进本地路径,删除邮件测试
*
*/
public class RecipientMail {
public static void main(String[] args) throws Exception {
resceive();
} /**
* @Title: resceive
* @Description: 接收邮件,解析,保存附件,删除
* @throws Exception
* void
*/
public static void resceive() throws Exception { // 使用163邮箱,163的 pop3地址是 pop3.163.com,  端口是 110     
String port = "110"; // 端口号
String servicePath = "pop3.163.com"; // 服务器地址 // 准备连接服务器的会话信息
Properties props = new Properties();
props.setProperty("mail.store.protocol", "pop3"); // 使用pop3协议
props.setProperty("mail.pop3.port", port); // 端口
props.setProperty("mail.pop3.host", servicePath); // pop3服务器 // 创建Session实例对象
Session session = Session.getInstance(props);
Store store = session.getStore("pop3");
store.connect("xxx@163.com", "abc"); // 163邮箱程序登录属于第三方登录所以这里的密码是163给的授权密码而并非普通的登录密码 // 获得收件箱
Folder folder = store.getFolder("INBOX");
/*
* Folder.READ_ONLY:只读权限 Folder.READ_WRITE:可读可写(可以修改邮件的状态)
*/
folder.open(Folder.READ_WRITE); // 打开收件箱 // 由于POP3协议无法获知邮件的状态,所以getUnreadMessageCount得到的是收件箱的邮件总数
System.out.println("未读邮件数: " + folder.getUnreadMessageCount()); // 由于POP3协议无法获知邮件的状态,所以下面得到的结果始终都是为0
System.out.println("删除邮件数: " + folder.getDeletedMessageCount());
System.out.println("新邮件: " + folder.getNewMessageCount()); // 获得收件箱中的邮件总数
System.out.println("邮件总数: " + folder.getMessageCount()); // 得到收件箱中的所有邮件,并解析
Message[] messages = folder.getMessages();
parseMessage(messages); // 得到收件箱中的所有邮件并且删除邮件
deleteMessage(messages); // 释放资源
folder.close(true);
store.close();
} /**
* @Title: parseMessage
* @Description: 解析邮件
* @param messages
* 要解析的邮件列表
* @throws MessagingException
* @throws IOException
* void
*/
public static void parseMessage(Message... messages)
throws MessagingException, IOException {
if (messages == null || messages.length < 1) {
throw new MessagingException("未找到要解析的邮件!");
}
// 解析所有邮件
for (int i = 0, count = messages.length; i < count; i++) {
MimeMessage msg = (MimeMessage) messages[i];
System.out.println("------------------解析第" + msg.getMessageNumber()
+ "封邮件-------------------- ");
System.out.println("主题: " + getSubject(msg));
System.out.println("发件人: " + getFrom(msg));
System.out.println("收件人:" + getReceiveAddress(msg, null));
System.out.println("发送时间:" + getSentDate(msg, null));
System.out.println("是否已读:" + isSeen(msg));
System.out.println("邮件优先级:" + getPriority(msg));
System.out.println("是否需要回执:" + isReplySign(msg));
System.out.println("邮件大小:" + msg.getSize() * 1024 + "kb");
boolean isContainerAttachment = isContainAttachment(msg);
System.out.println("是否包含附件:" + isContainerAttachment);
if (isContainerAttachment) {
saveAttachment(msg, "d:\\mailTest\\" + msg.getSubject() + "_"
+ i + "_"); // 保存附件
}
StringBuffer content = new StringBuffer(30);
getMailTextContent(msg, content);
System.out.println("邮件正文:"
+ (content.length() > 100 ? content.substring(0, 100)
+ "..." : content));
System.out.println("------------------第" + msg.getMessageNumber()
+ "封邮件解析结束-------------------- ");
System.out.println(); }
} /**
* @Title: deleteMessage
* @Description: 解析邮件
* @param messages
* 要解析的邮件列表
* @throws MessagingException
* @throws IOException
* void
*/
public static void deleteMessage(Message... messages)
throws MessagingException, IOException {
if (messages == null || messages.length < 1) {
throw new MessagingException("未找到要解析的邮件!");
}
// 解析所有邮件
for (int i = 0, count = messages.length; i < count; i++) { // 邮件删除
Message message = messages[i];
String subject = message.getSubject();
// set the DELETE flag to true
message.setFlag(Flags.Flag.DELETED, true);
System.out.println("Marked DELETE for message: " + subject); }
} /**
* @Title: getSubject
* @Description: 获得邮件主题
* @param msg
* 邮件内容
* @return 解码后的邮件主题
* @throws UnsupportedEncodingException
* @throws MessagingException
* String
*/
public static String getSubject(MimeMessage msg)
throws UnsupportedEncodingException, MessagingException {
return MimeUtility.decodeText(msg.getSubject());
} /**
* @Title: getFrom
* @Description: 获得邮件发件人
* @param msg
* 邮件内容
* @return 姓名 <Email地址>
* @throws MessagingException
* @throws UnsupportedEncodingException
* String
*/
public static String getFrom(MimeMessage msg) throws MessagingException,
UnsupportedEncodingException {
String from = "";
Address[] froms = msg.getFrom();
if (froms.length < 1) {
throw new MessagingException("没有发件人!");
}
InternetAddress address = (InternetAddress) froms[0];
String person = address.getPersonal();
if (person != null) {
person = MimeUtility.decodeText(person) + " ";
} else {
person = "";
}
from = person + "<" + address.getAddress() + ">"; return from;
} /**
* @Title: getReceiveAddress
* @Description: 根据收件人类型,获取邮件收件人、抄送和密送地址。如果收件人类型为空,则获得所有的收件人
* <p>
* Message.RecipientType.TO 收件人
* </p>
* <p>
* Message.RecipientType.CC 抄送
* </p>
* <p>
* Message.RecipientType.BCC 密送
* </p>
* @param msg
* 邮件内容
* @param type
* 收件人类型
* @return 收件人1 <邮件地址1>, 收件人2 <邮件地址2>, ...
* @throws MessagingException
* String
*/
public static String getReceiveAddress(MimeMessage msg,
Message.RecipientType type) throws MessagingException {
StringBuffer receiveAddress = new StringBuffer();
Address[] addresss = null;
if (type == null) {
addresss = msg.getAllRecipients();
} else {
addresss = msg.getRecipients(type);
} if (addresss == null || addresss.length < 1) {
throw new MessagingException("没有收件人!");
}
for (Address address : addresss) {
InternetAddress internetAddress = (InternetAddress) address;
receiveAddress.append(internetAddress.toUnicodeString())
.append(",");
} receiveAddress.deleteCharAt(receiveAddress.length() - 1); // 删除最后一个逗号 return receiveAddress.toString();
} /**
* @Title: getSentDate
* @Description: 获得邮件发送时间
* @param msg
* 邮件内容
* @param pattern
* 日期格式
* @return yyyy年mm月dd日 星期X HH:mm
* @throws MessagingException
* String
*/
public static String getSentDate(MimeMessage msg, String pattern)
throws MessagingException {
Date receivedDate = msg.getSentDate();
if (receivedDate == null) {
return "";
}
if (pattern == null || "".equals(pattern)) {
pattern = "yyyy年MM月dd日 E HH:mm ";
}
return new SimpleDateFormat(pattern).format(receivedDate);
} /**
* @Title: isContainAttachment
* @Description: 判断邮件中是否包含附件
* @param part
* 邮件内容
* @return 邮件中存在附件返回true,不存在返回false
* @throws MessagingException
* @throws IOException
* boolean
*/
public static boolean isContainAttachment(Part part)
throws MessagingException, IOException {
boolean flag = false;
if (part.isMimeType("multipart/*")) {
MimeMultipart multipart = (MimeMultipart) part.getContent();
int partCount = multipart.getCount();
for (int i = 0; i < partCount; i++) {
BodyPart bodyPart = multipart.getBodyPart(i);
String disp = bodyPart.getDisposition();
boolean isHasAttachment = (disp != null && (disp
.equalsIgnoreCase(Part.ATTACHMENT) || disp
.equalsIgnoreCase(Part.INLINE)));
if (isHasAttachment) {
flag = true;
} else if (bodyPart.isMimeType("multipart/*")) {
flag = isContainAttachment(bodyPart);
} else {
String contentType = bodyPart.getContentType();
if (contentType.indexOf("application") != -1) {
flag = true;
} if (contentType.indexOf("name") != -1) {
flag = true;
}
} if (flag) {
break;
}
}
} else if (part.isMimeType("message/rfc822")) {
flag = isContainAttachment((Part) part.getContent());
}
return flag;
} /**
* @Title: isSeen
* @Description: 判断邮件是否已读
* @param msg
* 邮件内容
* @return 如果邮件已读返回true,否则返回false
* @throws MessagingException
* boolean
*/
public static boolean isSeen(MimeMessage msg) throws MessagingException {
return msg.getFlags().contains(Flags.Flag.SEEN);
} /**
* @Title: isReplySign
* @Description: 判断邮件是否需要阅读回执
* @param msg
* 邮件内容
* @return 需要回执返回true,否则返回false
* @throws MessagingException
* boolean
*/
public static boolean isReplySign(MimeMessage msg)
throws MessagingException {
boolean replySign = false;
String[] headers = msg.getHeader("Disposition-Notification-To");
if (headers != null) {
replySign = true;
}
return replySign;
} /**
* @Title: getPriority
* @Description: 获得邮件的优先级
* @param msg
* 邮件内容
* @return 1(High):紧急 3:普通(Normal) 5:低(Low)
* @throws MessagingException
* String
*/
public static String getPriority(MimeMessage msg) throws MessagingException {
String priority = "普通";
String[] headers = msg.getHeader("X-Priority");
if (headers != null) {
String headerPriority = headers[0];
if (headerPriority.indexOf("1") != -1
|| headerPriority.indexOf("High") != -1) {
priority = "紧急";
} else if (headerPriority.indexOf("5") != -1
|| headerPriority.indexOf("Low") != -1) {
priority = "低";
} else {
priority = "普通";
}
}
return priority;
} /**
* @Title: getMailTextContent
* @Description: 获得邮件文本内容
* @param part
* 邮件体
* @param content
* 存储邮件文本内容的字符串
* @throws MessagingException
* @throws IOException
* void
*/
public static void getMailTextContent(Part part, StringBuffer content)
throws MessagingException, IOException {
// 如果是文本类型的附件,通过getContent方法可以取到文本内容,但这不是我们需要的结果,所以在这里要做判断
boolean isContainTextAttach = part.getContentType().indexOf("name") > 0;
if (part.isMimeType("text/*") && !isContainTextAttach) {
content.append(part.getContent().toString());
} else if (part.isMimeType("message/rfc822")) {
getMailTextContent((Part) part.getContent(), content);
} else if (part.isMimeType("multipart/*")) {
Multipart multipart = (Multipart) part.getContent();
int partCount = multipart.getCount();
for (int i = 0; i < partCount; i++) {
BodyPart bodyPart = multipart.getBodyPart(i);
getMailTextContent(bodyPart, content);
}
}
} /**
* @Title: saveAttachment
* @Description: 保存附件
* @param part
* 邮件中多个组合体中的其中一个组合体
* @param destDir
* 附件保存目录
* @throws UnsupportedEncodingException
* @throws MessagingException
* @throws FileNotFoundException
* @throws IOException
* void
*/
public static void saveAttachment(Part part, String destDir)
throws UnsupportedEncodingException, MessagingException,
FileNotFoundException, IOException {
if (part.isMimeType("multipart/*")) {
Multipart multipart = (Multipart) part.getContent(); // 复杂体邮件
// 复杂体邮件包含多个邮件体
int partCount = multipart.getCount();
for (int i = 0; i < partCount; i++) {
// 获得复杂体邮件中其中一个邮件体
BodyPart bodyPart = multipart.getBodyPart(i);
// 某一个邮件体也有可能是由多个邮件体组成的复杂体
String disp = bodyPart.getDisposition();
boolean isHasAttachment = (disp != null && (disp
.equalsIgnoreCase(Part.ATTACHMENT) || disp
.equalsIgnoreCase(Part.INLINE)));
if (isHasAttachment) {
InputStream is = bodyPart.getInputStream();
saveFile(is, destDir, decodeText(bodyPart.getFileName()));
System.out.println("----附件:"
+ decodeText(bodyPart.getFileName()) + ","
+ " 保存路径为" + destDir);
} else if (bodyPart.isMimeType("multipart/*")) {
saveAttachment(bodyPart, destDir);
} else {
String contentType = bodyPart.getContentType();
if (contentType.indexOf("name") != -1
|| contentType.indexOf("application") != -1) {
saveFile(bodyPart.getInputStream(), destDir,
decodeText(bodyPart.getFileName()));
}
}
}
} else if (part.isMimeType("message/rfc822")) {
saveAttachment((Part) part.getContent(), destDir);
}
} /**
* @Title: saveFile
* @Description: 读取输入流中的数据保存至指定目录
* @param is
* 输入流
* @param destDir
* 文件存储目录
* @param fileName
* 文件名
* @throws FileNotFoundException
* @throws IOException
* void
*/
private static void saveFile(InputStream is, String destDir, String fileName)
throws FileNotFoundException, IOException {
BufferedInputStream bis = new BufferedInputStream(is);
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(new File(destDir + fileName)));
int len = -1;
while ((len = bis.read()) != -1) {
bos.write(len);
bos.flush();
}
bos.close();
bis.close();
} /**
* @Title: decodeText
* @Description: 文本解码
* @param encodeText
* 解码MimeUtility.encodeText(String text)方法编码后的文本
* @return 解码后的文本
* @throws UnsupportedEncodingException
* String
*/
public static String decodeText(String encodeText)
throws UnsupportedEncodingException {
if (encodeText == null || "".equals(encodeText)) {
return "";
} else {
return MimeUtility.decodeText(encodeText);
}
}
}

解析结果:

附件文件保存进本地路径:

删除测试:

参考:

https://www.cnblogs.com/huangminwen/category/909841.html

https://blog.csdn.net/xyang81/article/details/7675160

最新文章

  1. rdlc报表相关
  2. 模板:正则替换之后生成标准的php文件 然后include该文件
  3. Emacs学习心得之 基础配置
  4. 流畅web动画的十个法则
  5. span width无效
  6. 进程、线程、轻量级进程、协程与 go 的 goroutine【转载+整理】
  7. NetCore第一步:千里之行 始于环境构筑
  8. 【HDOJ】3652 B-number
  9. C++ 多态性分析
  10. 关于position:fixed;的居中问题
  11. Android ORM 框架之 greenDAO
  12. 关于各种O,DO/BO/DTO/VO/AO/PO
  13. 5. Failed to configure a DataSource: &#39;url&#39; attribute is not specified and no embedded datasource could be configured.
  14. Python之旅Day12 HTML与CSS
  15. day64 url用法以及django的路由系统
  16. 微信小程序——购物车结算
  17. Ruby on Rails Tutorial 第一章笔记
  18. Collection中的方法
  19. HeadFIrst Ruby 第六章总结 block return values
  20. loading加载的代码

热门文章

  1. C++/Php/Python 语言执行shell命令
  2. easyui +ASP.NET 前后台乱码解决方法
  3. 混合开发 Hybird Ionic Angular Cordova web 跨平台 MD
  4. 构建配置 ProGuard Shrink 混淆和压缩
  5. SpringBoot整合Quartz定时任务 的简单实例
  6. ztree默认自动打开第一级
  7. 【Spark】Spark-Redis连接池
  8. Java-JUC(九):使用Lock替换synchronized,使用Condition的await,singal,singalall替换object的wait,notify,notifyall实现线程间的通信
  9. (算法)Game
  10. OpenWrt Web界面修改及功能实现实例说明