封装javamail处理接收邮件过程,简化客户端调用
package tf;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.security.Security;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.UUID;
import javax.mail.BodyPart;
import javax.mail.FetchProfile;
import javax.mail.Folder;
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.MimeUtility;
public class ReceiveEmail {
private final String username; // 用户名
private final String password; // 密码
private String host; // 服务器名
private String dir = "C:/TEMP"; // 默认附件保存目录
private boolean ssl = false; // 默认不使用安全套接层协议
private Store store;
private Folder folder;
public ReceiveEmail(String host, String username, String password) {
this.host = host;
this.username = username;
this.password = password;
}
/**
* 测试接收126邮箱邮件
*/
public static void main(String[] args) {
String host = "pop3.126.com";
String username = "test";
String password = "test";
ReceiveEmail receiveEmail = new ReceiveEmail(host, username, password);
// receiveEmail.setSSL(true); //接收gmail邮件需设置
// receiveEmail.setDir("D:/upload"); //设置附件保存目录
List<Message> list = receiveEmail.receive();
System.out.println("total email:" + list.size());
for (Message msg : list) {
System.out.println("-------------start--------------------------");
System.out.println("from:" + msg.getFrom());
System.out.println("sendDate:" + msg.getFormatSendDate());// msg.getSendDate();
System.out.println("subject:" + msg.getSubject());
System.out.println("content:" + msg.getContent());
Map<String, String> map = msg.getAttachMap();
for (Iterator<String> it = map.keySet().iterator(); it.hasNext();) {
String name = it.next();
String path = map.get(name);
System.out.println("attach:" + name + "===" + path);
}
System.out.println("-------------end----------------------------");
}
}
/**
* 设置附件保存目录
*/
public void setDir(String dir) {
this.dir = dir;
}
/**
* 设置是否使用安全套接层协议
*/
public void setSSL(boolean ssl) {
this.ssl = ssl;
}
/**
* 接收邮件,返回所有的(新)邮件信息
*/
public List<Message> receive() {
List<Message> list = null;
try {
list = handleMessages();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
folder.close(true);
store.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return list;
}
/**
* 处理服务器上所有Message
*/
private List<Message> handleMessages() throws Exception {
javax.mail.Message[] msgs = getMessages();
List<Message> list = new ArrayList<Message>();
for (int i = 0; i < msgs.length; i++) {
if (isNew((MimeMessage) msgs[i])) {
Message message = new Message();
message.setFrom(getFrom(msgs[i]));
message.setSubject(msgs[i].getSubject());
message.setSendDate(msgs[i].getSentDate());
message.setContent(getContent(msgs[i]));
handleAttachments(message, msgs[i]);
list.add(message);
}
}
return list;
}
/**
* 获取服务器上所有Message
*/
private javax.mail.Message[] getMessages() throws Exception {
Properties props = System.getProperties();
if (ssl) {
handleSSL(props);
host = host.replace("pop3", "pop");
}
Session session = Session.getDefaultInstance(props, null);
store = session.getStore("pop3");
store.connect(host, username, password);
folder = store.getFolder("INBOX");
folder.open(Folder.READ_WRITE);
javax.mail.Message[] msgs = folder.getMessages();
FetchProfile fp = new FetchProfile();
fp.add(FetchProfile.Item.ENVELOPE);
fp.add(FetchProfile.Item.FLAGS);
fp.add("X-Mailer");
folder.fetch(msgs, fp);
return msgs;
}
/**
* 处理邮件来源
*/
private String getFrom(javax.mail.Message msg) throws Exception {
String personal = ((InternetAddress) msg.getFrom()[0]).getPersonal();
String address = "<"
+ ((InternetAddress) msg.getFrom()[0]).getAddress() + ">";
if (null == personal) {
personal = address.substring(1, address.indexOf("@"));
}
return personal + address;
}
/**
* 处理邮件内容
*/
private String getContent(Part part) throws Exception {
if (part.isMimeType("text/plain")) {
return (String) part.getContent();
} else if (part.isMimeType("text/html")) {
return (String) part.getContent();
} else if (part.isMimeType("multipart/*")) {
Multipart multipart = (Multipart) part.getContent();
return getContent(multipart.getBodyPart(0));
} else if (part.isMimeType("message/rfc822")) {
return getContent((Part) part.getContent());
}
return "";
}
/**
* 判断是否新邮件(处理省略)
*/
private boolean isNew(MimeMessage msg) throws Exception {
// 对于pop3协议,用msg.getMessageID()唯一的UID判断(可建表保存UID,再判断是否存在即可。)
// javamail提供的处理新邮件方法对pop3协议不起作用
return true;
}
/**
* 处理附件
*/
private void handleAttachments(Message message, Part part) throws Exception {
if (part.isMimeType("multipart/*")) {
Multipart mp = (Multipart) part.getContent();
for (int i = 0; i < mp.getCount(); i++) {
BodyPart bp = mp.getBodyPart(i);
String disposition = bp.getDisposition();
if (disposition != null
&& (disposition.equals(Part.ATTACHMENT) || disposition
.equals(Part.INLINE))) {
saveFile(message, bp);
} else if (bp.isMimeType("multipart/*")) {
handleAttachments(message, (Part) part.getContent());
} else {
saveFile(message, bp);
}
}
} else if (part.isMimeType("message/rfc822")) {
handleAttachments(message, (Part) part.getContent());
}
}
/**
* 真正的处理附件上传
*/
private void saveFile(Message message, BodyPart bp) throws Exception {
String fileName = bp.getFileName();
if ((fileName != null)) {
new File(dir).mkdirs(); // 新建目录
fileName = MimeUtility.decodeText(fileName);
String suffix = fileName.substring(fileName.lastIndexOf("."));
String filePath = dir + "/" + UUID.randomUUID() + suffix;
message.attachMap.put(fileName, filePath);
File file = new File(filePath);
BufferedInputStream bis = new BufferedInputStream(bp
.getInputStream());
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(file));
int i;
while ((i = bis.read()) != -1) {
bos.write(i);
}
bos.close();
bis.close();
}
}
/**
* 处理安全套接层协议
*/
private void handleSSL(Properties props) {
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
props.setProperty("mail.pop3.socketFactory.class", SSL_FACTORY);
props.setProperty("mail.pop3.socketFactory.fallback", "false");
props.setProperty("mail.pop3.port", "995");
props.setProperty("mail.pop3.socketFactory.port", "995");
props.setProperty("mail.imap.socketFactory.class", SSL_FACTORY);
props.setProperty("mail.imap.socketFactory.fallback", "false");
props.setProperty("mail.imap.port", "993");
props.setProperty("mail.imap.socketFactory.port", "993");
}
/**
* 保存读取的每封邮件信息
*/
public static class Message {
private String from; // 发件人
private String subject; // 主题
private String content; // 内容
private Date sendDate; // 发送日期
// 附件信息(文件名=文件路径)
private Map<String, String> attachMap = new HashMap<String, String>();
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getFormatSendDate() {
return new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(sendDate);
}
public Date getSendDate() {
return sendDate;
}
public void setSendDate(Date sendDate) {
this.sendDate = sendDate;
}
public Map<String, String> getAttachMap() {
return attachMap;
}
public void setAttachMap(Map<String, String> attachMap) {
this.attachMap = attachMap;
}
}
}
分享到:
相关推荐
以上就是关于"JAVA100例之实例48 使用JavaMail接收邮件"的主要内容,通过学习和实践这个实例,开发者将能够熟练地使用JavaMail API来实现邮件的接收功能,这对于构建自动化邮件系统或者处理邮件相关的业务需求非常有...
javamail接收邮件例子,我稍微改动了一下,有些错误和异常抛出了
JavaMail 是一个开源库,用于在Java应用程序中发送和接收电子邮件。这个库提供了一套API,使得开发者能够方便地处理SMTP、POP3和IMAP等邮件协议。在给定的标题和描述中,我们讨论的是如何使用JavaMail API来接收邮件...
很好的邮件处理代码,1.5版本,作为build path放在eclipse里面,就可以用啦! oracle官方推的,很好!jdk1.6版本以上用起来很方便。
JavaMail 是一个 Java API,用于在 Java 应用程序中发送和接收电子邮件。它提供了一个抽象层,允许开发者使用不同的电子邮件协议,例如 SMTP、POP3 和 IMAP。 在本文中,我们将讨论如何使用 JavaMail 库来代发邮件...
在使用JavaMail进行邮件发送的过程中,可能会遇到以下几种常见问题:发送成功但收件方未收到邮件、邮件收到后无主题或无收件人信息以及邮件内容出现乱码等情况。本文将详细探讨这些问题的原因及相应的解决方案。 ##...
JavaMail 是一个强大的 Java 库,它允许开发者在应用程序中实现电子邮件的发送和接收功能。这个库支持多种邮件协议,如 SMTP(简单邮件传输协议)用于发送邮件,POP3(邮局协议)和 IMAP(因特网消息访问协议)用于...
JavaMail 是一个强大的开源库,用于在Java应用程序中发送和接收电子邮件。它支持多种协议,如POP3(Post Office Protocol version 3)和IMAP(Internet Message Access Protocol),这两种协议常用于从邮件服务器...
JavaMail 是一个开源的 Java 库,用于处理电子邮件的发送和接收。它提供了与 SMTP、POP3 和 IMAP 协议交互的接口,是开发基于 Java 的电子邮件应用的基础。回执邮件是邮件服务中的一项功能,它允许发件人在发送邮件...
2. **邮件协议**:Javamail支持多种邮件协议,如SMTP(Simple Mail Transfer Protocol)用于发送邮件,POP3(Post Office Protocol version 3)和IMAP(Internet Message Access Protocol)用于接收邮件。在实现邮件...
通过JavaMail API,开发者可以方便地与SMTP(简单邮件传输协议)、POP3(邮局协议)和IMAP(因特网消息访问协议)服务器交互,实现邮件的创建、发送、接收和管理等功能。 二、邮件收发原理 邮件收发系统的核心在于...
JavaMail是一种在Java环境中发送和接收电子邮件的标准API,它提供了丰富的功能来处理复杂的邮件操作。在Struts2框架中集成JavaMail服务,可以方便地在Web应用中实现邮件的发送功能。下面我们将深入探讨JavaMail的...
JavaMail 是一个强大的Java库,它允许开发人员在Java应用程序中实现邮件的发送、接收以及管理功能。这个项目不仅提供了SMTP、POP3和IMAP协议的支持,还包含了丰富的API,可以方便地处理邮件的MIME编码、附件、HTML...
它支持多种协议,包括POP3、IMAP和SMTP,这些协议分别用于接收、检索和发送邮件。在使用JavaMail时,了解如何进行加密和非加密通信对于确保数据安全至关重要。 1. **POP3(Post Office Protocol version 3)**: -...
JavaMail 是一个强大的开源库,用于在Java应用程序中发送和接收电子邮件。这个功能通常涉及到SMTP(简单邮件传输协议)和其他相关的互联网邮件协议。在JavaMail中,`mail.jar` 和 `activation.jar` 是两个关键的库...
JavaMail 是一个强大的开源库,专门用于在Java应用程序中发送和接收电子邮件。它提供了丰富的API,使得开发者可以方便地处理SMTP、POP3和IMAP等邮件协议。在JavaMail中,我们可以实现各种复杂的邮件功能,如添加附件...
JavaMail 是一个强大的开源库,专门用于在Java应用程序中实现电子邮件的发送和接收。它支持多种邮件协议,如SMTP(简单邮件传输协议)用于发送邮件,IMAP(因特网消息访问协议)和POP3(邮局协议)用于接收邮件。在...
JavaMail 是一个强大的开源库,用于在 Java 应用程序中处理电子邮件的发送与接收。在本文中,我们将深入探讨如何使用 JavaMail 收取邮件,包括了解 POP3 和 IMAP 协议以及如何通过 JavaMail API 实现邮件的接收。 ...