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.util.ArrayList;
import java.util.List;
import java.util.Properties;
import javax.mail.BodyPart;
import javax.mail.FetchProfile;
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.UIDFolder;
import org.springframework.util.Assert;
import org.springframework.util.FileCopyUtils;
import org.springframework.util.StringUtils;
import com.sun.mail.pop3.POP3Folder;
/**
* 邮件接收器,方法调用顺序:<code>open->receive->close</code>。
*/
public class MailReceiver {
public static final String POP3 = "pop3";
public static final String INBOX = "INBOX";
private String pop;
private String serverName;
private String serverPasswd;
private MessageFilter msgFilter;
/**
* 附件下载后的存放目录
*/
private String attachSavePath;
private Store store;
private POP3Folder inbox;
private FetchProfile profile;
/**
* 构造器(不保存附件,不对接收邮件进行过滤处理)
*
* @param pop
* POP Server URL
* @param serverName
* 用户名
* @param serverPasswd
* 密码
* @param msgFilter
* 邮件过滤器,<code>null</code>表示不过滤
*/
public MailReceiver(String pop, String serverName, String serverPasswd) {
this(pop, serverName, serverPasswd, null, null);
}
/**
* 构造器(不保存附件)
*
* @param pop
* POP Server URL
* @param serverName
* 用户名
* @param serverPasswd
* 密码
* @param msgFilter
* 邮件过滤器,<code>null</code>表示不过滤
*/
public MailReceiver(String pop, String serverName, String serverPasswd,
MessageFilter msgFilter) {
this(pop, serverName, serverPasswd, msgFilter, null);
}
/**
* 构造器(不对接收邮件进行过滤处理)
*
* @param pop
* POP Server URL
* @param serverName
* 用户名
* @param serverPasswd
* 密码
* @param attachSavePath
* 附件存放路径,<code>null</code>表示不保存附件
*/
public MailReceiver(String pop, String serverName, String serverPasswd,
String attachSavePath) {
this(pop, serverName, serverPasswd, null, attachSavePath);
}
/**
* 构造器
*
* @param pop
* POP Server URL
* @param serverName
* 用户名
* @param serverPasswd
* 密码
* @param msgFilter
* 邮件过滤器,<code>null</code>表示不过滤
* @param attachSavePath
* 附件存放路径,<code>null</code>表示不保存附件
*/
public MailReceiver(String pop, String serverName, String serverPasswd,
MessageFilter msgFilter, String attachSavePath) {
super();
Assert.hasLength(pop, "Pop");
Assert.hasLength(serverName, "ServerName");
Assert.hasLength(serverPasswd, "ServerPasswd");
this.pop = pop;
this.serverName = serverName;
this.serverPasswd = serverPasswd;
this.msgFilter = msgFilter;
this.attachSavePath = attachSavePath;
}
/**
* 连接邮件服务器,打开INBOX
*/
public void open() throws MessagingException {
Properties props = new Properties();
Session session = Session.getDefaultInstance(props, null);
this.store = session.getStore(POP3);
store.connect(pop, serverName, serverPasswd);
this.inbox = (POP3Folder) store.getFolder(INBOX);
inbox.open(Folder.READ_ONLY);
this.profile = new FetchProfile();
profile.add(UIDFolder.FetchProfileItem.UID);
profile.add(FetchProfile.Item.ENVELOPE);
}
/**
* 收取邮件,自动保存附件至指定目录,该方法不会关闭INOBX及连接。<br>
* 调用 {@link #close()}方法关闭INBOX及连接。
*
* @throws UnsupportedEncodingException
* @throws IOException
* @throws MessagingException
*/
public List<Message> receive() throws UnsupportedEncodingException,
IOException, MessagingException {
// 获取邮件及UID
Message[] messages = inbox.getMessages();
inbox.fetch(messages, profile);
// 过滤处理
List<Message> msgList = new ArrayList<Message>();
for (Message msg : messages) {
if (msgFilter == null || msgFilter.filte(inbox, msg)) {
// 保存附件
if (StringUtils.hasLength(attachSavePath)
&& MailUtils.containsAttach(msg)) {
saveAttachment(msg);
}
msgList.add(msg);
}
}
return msgList;
}
/**
* 关闭INBOX及连接。
*/
public void close() {
try {
inbox.close(false);
store.close();
} catch (MessagingException e) {
throw new MailException("关闭INBOX及连接出错", e);
}
}
public POP3Folder getInbox() {
return inbox;
}
/**
* 保存附件
*
* @throws Exception
* @throws IOException
* @throws MessagingException
* @throws UnsupportedEncodingException
*/
private void saveAttachment(Part part) throws UnsupportedEncodingException,
MessagingException, IOException {
if (part.isMimeType("multipart/*")) {
String filename = "";
Multipart mp = (Multipart) part.getContent();
for (int i = 0; i < mp.getCount(); i++) {
BodyPart mpart = mp.getBodyPart(i);
String disposition = mpart.getDisposition();
if ((disposition != null)
&& ((disposition.equals(Part.ATTACHMENT)) || (disposition
.equals(Part.INLINE)))) {
filename = MailUtils.decodeText(mpart.getFileName());
saveFile(filename, mpart.getInputStream());
} else if (mpart.isMimeType("multipart/*")) {
saveAttachment(mpart);
} else {
filename = MailUtils.decodeText(mpart.getFileName());
if (filename != mpart.getFileName()) {
saveFile(filename, mpart.getInputStream());
}
}
}
} else if (part.isMimeType("message/rfc822")) {
saveAttachment((Part) part.getContent());
}
}
/**
* 保存附件到指定目录
*
* @throws IOException
* @throws FileNotFoundException
*/
private void saveFile(String filename, InputStream in)
throws FileNotFoundException, IOException {
File file = new File(attachSavePath + File.separator + filename);
FileCopyUtils.copy(in, new FileOutputStream(file));
}
}
import javax.mail.Message;
import javax.mail.MessagingException;
import com.sun.mail.pop3.POP3Folder;
/**
* 邮件过滤接口,用于实现只收取未读邮件这样的功能。
*/
public interface MessageFilter {
/**
* 过滤邮件
*
* @param box
* 邮件文件夹
* @param message
* 邮件消息
* @return 如何需要读取此邮件,返回<code>true</code>,否则返回<code>false</code>
*/
boolean filte(POP3Folder box, Message message) throws MessagingException;
}
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import javax.mail.BodyPart;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.internet.MimeUtility;
import org.springframework.util.Assert;
/**
* 邮件处理实用类
*/
public class MailUtils {
private MailUtils() {
}
/**
* <code>MimeUtility.decodeText(text)</code>
*/
public static String decodeText(String text)
throws UnsupportedEncodingException {
if (text == null)
return null;
String s = text.toLowerCase();
if (s.contains("gb2312") || s.contains("gbk")) {
return MimeUtility.decodeText(text);
}
return text;
}
/**
* 判断邮件是否包含附件
*
* @throws IOException
* @throws MessagingException
*/
public static boolean containsAttach(Part part) throws MessagingException,
IOException {
boolean attachflag = false;
if (part.isMimeType("multipart/*")) {
Multipart mp = (Multipart) part.getContent();
for (int i = 0; i < mp.getCount(); i++) {
BodyPart mpart = mp.getBodyPart(i);
String disposition = mpart.getDisposition();
if ((disposition != null)
&& ((disposition.equals(Part.ATTACHMENT)) || (disposition
.equals(Part.INLINE))))
attachflag = true;
else if (mpart.isMimeType("multipart/*")) {
attachflag = containsAttach((Part) mpart);
} else {
String contype = mpart.getContentType();
if (contype.toLowerCase().indexOf("application") != -1)
attachflag = true;
if (contype.toLowerCase().indexOf("name") != -1)
attachflag = true;
}
}
} else if (part.isMimeType("message/rfc822")) {
attachflag = containsAttach((Part) part.getContent());
}
return attachflag;
}
/**
* 解析邮件,把得到的邮件内容保存到<code>bodyText</code>对象中.<br>
* 根据MimeType类型的不同执行不同的解析操作.
*
* @throws IOException
* @throws MessagingException
*/
public static void getMailContent(Part part, StringBuffer bodyText)
throws MessagingException, IOException {
Assert.notNull(bodyText, "bodyText");
String contenttype = part.getContentType();
int nameindex = contenttype.indexOf("name");
boolean conname = false;
if (nameindex != -1)
conname = true;
if (part.isMimeType("text/plain") && !conname) {
bodyText.append((String) part.getContent());
} else if (part.isMimeType("text/html") && !conname) {
bodyText.append((String) part.getContent());
} else if (part.isMimeType("multipart/*")) {
Multipart multipart = (Multipart) part.getContent();
int counts = multipart.getCount();
for (int i = 0; i < counts; i++) {
getMailContent(multipart.getBodyPart(i), bodyText);
}
} else if (part.isMimeType("message/rfc822")) {
getMailContent((Part) part.getContent(), bodyText);
}
}
}
分享到:
相关推荐
这个应用可能使用了JavaMail API来实现POP3邮件接收功能,并且具备一个可视化窗口,让用户能够直观地查看和管理邮件。可视化界面设计通常会涉及到Swing或JavaFX这样的GUI库,用于创建按钮、文本框、列表视图等组件,...
总的来说,基于POP3的Java邮件接收程序是通过JavaMail API与POP3服务器通信,执行如登录、查询邮件列表、下载邮件等操作,从而实现邮件的自动化处理。理解POP3协议和JavaMail API的使用是构建这类程序的关键。
JavaMail是Java平台上的一个开源库,它提供了在Java应用程序中发送和接收电子邮件的能力。通过JavaMail API,开发者可以方便地与SMTP(简单邮件传输协议)、POP3(邮局协议)和IMAP(因特网消息访问协议)服务器交互...
JavaMail邮件发送程序是Java平台上的一个开源库,用于处理电子邮件的发送和接收。这个程序允许开发者通过SMTP(简单邮件传输协议)、POP3(邮局协议)或IMAP(因特网消息访问协议)等标准协议来收发邮件。在Java EE...
JavaMail API支持多种邮件协议,包括SMTP(简单邮件传输协议)用于发送邮件,以及POP3(邮局协议第3版)和IMAP(因特网消息访问协议)用于接收邮件。在这个项目中,它似乎已经与Tomcat服务器集成,使得开发者能够...
这个类称为 MailInfo,包含了邮件的各种信息,例如邮件服务器的主机名和端口号、邮件发送者的地址、邮件接收者的地址、邮件主题、邮件内容、邮件附件等。 在 MailInfo 类中,我们定义了多个成员变量,用于存储邮件...
2. IMAP 和 POP3 协议:对于邮件接收,JavaMail 提供了 `Folder` 和 `Message` 类来处理IMAP或POP3服务器上的邮箱。IMAP 允许用户在线查看邮件,而POP3通常将邮件下载到本地存储。使用 `Store` 类连接到服务器,然后...
JavaMail 是一个强大的开源库,用于在Java应用程序中处理电子邮件。它支持多种协议,包括POP3、IMAP和SMTP,这些协议分别用于接收、检索和发送邮件。在使用JavaMail时,了解如何进行加密和非加密通信对于确保数据...
在Java编程中,我们可以利用JavaMail API来实现基于POP3的邮件接收功能。以下是对标题和描述中所述知识点的详细解释: 1. **JavaMail API**: JavaMail API 是一套用于处理邮件的Java库,提供了丰富的接口和类,...
### 邮件接收流程 1. **配置 Properties**: 设置 POP3 或 IMAP 服务器信息。 2. **创建 Session**: 创建用于连接邮件服务器的 Session。 3. **获取 Store**: 通过 Session 的 `getStore()` 方法获取相应的 Store ...
这个简单的JavaMail程序包含了收发邮件的基本功能,对于理解JavaMail的工作原理和使用方法非常有帮助。 首先,让我们从发送邮件的部分开始。在JavaMail中,发送邮件的核心类是`javax.mail.Session`和`javax.mail....
《基于Javamail的邮件收发系统》是一份完整的毕业设计资料,涵盖了从理论到实践的全过程,包括Word论文、开题报告、任务书以及答辩PPT。这个项目主要探讨了如何使用JavaMail API来实现一个高效、稳定的邮件收发系统...
JavaMail 是一个开源的 Java 库,用于在 Java 应用程序中实现电子邮件的发送和接收。这个小程序可能包含了一套完整的类,可以帮助开发者快速构建邮件发送功能,无需从头开始编写所有必需的代码。 JavaMail 提供了对...
JavaMail是一个开源API,用于处理SMTP、IMAP和POP3等邮件协议,使得开发者能够方便地在Java应用程序中实现邮件收发功能。 2.2 Swing和Eclipse Swing是Java的GUI库,用于构建用户界面,而Eclipse是一款广泛使用的...
JavaMail 是一个强大的 Java 库,它允许开发者在应用程序中实现电子邮件的发送和接收功能。这个库支持多种邮件协议,如 SMTP(简单邮件传输协议)用于发送邮件,POP3(邮局协议)和 IMAP(因特网消息访问协议)用于...
JavaMail 是一个开源的 Java API,它允许开发者在 Java 应用程序中发送和接收电子邮件。这个基于 Javamail 的邮件收发系统是利用 JavaMail 提供的接口和类来构建的一个完整的邮件处理系统。该系统可能包含了多个组件...
邮件接收功能: 系统能够从用户指定的邮箱服务器上接收邮件,并将邮件内容显示在用户界面上。 使用JavaMail API中的POP3(Post Office Protocol 3)或者IMAP(Internet Message Access Protocol)协议来从邮件...
在这个"javaMail收发邮件经典程序"中,我们将深入探讨如何利用JavaMail库进行邮件的发送和接收,并特别关注添加多个附件、指定多个发送人以及接收邮件附件的操作。 首先,要使用JavaMail,我们需要在项目中引入其...
JavaMail邮件系统开发是Java开发者在构建应用程序时用于发送和接收电子邮件的重要工具。它是一个开源的API,提供了丰富的功能,让开发者能够轻松地与各种邮件服务器进行交互。在这个主题中,我们将深入探讨JavaMail...
JavaMail API是Java平台中的一个标准扩展库,用于发送、接收以及管理电子邮件。它提供了丰富的接口来实现邮件的各种操作,如构建复杂的MIME消息、处理附件等。 #### 二、使用JavaMail收发Gmail邮件 在使用JavaMail...