package com.hqmart.test;
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.ParseException;
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;
import com.sun.mail.imap.IMAPFolder;
import com.sun.mail.imap.IMAPStore;
public class POP3ReceiveMailTest {
public static void main(String[] args) throws Exception {
receive();
}
/**
* 接收邮件
*
* IMAP 设置 服务器名称: webmail.staff.hq-mart.com 端口: 143 加密方法: TLS
*/
public static void receive() throws Exception {
// pop3模式读取
// 准备连接服务器的会话信息
/*
* Properties props = new Properties();
* props.setProperty("mail.store.protocol", "pop3"); // 协议
* props.setProperty("mail.pop3.port", "110"); // 端口
* //props.setProperty("mail.pop3.host", "你的邮箱服务器");
* // pop3服务器
*
* // 创建Session实例对象 Session session = Session.getInstance(props); Store
* store = session.getStore("pop3");
* store.connect("你的邮箱服务器","你的邮箱用户名","你的邮箱密码");
*/
// imap模式读取(允许修改邮件的状态)
String user = "你的邮箱用户名";// 邮箱的用户名
String password = "你的邮箱密码"; // 邮箱的密码
Properties prop = System.getProperties();
prop.put("mail.store.protocol", "imap");
prop.put("mail.imap.host", "你的邮箱服务器");
Session session = Session.getInstance(prop);
IMAPStore store = (IMAPStore) session.getStore("imap"); // 使用imap会话机制,连接服务器
store.connect(user, password);
// 获得收件箱
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();
for (int i = 0; i < messages.length; i++) {
Flags flags = messages[i].getFlags();
if (flags.contains(Flags.Flag.SEEN))
System.out.println("这是一封已读邮件");
else {
System.out.println("未读邮件");
messages[i].setFlag(Flags.Flag.SEEN, true);
messages[i].setFlag(Flags.Flag.SEEN, true);
}
}
parseMessage(messages);
// 释放资源
folder.close(true);
store.close();
}
/**
* 解析邮件
*
* @param messages
* 要解析的邮件列表
* @throws ParseException
*/
public static void parseMessage(Message... messages)
throws MessagingException, IOException, ParseException {
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, "yyyy-MM-dd HH:mm:ss"));
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, "E:\\test\\" + msg.getSubject() + "_"); // 保存附件
}
StringBuffer content = new StringBuffer(30);
getMailTextContent(msg, content);
System.out.println("邮件正文:" + content);
System.out.println("------------------第" + msg.getMessageNumber()
+ "封邮件解析结束-------------------- ");
System.out.println();
}
}
/**
* 获得邮件主题
*
* @param msg
* 邮件内容
* @return 解码后的邮件主题
*/
public static String getSubject(MimeMessage msg)
throws UnsupportedEncodingException, MessagingException {
return MimeUtility.decodeText(msg.getSubject());
}
/**
* 获得邮件发件人
*
* @param msg
* 邮件内容
* @return 姓名 <Email地址>
* @throws MessagingException
* @throws UnsupportedEncodingException
*/
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;
}
/**
* 根据收件人类型,获取邮件收件人、抄送和密送地址。如果收件人类型为空,则获得所有的收件人
* <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
*/
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();
}
/**
* 获得邮件发送时间
*
* @param msg
* 邮件内容
* @return yyyy年mm月dd日 星期X HH:mm
* @throws MessagingException
*/
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);
}
/**
* 判断邮件中是否包含附件
*
* @param msg
* 邮件内容
* @return 邮件中存在附件返回true,不存在返回false
* @throws MessagingException
* @throws IOException
*/
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();
if (disp != null
&& (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp
.equalsIgnoreCase(Part.INLINE))) {
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;
}
/**
* 判断邮件是否已读
*
* @param msg
* 邮件内容
* @return 如果邮件已读返回true,否则返回false
* @throws MessagingException
*/
public static boolean isSeen(MimeMessage msg) throws MessagingException {
return msg.getFlags().contains(Flags.Flag.SEEN);
}
/**
* 判断邮件是否需要阅读回执
*
* @param msg
* 邮件内容
* @return 需要回执返回true,否则返回false
* @throws MessagingException
*/
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;
}
/**
* 获得邮件的优先级
*
* @param msg
* 邮件内容
* @return 1(High):紧急 3:普通(Normal) 5:低(Low)
* @throws MessagingException
*/
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;
}
/**
* 获得邮件文本内容
*
* @param part
* 邮件体
* @param content
* 存储邮件文本内容的字符串
* @throws MessagingException
* @throws IOException
*/
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);
}
}
}
/**
* 保存附件
*
* @param part
* 邮件中多个组合体中的其中一个组合体
* @param destDir
* 附件保存目录
* @throws UnsupportedEncodingException
* @throws MessagingException
* @throws FileNotFoundException
* @throws IOException
*/
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();
if (disp != null
&& (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp
.equalsIgnoreCase(Part.INLINE))) {
InputStream is = bodyPart.getInputStream();
saveFile(is, destDir, decodeText(bodyPart.getFileName()));
} 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);
}
}
/**
* 读取输入流中的数据保存至指定目录
*
* @param is
* 输入流
* @param fileName
* 文件名
* @param destDir
* 文件存储目录
* @throws FileNotFoundException
* @throws IOException
*/
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();
}
/**
* 文本解码
*
* @param encodeText
* 解码MimeUtility.encodeText(String text)方法编码后的文本
* @return 解码后的文本
* @throws UnsupportedEncodingException
*/
public static String decodeText(String encodeText)
throws UnsupportedEncodingException {
if (encodeText == null || "".equals(encodeText)) {
return "";
} else {
return MimeUtility.decodeText(encodeText);
}
}
}
相关推荐
Java Email 是一种在Java应用程序中发送和接收电子邮件的机制,主要通过JavaMail API来实现。这个"java-email.rar"文件包含了一个完整的Java Email客户端代码示例,帮助开发者理解和实现自己的邮件功能。 JavaMail ...
JAVA实现的Email客户端,感觉还好用,有兴趣的可以研究一下
在Java编程环境中,收发电子邮件是一项常见的任务,通常涉及到SMTP(Simple Mail Transfer Protocol)和POP3(Post Office Protocol version 3)协议。本教程将详细讲解如何使用Java来实现这一功能,以及涉及到的...
### 使用Java开发Email工具之发送邮件 在Java中开发电子邮件工具时,主要依赖于JavaMail API,这是一个功能强大的库,可以实现多种类型的邮件发送、接收等功能。本文将详细介绍如何使用JavaMail API来发送邮件,...
JavaMail 是一个强大的开源库,专门用于在Java应用程序中实现电子邮件功能。它提供了与各种电子邮件协议(如SMTP、POP3和IMAP)交互的API,使得开发者能够方便地发送、接收和管理邮件。本篇文章将深入探讨如何使用...
Java-Email开发是一个涵盖电子邮件系统构建的技术主题,主要利用POP3和SMTP协议来实现邮件的发送和接收。在本文中,我们将深入探讨这两个协议的工作原理,以及如何使用Java进行电子邮件开发。 POP3(Post Office ...
接下来,`ExeclUtils.java` 类是实现读取Excel并将其内容转换为JavaBean列表的关键。Apache POI 提供了 `XSSFWorkbook`(用于.xlsx)和 `HSSFWorkbook`(用于.xls)类来处理Excel文件。以下是一个基本的使用示例,...
4. **添加附件**: 对于每个附件,创建一个新的`MimeBodyPart`,读取文件内容并将其附加到`multipart`。 ```java File file = new File("path/to/attachment.txt"); BodyPart attachmentPart = new MimeBodyPart(); ...
Java Socket电子邮件发送与接收是基于Java网络编程技术实现的一种通信方式,主要涉及到Java的Socket类以及Email相关的API。本项目是一个课程项目,开发者通过几天的努力完成了一个具备图形用户界面(GUI)的邮件系统...
- **JavaMail API**: JavaMail API由Sun Microsystems开发,是Java中用于读取、写入和管理电子邮件的标准API。 - **SMTP客户端库**: SMTP是简单邮件传输协议的简称,它是用于发送邮件的标准协议之一。SMTP客户端库...
在给定的"用java编写的Email 源程序"中,我们可以看到这是一份使用Java实现的SMTP(Simple Mail Transfer Protocol)邮件发送功能的源代码。SMTP是互联网上用于发送电子邮件的标准协议。这个程序可能包含了设置、...
在Java编程中,读取数据库并将其...总的来说,"读取数据库类写成java类"涉及了Java的数据库连接、SQL查询、结果集处理、对象映射以及面向对象的属性读写。理解这些概念对于开发与数据库交互的Java应用程序至关重要。
Java Properties 类是Java标准库中...总之,Java Properties类是Java开发中处理配置文件的利器,通过它的方法可以方便地读取、修改和保存配置信息,尤其在处理包含中文字符的配置时,注意编码问题,确保数据的正确性。
Java Web Email邮件系统是基于Java技术构建的Web应用程序,它允许用户通过网页界面发送、接收和管理电子邮件。这个系统的核心是使用JavaMail API来处理邮件的收发功能,结合Servlet和JSP技术来构建Web前端,提供用户...
这个库允许开发者在Java应用程序中实现复杂的电子邮件功能,如创建、发送、读取和管理邮件。Java EMail 库通常依赖于两个核心组件,即 javax.mail-1.6.2.jar 和 activation-1.1.1.jar。 javax.mail-1.6.2.jar 是...
POI是Apache软件基金会的一个项目,用于读写Microsoft Office格式的文件,包括XLS。以下是处理XLS文件的基本步骤: 1. 引入Apache POI依赖库,如`poi`和`poi-ooxml`。 2. 使用`HSSFWorkbook`类打开或创建XLS文件,`...
标题中的"email_javaemail_library_"暗示我们将讨论的是一个专门针对Java平台的邮件库。在Java中,最常用的邮件库之一是JavaMail API,它是一个开放源代码的API,支持多种邮件协议,包括SMTP、POP3和IMAP。 ...
这个"java email.jar"文件很可能就是包含了JavaMail API的JAR包,它是开发基于Java的邮件应用的重要工具。JavaMail使得在Java程序中处理SMTP、POP3和IMAP等邮件协议变得简单,极大地简化了电子邮件的编程工作。 ...
1. **Java Email API** Java提供了`javax.mail`和`javax.mail.internet`这两个API来处理电子邮件的发送。首先,需要设置SMTP服务器的相关属性,包括SMTP主机地址、端口、用户名和密码。然后,通过`Session`对象创建...
首先,JavaMail API是Java平台上的一个标准库,它允许开发者创建、发送和读取邮件。为了发送邮件,我们需要导入以下核心库: ```java import javax.mail.*; import javax.mail.internet.*; import java.util....