`

java读取email

 
阅读更多

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.rar_email_email java_email客户端_java email_java mail 客户

    Java Email 是一种在Java应用程序中发送和接收电子邮件的机制,主要通过JavaMail API来实现。这个"java-email.rar"文件包含了一个完整的Java Email客户端代码示例,帮助开发者理解和实现自己的邮件功能。 JavaMail ...

    JAVA实现Email客户端

    JAVA实现的Email客户端,感觉还好用,有兴趣的可以研究一下

    java收发email算法

    在Java编程环境中,收发电子邮件是一项常见的任务,通常涉及到SMTP(Simple Mail Transfer Protocol)和POP3(Post Office Protocol version 3)协议。本教程将详细讲解如何使用Java来实现这一功能,以及涉及到的...

    用java开发Email工具之发送邮件

    ### 使用Java开发Email工具之发送邮件 在Java中开发电子邮件工具时,主要依赖于JavaMail API,这是一个功能强大的库,可以实现多种类型的邮件发送、接收等功能。本文将详细介绍如何使用JavaMail API来发送邮件,...

    java 实现email

    JavaMail 是一个强大的开源库,专门用于在Java应用程序中实现电子邮件功能。它提供了与各种电子邮件协议(如SMTP、POP3和IMAP)交互的API,使得开发者能够方便地发送、接收和管理邮件。本篇文章将深入探讨如何使用...

    Java-Email开发

    Java-Email开发是一个涵盖电子邮件系统构建的技术主题,主要利用POP3和SMTP协议来实现邮件的发送和接收。在本文中,我们将深入探讨这两个协议的工作原理,以及如何使用Java进行电子邮件开发。 POP3(Post Office ...

    Java读取Excel解析为JavaBean

    接下来,`ExeclUtils.java` 类是实现读取Excel并将其内容转换为JavaBean列表的关键。Apache POI 提供了 `XSSFWorkbook`(用于.xlsx)和 `HSSFWorkbook`(用于.xls)类来处理Excel文件。以下是一个基本的使用示例,...

    java email 发送带附件的邮件

    4. **添加附件**: 对于每个附件,创建一个新的`MimeBodyPart`,读取文件内容并将其附加到`multipart`。 ```java File file = new File("path/to/attachment.txt"); BodyPart attachmentPart = new MimeBodyPart(); ...

    Java Socket Email 发送接收

    Java Socket电子邮件发送与接收是基于Java网络编程技术实现的一种通信方式,主要涉及到Java的Socket类以及Email相关的API。本项目是一个课程项目,开发者通过几天的努力完成了一个具备图形用户界面(GUI)的邮件系统...

    使用java发送Email

    - **JavaMail API**: JavaMail API由Sun Microsystems开发,是Java中用于读取、写入和管理电子邮件的标准API。 - **SMTP客户端库**: SMTP是简单邮件传输协议的简称,它是用于发送邮件的标准协议之一。SMTP客户端库...

    用java编写的Email 源程序

    在给定的"用java编写的Email 源程序"中,我们可以看到这是一份使用Java实现的SMTP(Simple Mail Transfer Protocol)邮件发送功能的源代码。SMTP是互联网上用于发送电子邮件的标准协议。这个程序可能包含了设置、...

    读取数据库类写成java类

    在Java编程中,读取数据库并将其...总的来说,"读取数据库类写成java类"涉及了Java的数据库连接、SQL查询、结果集处理、对象映射以及面向对象的属性读写。理解这些概念对于开发与数据库交互的Java应用程序至关重要。

    Java Properties 解决中文乱码和顺序读写.docx

    Java Properties 类是Java标准库中...总之,Java Properties类是Java开发中处理配置文件的利器,通过它的方法可以方便地读取、修改和保存配置信息,尤其在处理包含中文字符的配置时,注意编码问题,确保数据的正确性。

    自己开发的JAVA Web Email邮件系统

    Java Web Email邮件系统是基于Java技术构建的Web应用程序,它允许用户通过网页界面发送、接收和管理电子邮件。这个系统的核心是使用JavaMail API来处理邮件的收发功能,结合Servlet和JSP技术来构建Web前端,提供用户...

    Java EMail Java发邮件的依赖库

    这个库允许开发者在Java应用程序中实现复杂的电子邮件功能,如创建、发送、读取和管理邮件。Java EMail 库通常依赖于两个核心组件,即 javax.mail-1.6.2.jar 和 activation-1.1.1.jar。 javax.mail-1.6.2.jar 是...

    java中email邮件发送接受和处理excel文件(xls)实例

    POI是Apache软件基金会的一个项目,用于读写Microsoft Office格式的文件,包括XLS。以下是处理XLS文件的基本步骤: 1. 引入Apache POI依赖库,如`poi`和`poi-ooxml`。 2. 使用`HSSFWorkbook`类打开或创建XLS文件,`...

    email_javaemail_library_

    标题中的"email_javaemail_library_"暗示我们将讨论的是一个专门针对Java平台的邮件库。在Java中,最常用的邮件库之一是JavaMail API,它是一个开放源代码的API,支持多种邮件协议,包括SMTP、POP3和IMAP。 ...

    java email.jar

    这个"java email.jar"文件很可能就是包含了JavaMail API的JAR包,它是开发基于Java的邮件应用的重要工具。JavaMail使得在Java程序中处理SMTP、POP3和IMAP等邮件协议变得简单,极大地简化了电子邮件的编程工作。 ...

    java email word csv

    1. **Java Email API** Java提供了`javax.mail`和`javax.mail.internet`这两个API来处理电子邮件的发送。首先,需要设置SMTP服务器的相关属性,包括SMTP主机地址、端口、用户名和密码。然后,通过`Session`对象创建...

    Java发送邮件Email

    首先,JavaMail API是Java平台上的一个标准库,它允许开发者创建、发送和读取邮件。为了发送邮件,我们需要导入以下核心库: ```java import javax.mail.*; import javax.mail.internet.*; import java.util....

Global site tag (gtag.js) - Google Analytics