- 浏览: 2261862 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (423)
- FileNet相关 (3)
- 应用服务器相关 (22)
- Java综合 (77)
- 持久层 (24)
- struts (11)
- webservice (8)
- 虚拟机 (2)
- 光盘刻录 (0)
- AD及AD集群 (1)
- JS (33)
- F5 (0)
- loadrunner8.1 (0)
- Java 反编译工具 (2)
- DataBase (62)
- ant (1)
- 操作系统 (29)
- 我的任务 (3)
- 平台架构 (16)
- 业务规则引擎 (2)
- 模板 (1)
- EJB (5)
- spring (24)
- CMMI (1)
- 项目管理 (20)
- LDAP (13)
- JMS (10)
- JSP (19)
- JBPM (2)
- web MVC框架设计思想 (2)
- 第三方支付平台 (2)
- BUG管理工具 (1)
- 垃圾站 (2)
- php (1)
- swing (1)
- 书籍 (1)
- QQ qq (2)
- 移动互联网 (26)
- 爱听的歌曲 (0)
- hadoop (4)
- 数据库 (9)
- 设计模式 (1)
- 面试经验只谈 (1)
- 大数据 (9)
- sp (1)
- 缓存数据库 (8)
- storm (2)
- taobao (2)
- 分布式,高并发,大型互联网,负载均衡 (6)
- Apache Ignite (0)
- Docker & K8S (0)
最新评论
-
wangyudong:
新版本 Wisdom RESTClienthttps://gi ...
spring rest mvc使用RestTemplate调用 -
wangyudong:
很多API doc生成工具生成API文档需要引入第三方依赖,重 ...
spring rest mvc使用RestTemplate调用 -
zhaoshijie:
cfying 写道大侠,还是加载了两次,怎么解决啊?求。QQ: ...
spring容器加载完毕做一件事情(利用ContextRefreshedEvent事件) -
xinglianxlxl:
对我有用,非常感谢
spring容器加载完毕做一件事情(利用ContextRefreshedEvent事件) -
k_caesar:
多谢,学习了
利用maven的resources、filter和profile实现不同环境使用不同配置文件
主题:javamail接收(pop3)邮件
说明:附件是完整的例子,包含两个类,其中MailReceiverInfo类是设置登陆邮箱参数,该类将作为参数传递给MailReceiver类,MailReceiver中包含了操作信箱的各种方法,具体的不再说了,先看看下面的例子吧:
JavaMail(4)--使用POP3接收邮件
Posted on 2009-05-31 01:03 金色闪电 阅读(344) 评论(1) 编辑 收藏 所属分类: J2SE
关键技术:
javax.mail.Store:该类实现特定邮件协议(如POP3)上的读、写、监视、查找等操作。通过它的getFolder方法打开一个javax.mail.Folder。
javax.mail.Folder:该类用于描述邮件的分级组织,如收件箱、草稿箱。它的open方法打开分级组织,close方法关闭分级组织,getMessages方法获得分级组织中的邮件,getNewMessageCount方法获得分级组织中新邮件的数量,getUnreadMessageCount方法获得分级组织中未读邮件的数量
根据MimeMessage的getFrom和getRecipients方法获得邮件的发件人和收件人地址列表,得到的是InternetAddress数组,根据InternetAddress的getAddress方法获得邮件地址,根据InternetAddress的getPersonal方法获得邮件地址的个人信息。
MimeMessage的getSubject、getSentDate、getMessageID方法获得邮件的主题、发送日期和邮件的ID(表示邮件)。
通过MimeMessage的getContent方法获得邮件的内容,如果邮件是MIME邮件,那么得到的是一个Multipart的对象,如果是一共普通的文本邮件,那么得到的是BodyPart对象。Multipart可以包含多个BodyPart,而BodyPart本身又可以是Multipart。BodyPart的MimeType类型为“multipart/*”时,表示它是一个Mutipart。
但一个BodyPart的disposition属性等于Part.ATTACHMENT或者Part.INLINE常量时,表示它带有附件。通过BodyPart的getInputStream方法可以获得附件的输入流。
package book.email;
import java.io.File;
import java.util.Properties;
/**
* 收邮件的基本信息
*/
public class MailReceiverInfo {
// 邮件服务器的IP、端口和协议
private String mailServerHost;
private String mailServerPort = "110";
private String protocal = "pop3";
// 登陆邮件服务器的用户名和密码
private String userName;
private String password;
// 保存邮件的路径
private String attachmentDir = "C:/temp/";
private String emailDir = "C:/temp/";
private String emailFileSuffix = ".eml";
// 是否需要身份验证
private boolean validate = true;
/**
* 获得邮件会话属性
*/
public Properties getProperties(){
Properties p = new Properties();
p.put("mail.pop3.host", this.mailServerHost);
p.put("mail.pop3.port", this.mailServerPort);
p.put("mail.pop3.auth", validate ? "true" : "false");
return p;
}
public String getProtocal() {
return protocal;
}
public void setProtocal(String protocal) {
this.protocal = protocal;
}
public String getAttachmentDir() {
return attachmentDir;
}
public void setAttachmentDir(String attachmentDir) {
if (!attachmentDir.endsWith(File.separator)){
attachmentDir = attachmentDir + File.separator;
}
this.attachmentDir = attachmentDir;
}
public String getEmailDir() {
return emailDir;
}
public void setEmailDir(String emailDir) {
if (!emailDir.endsWith(File.separator)){
emailDir = emailDir + File.separator;
}
this.emailDir = emailDir;
}
public String getEmailFileSuffix() {
return emailFileSuffix;
}
public void setEmailFileSuffix(String emailFileSuffix) {
if (!emailFileSuffix.startsWith(".")){
emailFileSuffix = "." + emailFileSuffix;
}
this.emailFileSuffix = emailFileSuffix;
}
public String getMailServerHost() {
return mailServerHost;
}
public void setMailServerHost(String mailServerHost) {
this.mailServerHost = mailServerHost;
}
public String getMailServerPort() {
return mailServerPort;
}
public void setMailServerPort(String mailServerPort) {
this.mailServerPort = mailServerPort;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public boolean isValidate() {
return validate;
}
public void setValidate(boolean validate) {
this.validate = validate;
}
}
package book.email;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.util.Date;
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.NoSuchProviderException;
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;
/**
* 邮件接收器,目前支持pop3协议。
* 能够接收文本、HTML和带有附件的邮件
*/
public class MailReceiver {
// 收邮件的参数配置
private MailReceiverInfo receiverInfo;
// 与邮件服务器连接后得到的邮箱
private Store store;
// 收件箱
private Folder folder;
// 收件箱中的邮件消息
private Message[] messages;
// 当前正在处理的邮件消息
private Message currentMessage;
private String currentEmailFileName;
public MailReceiver(MailReceiverInfo receiverInfo) {
this.receiverInfo = receiverInfo;
}
/**
* 收邮件
*/
public void receiveAllMail() throws Exception{
if (this.receiverInfo == null){
throw new Exception("必须提供接收邮件的参数!");
}
// 连接到服务器
if (this.connectToServer()) {
// 打开收件箱
if (this.openInBoxFolder()) {
// 获取所有邮件
this.getAllMail();
this.closeConnection();
} else {
throw new Exception("打开收件箱失败!");
}
} else {
throw new Exception("连接邮件服务器失败!");
}
}
/**
* 登陆邮件服务器
*/
private boolean connectToServer() {
// 判断是否需要身份认证
MyAuthenticator authenticator = null;
if (this.receiverInfo.isValidate()) {
// 如果需要身份认证,则创建一个密码验证器
authenticator = new MyAuthenticator(this.receiverInfo.getUserName(),
this.receiverInfo.getPassword());
}
//创建session
Session session = Session.getInstance(this.receiverInfo
.getProperties(), authenticator);
//创建store,建立连接
try {
this.store = session.getStore(this.receiverInfo.getProtocal());
} catch (NoSuchProviderException e) {
System.out.println("连接服务器失败!");
return false;
}
System.out.println("connecting");
try {
this.store.connect();
} catch (MessagingException e) {
System.out.println("连接服务器失败!");
return false;
}
System.out.println("连接服务器成功");
return true;
}
/**
* 打开收件箱
*/
private boolean openInBoxFolder() {
try {
this.folder = store.getFolder("INBOX");
// 只读
folder.open(Folder.READ_ONLY);
return true;
} catch (MessagingException e) {
System.err.println("打开收件箱失败!");
}
return false;
}
/**
* 断开与邮件服务器的连接
*/
private boolean closeConnection() {
try {
if (this.folder.isOpen()) {
this.folder.close(true);
}
this.store.close();
System.out.println("成功关闭与邮件服务器的连接!");
return true;
} catch (Exception e) {
System.out.println("关闭和邮件服务器之间连接时出错!");
}
return false;
}
/**
* 获取messages中的所有邮件
* @throws MessagingException
*/
private void getAllMail() throws MessagingException {
//从邮件文件夹获取邮件信息
this.messages = this.folder.getMessages();
System.out.println("总的邮件数目:" + messages.length);
System.out.println("新邮件数目:" + this.getNewMessageCount());
System.out.println("未读邮件数目:" + this.getUnreadMessageCount());
//将要下载的邮件的数量。
int mailArrayLength = this.getMessageCount();
System.out.println("一共有邮件" + mailArrayLength + "封");
int errorCounter = 0; //邮件下载出错计数器
int successCounter = 0;
for (int index = 0; index < mailArrayLength; index++) {
try {
this.currentMessage = (messages[index]); //设置当前message
System.out.println("正在获取第" + index + "封邮件");
this.showMailBasicInfo();
getMail(); //获取当前message
System.out.println("成功获取第" + index + "封邮件");
successCounter++;
} catch (Throwable e) {
errorCounter++;
System.err.println("下载第" + index + "封邮件时出错");
}
}
System.out.println("------------------");
System.out.println("成功下载了" + successCounter + "封邮件");
System.out.println("失败下载了" + errorCounter + "封邮件");
System.out.println("------------------");
}
/**
* 显示邮件的基本信息
*/
private void showMailBasicInfo() throws Exception{
showMailBasicInfo(this.currentMessage);
}
private void showMailBasicInfo(Message message) throws Exception {
System.out.println("-------- 邮件ID:" + this.getMessageId()
+ " ---------");
System.out.println("From:" + this.getFrom());
System.out.println("To:" + this.getTOAddress());
System.out.println("CC:" + this.getCCAddress());
System.out.println("BCC:" + this.getBCCAddress());
System.out.println("Subject:" + this.getSubject());
System.out.println("发送时间::" + this.getSentDate());
System.out.println("是新邮件?" + this.isNew());
System.out.println("要求回执?" + this.getReplySign());
System.out.println("包含附件?" + this.isContainAttach());
System.out.println("------------------------------");
}
/**
* 获得邮件的收件人,抄送,和密送的地址和姓名,根据所传递的参数的不同
* "to"----收件人 "cc"---抄送人地址 "bcc"---密送人地址
*/
private String getTOAddress() throws Exception {
return getMailAddress("TO", this.currentMessage);
}
private String getCCAddress() throws Exception {
return getMailAddress("CC", this.currentMessage);
}
private String getBCCAddress() throws Exception {
return getMailAddress("BCC", this.currentMessage);
}
/**
* 获得邮件地址
* @param type 类型,如收件人、抄送人、密送人
* @param mimeMessage 邮件消息
* @return
* @throws Exception
*/
private String getMailAddress(String type, Message mimeMessage)
throws Exception {
String mailaddr = "";
String addtype = type.toUpperCase();
InternetAddress[] address = null;
if (addtype.equals("TO") || addtype.equals("CC")
|| addtype.equals("BCC")) {
if (addtype.equals("TO")) {
address = (InternetAddress[]) mimeMessage
.getRecipients(Message.RecipientType.TO);
} else if (addtype.equals("CC")) {
address = (InternetAddress[]) mimeMessage
.getRecipients(Message.RecipientType.CC);
} else {
address = (InternetAddress[]) mimeMessage
.getRecipients(Message.RecipientType.BCC);
}
if (address != null) {
for (int i = 0; i < address.length; i++) {
// 先获取邮件地址
String email = address[i].getAddress();
if (email == null){
email = "";
}else {
email = MimeUtility.decodeText(email);
}
// 再取得个人描述信息
String personal = address[i].getPersonal();
if (personal == null){
personal = "";
} else {
personal = MimeUtility.decodeText(personal);
}
// 将个人描述信息与邮件地址连起来
String compositeto = personal + "<" + email + ">";
// 多个地址时,用逗号分开
mailaddr += "," + compositeto;
}
mailaddr = mailaddr.substring(1);
}
} else {
throw new Exception("错误的地址类型!!");
}
return mailaddr;
}
/**
* 获得发件人的地址和姓名
* @throws Exception
*/
private String getFrom() throws Exception {
return getFrom(this.currentMessage);
}
private String getFrom(Message mimeMessage) throws Exception {
InternetAddress[] address = (InternetAddress[]) mimeMessage.getFrom();
// 获得发件人的邮箱
String from = address[0].getAddress();
if (from == null){
from = "";
}
// 获得发件人的描述信息
String personal = address[0].getPersonal();
if (personal == null){
personal = "";
}
// 拼成发件人完整信息
String fromaddr = personal + "<" + from + ">";
return fromaddr;
}
/**
* 获取messages中message的数量
* @return
*/
private int getMessageCount() {
return this.messages.length;
}
/**
* 获得收件箱中新邮件的数量
* @return
* @throws MessagingException
*/
private int getNewMessageCount() throws MessagingException {
return this.folder.getNewMessageCount();
}
/**
* 获得收件箱中未读邮件的数量
* @return
* @throws MessagingException
*/
private int getUnreadMessageCount() throws MessagingException {
return this.folder.getUnreadMessageCount();
}
/**
* 获得邮件主题
*/
private String getSubject() throws MessagingException {
return getSubject(this.currentMessage);
}
private String getSubject(Message mimeMessage) throws MessagingException {
String subject = "";
try {
// 将邮件主题解码
subject = MimeUtility.decodeText(mimeMessage.getSubject());
if (subject == null){
subject = "";
}
} catch (Exception exce) {
}
return subject;
}
/**
* 获得邮件发送日期
*/
private Date getSentDate() throws Exception {
return getSentDate(this.currentMessage);
}
private Date getSentDate(Message mimeMessage) throws Exception {
return mimeMessage.getSentDate();
}
/**
* 判断此邮件是否需要回执,如果需要回执返回"true",否则返回"false"
*/
private boolean getReplySign() throws MessagingException {
return getReplySign(this.currentMessage);
}
private boolean getReplySign(Message mimeMessage) throws MessagingException {
boolean replysign = false;
String needreply[] = mimeMessage
.getHeader("Disposition-Notification-To");
if (needreply != null) {
replysign = true;
}
return replysign;
}
/**
* 获得此邮件的Message-ID
*/
private String getMessageId() throws MessagingException {
return getMessageId(this.currentMessage);
}
private String getMessageId(Message mimeMessage) throws MessagingException {
return ((MimeMessage) mimeMessage).getMessageID();
}
/**
* 判断此邮件是否已读,如果未读返回返回false,反之返回true
*/
private boolean isNew() throws MessagingException {
return isNew(this.currentMessage);
}
private boolean isNew(Message mimeMessage) throws MessagingException {
boolean isnew = false;
Flags flags = mimeMessage.getFlags();
Flags.Flag[] flag = flags.getSystemFlags();
for (int i = 0; i < flag.length; i++) {
if (flag[i] == Flags.Flag.SEEN) {
isnew = true;
break;
}
}
return isnew;
}
/**
* 判断此邮件是否包含附件
*/
private boolean isContainAttach() throws Exception {
return isContainAttach(this.currentMessage);
}
private boolean isContainAttach(Part part) throws Exception {
boolean attachflag = false;
if (part.isMimeType("multipart/*")) {
// 如果邮件体包含多部分
Multipart mp = (Multipart) part.getContent();
// 遍历每部分
for (int i = 0; i < mp.getCount(); i++) {
// 获得每部分的主体
BodyPart bodyPart = mp.getBodyPart(i);
String disposition = bodyPart.getDisposition();
if ((disposition != null)
&& ((disposition.equals(Part.ATTACHMENT)) || (disposition
.equals(Part.INLINE)))){
attachflag = true;
} else if (bodyPart.isMimeType("multipart/*")) {
attachflag = isContainAttach((Part) bodyPart);
} else {
String contype = bodyPart.getContentType();
if (contype.toLowerCase().indexOf("application") != -1){
attachflag = true;
}
if (contype.toLowerCase().indexOf("name") != -1){
attachflag = true;
}
}
}
} else if (part.isMimeType("message/rfc822")) {
attachflag = isContainAttach((Part) part.getContent());
}
return attachflag;
}
/**
* 获得当前邮件
*/
private void getMail() throws Exception {
try {
this.saveMessageAsFile(currentMessage);
this.parseMessage(currentMessage);
} catch (IOException e) {
throw new IOException("保存邮件出错,检查保存路径");
} catch (MessagingException e) {
throw new MessagingException("邮件转换出错");
} catch (Exception e) {
e.printStackTrace();
throw new Exception("未知错误");
}
}
/**
* 保存邮件源文件
*/
private void saveMessageAsFile(Message message) {
try {
// 将邮件的ID中尖括号中的部分做为邮件的文件名
String oriFileName = getInfoBetweenBrackets(this.getMessageId(message)
.toString());
//设置文件后缀名。若是附件则设法取得其文件后缀名作为将要保存文件的后缀名,
//若是正文部分则用.htm做后缀名
String emlName = oriFileName;
String fileNameWidthExtension = this.receiverInfo.getEmailDir()
+ oriFileName + this.receiverInfo.getEmailFileSuffix();
File storeFile = new File(fileNameWidthExtension);
for (int i = 0; storeFile.exists(); i++) {
emlName = oriFileName + i;
fileNameWidthExtension = this.receiverInfo.getEmailDir()
+ emlName + this.receiverInfo.getEmailFileSuffix();
storeFile = new File(fileNameWidthExtension);
}
this.currentEmailFileName = emlName;
System.out.println("邮件消息的存储路径: " + fileNameWidthExtension);
// 将邮件消息的内容写入ByteArrayOutputStream流中
ByteArrayOutputStream baos = new ByteArrayOutputStream();
message.writeTo(baos);
// 读取邮件消息流中的数据
StringReader in = new StringReader(baos.toString());
// 存储到文件
saveFile(fileNameWidthExtension, in);
} catch (MessagingException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/*
* 解析邮件
*/
private void parseMessage(Message message) throws IOException,
MessagingException {
Object content = message.getContent();
// 处理多部分邮件
if (content instanceof Multipart) {
handleMultipart((Multipart) content);
} else {
handlePart(message);
}
}
/*
* 解析Multipart
*/
private void handleMultipart(Multipart multipart) throws MessagingException,
IOException {
for (int i = 0, n = multipart.getCount(); i < n; i++) {
handlePart(multipart.getBodyPart(i));
}
}
/*
* 解析指定part,从中提取文件
*/
private void handlePart(Part part) throws MessagingException, IOException {
String disposition = part.getDisposition();
String contentType = part.getContentType();
String fileNameWidthExtension = "";
// 获得邮件的内容输入流
InputStreamReader sbis = new InputStreamReader(part.getInputStream());
// 没有附件的情况
if (disposition == null) {
if ((contentType.length() >= 10)
&& (contentType.toLowerCase().substring(0, 10)
.equals("text/plain"))) {
fileNameWidthExtension = this.receiverInfo.getAttachmentDir()
+ this.currentEmailFileName + ".txt";
} else if ((contentType.length() >= 9) // Check if html
&& (contentType.toLowerCase().substring(0, 9)
.equals("text/html"))) {
fileNameWidthExtension = this.receiverInfo.getAttachmentDir()
+ this.currentEmailFileName + ".html";
} else if ((contentType.length() >= 9) // Check if html
&& (contentType.toLowerCase().substring(0, 9)
.equals("image/gif"))) {
fileNameWidthExtension = this.receiverInfo.getAttachmentDir()
+ this.currentEmailFileName + ".gif";
} else if ((contentType.length() >= 11)
&& contentType.toLowerCase().substring(0, 11).equals(
"multipart/*")) {
// System.out.println("multipart body: " + contentType);
handleMultipart((Multipart) part.getContent());
} else { // Unknown type
// System.out.println("Other body: " + contentType);
fileNameWidthExtension = this.receiverInfo.getAttachmentDir()
+ this.currentEmailFileName + ".txt";
}
// 存储内容文件
System.out.println("保存邮件内容到:" + fileNameWidthExtension);
saveFile(fileNameWidthExtension, sbis);
return;
}
// 各种有附件的情况
String name = "";
if (disposition.equalsIgnoreCase(Part.ATTACHMENT)) {
name = getFileName(part);
// System.out.println("Attachment: " + name + " : "
// + contentType);
fileNameWidthExtension = this.receiverInfo.getAttachmentDir() + name;
} else if (disposition.equalsIgnoreCase(Part.INLINE)) {
name = getFileName(part);
// System.out.println("Inline: " + name + " : "
// + contentType);
fileNameWidthExtension = this.receiverInfo.getAttachmentDir() + name;
} else {
// System.out.println("Other: " + disposition);
}
// 存储各类附件
if (!fileNameWidthExtension.equals("")) {
System.out.println("保存邮件附件到:" + fileNameWidthExtension);
saveFile(fileNameWidthExtension, sbis);
}
}
private String getFileName(Part part) throws MessagingException,
UnsupportedEncodingException {
String fileName = part.getFileName();
fileName = MimeUtility.decodeText(fileName);
String name = fileName;
if (fileName != null) {
int index = fileName.lastIndexOf("/");
if (index != -1) {
name = fileName.substring(index + 1);
}
}
return name;
}
/**
* 保存文件内容
* @param fileName 文件名
* @param input 输入流
* @throws IOException
*/
private void saveFile(String fileName, Reader input) throws IOException {
// 为了放置文件名重名,在重名的文件名后面天上数字
File file = new File(fileName);
// 先取得文件名的后缀
int lastDot = fileName.lastIndexOf(".");
String extension = fileName.substring(lastDot);
fileName = fileName.substring(0, lastDot);
for (int i = 0; file.exists(); i++) {
// 如果文件重名,则添加i
file = new File(fileName + i + extension);
}
// 从输入流中读取数据,写入文件输出流
FileWriter fos = new FileWriter(file);
BufferedWriter bos = new BufferedWriter(fos);
BufferedReader bis = new BufferedReader(input);
int aByte;
while ((aByte = bis.read()) != -1) {
bos.write(aByte);
}
// 关闭流
bos.flush();
bos.close();
bis.close();
}
/**
* 获得尖括号之间的字符
* @param str
* @return
* @throws Exception
*/
private String getInfoBetweenBrackets(String str) throws Exception {
int i, j; //用于标识字符串中的"<"和">"的位置
if (str == null) {
str = "error";
return str;
}
i = str.lastIndexOf("<");
j = str.lastIndexOf(">");
if (i != -1 && j != -1){
str = str.substring(i + 1, j);
}
return str;
}
public static void main(String[] args) throws Exception {
MailReceiverInfo receiverInfo = new MailReceiverInfo();
receiverInfo.setMailServerHost("pop.163.com");
receiverInfo.setMailServerPort("110");
receiverInfo.setValidate(true);
receiverInfo.setUserName("***");
receiverInfo.setPassword("***");
receiverInfo.setAttachmentDir("C:/temp/mail/");
receiverInfo.setEmailDir("C:/temp/mail/");
MailReceiver receiver = new MailReceiver(receiverInfo);
receiver.receiveAllMail();
}
}
说明:附件是完整的例子,包含两个类,其中MailReceiverInfo类是设置登陆邮箱参数,该类将作为参数传递给MailReceiver类,MailReceiver中包含了操作信箱的各种方法,具体的不再说了,先看看下面的例子吧:
JavaMail(4)--使用POP3接收邮件
Posted on 2009-05-31 01:03 金色闪电 阅读(344) 评论(1) 编辑 收藏 所属分类: J2SE
关键技术:
javax.mail.Store:该类实现特定邮件协议(如POP3)上的读、写、监视、查找等操作。通过它的getFolder方法打开一个javax.mail.Folder。
javax.mail.Folder:该类用于描述邮件的分级组织,如收件箱、草稿箱。它的open方法打开分级组织,close方法关闭分级组织,getMessages方法获得分级组织中的邮件,getNewMessageCount方法获得分级组织中新邮件的数量,getUnreadMessageCount方法获得分级组织中未读邮件的数量
根据MimeMessage的getFrom和getRecipients方法获得邮件的发件人和收件人地址列表,得到的是InternetAddress数组,根据InternetAddress的getAddress方法获得邮件地址,根据InternetAddress的getPersonal方法获得邮件地址的个人信息。
MimeMessage的getSubject、getSentDate、getMessageID方法获得邮件的主题、发送日期和邮件的ID(表示邮件)。
通过MimeMessage的getContent方法获得邮件的内容,如果邮件是MIME邮件,那么得到的是一个Multipart的对象,如果是一共普通的文本邮件,那么得到的是BodyPart对象。Multipart可以包含多个BodyPart,而BodyPart本身又可以是Multipart。BodyPart的MimeType类型为“multipart/*”时,表示它是一个Mutipart。
但一个BodyPart的disposition属性等于Part.ATTACHMENT或者Part.INLINE常量时,表示它带有附件。通过BodyPart的getInputStream方法可以获得附件的输入流。
package book.email;
import java.io.File;
import java.util.Properties;
/**
* 收邮件的基本信息
*/
public class MailReceiverInfo {
// 邮件服务器的IP、端口和协议
private String mailServerHost;
private String mailServerPort = "110";
private String protocal = "pop3";
// 登陆邮件服务器的用户名和密码
private String userName;
private String password;
// 保存邮件的路径
private String attachmentDir = "C:/temp/";
private String emailDir = "C:/temp/";
private String emailFileSuffix = ".eml";
// 是否需要身份验证
private boolean validate = true;
/**
* 获得邮件会话属性
*/
public Properties getProperties(){
Properties p = new Properties();
p.put("mail.pop3.host", this.mailServerHost);
p.put("mail.pop3.port", this.mailServerPort);
p.put("mail.pop3.auth", validate ? "true" : "false");
return p;
}
public String getProtocal() {
return protocal;
}
public void setProtocal(String protocal) {
this.protocal = protocal;
}
public String getAttachmentDir() {
return attachmentDir;
}
public void setAttachmentDir(String attachmentDir) {
if (!attachmentDir.endsWith(File.separator)){
attachmentDir = attachmentDir + File.separator;
}
this.attachmentDir = attachmentDir;
}
public String getEmailDir() {
return emailDir;
}
public void setEmailDir(String emailDir) {
if (!emailDir.endsWith(File.separator)){
emailDir = emailDir + File.separator;
}
this.emailDir = emailDir;
}
public String getEmailFileSuffix() {
return emailFileSuffix;
}
public void setEmailFileSuffix(String emailFileSuffix) {
if (!emailFileSuffix.startsWith(".")){
emailFileSuffix = "." + emailFileSuffix;
}
this.emailFileSuffix = emailFileSuffix;
}
public String getMailServerHost() {
return mailServerHost;
}
public void setMailServerHost(String mailServerHost) {
this.mailServerHost = mailServerHost;
}
public String getMailServerPort() {
return mailServerPort;
}
public void setMailServerPort(String mailServerPort) {
this.mailServerPort = mailServerPort;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public boolean isValidate() {
return validate;
}
public void setValidate(boolean validate) {
this.validate = validate;
}
}
package book.email;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.util.Date;
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.NoSuchProviderException;
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;
/**
* 邮件接收器,目前支持pop3协议。
* 能够接收文本、HTML和带有附件的邮件
*/
public class MailReceiver {
// 收邮件的参数配置
private MailReceiverInfo receiverInfo;
// 与邮件服务器连接后得到的邮箱
private Store store;
// 收件箱
private Folder folder;
// 收件箱中的邮件消息
private Message[] messages;
// 当前正在处理的邮件消息
private Message currentMessage;
private String currentEmailFileName;
public MailReceiver(MailReceiverInfo receiverInfo) {
this.receiverInfo = receiverInfo;
}
/**
* 收邮件
*/
public void receiveAllMail() throws Exception{
if (this.receiverInfo == null){
throw new Exception("必须提供接收邮件的参数!");
}
// 连接到服务器
if (this.connectToServer()) {
// 打开收件箱
if (this.openInBoxFolder()) {
// 获取所有邮件
this.getAllMail();
this.closeConnection();
} else {
throw new Exception("打开收件箱失败!");
}
} else {
throw new Exception("连接邮件服务器失败!");
}
}
/**
* 登陆邮件服务器
*/
private boolean connectToServer() {
// 判断是否需要身份认证
MyAuthenticator authenticator = null;
if (this.receiverInfo.isValidate()) {
// 如果需要身份认证,则创建一个密码验证器
authenticator = new MyAuthenticator(this.receiverInfo.getUserName(),
this.receiverInfo.getPassword());
}
//创建session
Session session = Session.getInstance(this.receiverInfo
.getProperties(), authenticator);
//创建store,建立连接
try {
this.store = session.getStore(this.receiverInfo.getProtocal());
} catch (NoSuchProviderException e) {
System.out.println("连接服务器失败!");
return false;
}
System.out.println("connecting");
try {
this.store.connect();
} catch (MessagingException e) {
System.out.println("连接服务器失败!");
return false;
}
System.out.println("连接服务器成功");
return true;
}
/**
* 打开收件箱
*/
private boolean openInBoxFolder() {
try {
this.folder = store.getFolder("INBOX");
// 只读
folder.open(Folder.READ_ONLY);
return true;
} catch (MessagingException e) {
System.err.println("打开收件箱失败!");
}
return false;
}
/**
* 断开与邮件服务器的连接
*/
private boolean closeConnection() {
try {
if (this.folder.isOpen()) {
this.folder.close(true);
}
this.store.close();
System.out.println("成功关闭与邮件服务器的连接!");
return true;
} catch (Exception e) {
System.out.println("关闭和邮件服务器之间连接时出错!");
}
return false;
}
/**
* 获取messages中的所有邮件
* @throws MessagingException
*/
private void getAllMail() throws MessagingException {
//从邮件文件夹获取邮件信息
this.messages = this.folder.getMessages();
System.out.println("总的邮件数目:" + messages.length);
System.out.println("新邮件数目:" + this.getNewMessageCount());
System.out.println("未读邮件数目:" + this.getUnreadMessageCount());
//将要下载的邮件的数量。
int mailArrayLength = this.getMessageCount();
System.out.println("一共有邮件" + mailArrayLength + "封");
int errorCounter = 0; //邮件下载出错计数器
int successCounter = 0;
for (int index = 0; index < mailArrayLength; index++) {
try {
this.currentMessage = (messages[index]); //设置当前message
System.out.println("正在获取第" + index + "封邮件");
this.showMailBasicInfo();
getMail(); //获取当前message
System.out.println("成功获取第" + index + "封邮件");
successCounter++;
} catch (Throwable e) {
errorCounter++;
System.err.println("下载第" + index + "封邮件时出错");
}
}
System.out.println("------------------");
System.out.println("成功下载了" + successCounter + "封邮件");
System.out.println("失败下载了" + errorCounter + "封邮件");
System.out.println("------------------");
}
/**
* 显示邮件的基本信息
*/
private void showMailBasicInfo() throws Exception{
showMailBasicInfo(this.currentMessage);
}
private void showMailBasicInfo(Message message) throws Exception {
System.out.println("-------- 邮件ID:" + this.getMessageId()
+ " ---------");
System.out.println("From:" + this.getFrom());
System.out.println("To:" + this.getTOAddress());
System.out.println("CC:" + this.getCCAddress());
System.out.println("BCC:" + this.getBCCAddress());
System.out.println("Subject:" + this.getSubject());
System.out.println("发送时间::" + this.getSentDate());
System.out.println("是新邮件?" + this.isNew());
System.out.println("要求回执?" + this.getReplySign());
System.out.println("包含附件?" + this.isContainAttach());
System.out.println("------------------------------");
}
/**
* 获得邮件的收件人,抄送,和密送的地址和姓名,根据所传递的参数的不同
* "to"----收件人 "cc"---抄送人地址 "bcc"---密送人地址
*/
private String getTOAddress() throws Exception {
return getMailAddress("TO", this.currentMessage);
}
private String getCCAddress() throws Exception {
return getMailAddress("CC", this.currentMessage);
}
private String getBCCAddress() throws Exception {
return getMailAddress("BCC", this.currentMessage);
}
/**
* 获得邮件地址
* @param type 类型,如收件人、抄送人、密送人
* @param mimeMessage 邮件消息
* @return
* @throws Exception
*/
private String getMailAddress(String type, Message mimeMessage)
throws Exception {
String mailaddr = "";
String addtype = type.toUpperCase();
InternetAddress[] address = null;
if (addtype.equals("TO") || addtype.equals("CC")
|| addtype.equals("BCC")) {
if (addtype.equals("TO")) {
address = (InternetAddress[]) mimeMessage
.getRecipients(Message.RecipientType.TO);
} else if (addtype.equals("CC")) {
address = (InternetAddress[]) mimeMessage
.getRecipients(Message.RecipientType.CC);
} else {
address = (InternetAddress[]) mimeMessage
.getRecipients(Message.RecipientType.BCC);
}
if (address != null) {
for (int i = 0; i < address.length; i++) {
// 先获取邮件地址
String email = address[i].getAddress();
if (email == null){
email = "";
}else {
email = MimeUtility.decodeText(email);
}
// 再取得个人描述信息
String personal = address[i].getPersonal();
if (personal == null){
personal = "";
} else {
personal = MimeUtility.decodeText(personal);
}
// 将个人描述信息与邮件地址连起来
String compositeto = personal + "<" + email + ">";
// 多个地址时,用逗号分开
mailaddr += "," + compositeto;
}
mailaddr = mailaddr.substring(1);
}
} else {
throw new Exception("错误的地址类型!!");
}
return mailaddr;
}
/**
* 获得发件人的地址和姓名
* @throws Exception
*/
private String getFrom() throws Exception {
return getFrom(this.currentMessage);
}
private String getFrom(Message mimeMessage) throws Exception {
InternetAddress[] address = (InternetAddress[]) mimeMessage.getFrom();
// 获得发件人的邮箱
String from = address[0].getAddress();
if (from == null){
from = "";
}
// 获得发件人的描述信息
String personal = address[0].getPersonal();
if (personal == null){
personal = "";
}
// 拼成发件人完整信息
String fromaddr = personal + "<" + from + ">";
return fromaddr;
}
/**
* 获取messages中message的数量
* @return
*/
private int getMessageCount() {
return this.messages.length;
}
/**
* 获得收件箱中新邮件的数量
* @return
* @throws MessagingException
*/
private int getNewMessageCount() throws MessagingException {
return this.folder.getNewMessageCount();
}
/**
* 获得收件箱中未读邮件的数量
* @return
* @throws MessagingException
*/
private int getUnreadMessageCount() throws MessagingException {
return this.folder.getUnreadMessageCount();
}
/**
* 获得邮件主题
*/
private String getSubject() throws MessagingException {
return getSubject(this.currentMessage);
}
private String getSubject(Message mimeMessage) throws MessagingException {
String subject = "";
try {
// 将邮件主题解码
subject = MimeUtility.decodeText(mimeMessage.getSubject());
if (subject == null){
subject = "";
}
} catch (Exception exce) {
}
return subject;
}
/**
* 获得邮件发送日期
*/
private Date getSentDate() throws Exception {
return getSentDate(this.currentMessage);
}
private Date getSentDate(Message mimeMessage) throws Exception {
return mimeMessage.getSentDate();
}
/**
* 判断此邮件是否需要回执,如果需要回执返回"true",否则返回"false"
*/
private boolean getReplySign() throws MessagingException {
return getReplySign(this.currentMessage);
}
private boolean getReplySign(Message mimeMessage) throws MessagingException {
boolean replysign = false;
String needreply[] = mimeMessage
.getHeader("Disposition-Notification-To");
if (needreply != null) {
replysign = true;
}
return replysign;
}
/**
* 获得此邮件的Message-ID
*/
private String getMessageId() throws MessagingException {
return getMessageId(this.currentMessage);
}
private String getMessageId(Message mimeMessage) throws MessagingException {
return ((MimeMessage) mimeMessage).getMessageID();
}
/**
* 判断此邮件是否已读,如果未读返回返回false,反之返回true
*/
private boolean isNew() throws MessagingException {
return isNew(this.currentMessage);
}
private boolean isNew(Message mimeMessage) throws MessagingException {
boolean isnew = false;
Flags flags = mimeMessage.getFlags();
Flags.Flag[] flag = flags.getSystemFlags();
for (int i = 0; i < flag.length; i++) {
if (flag[i] == Flags.Flag.SEEN) {
isnew = true;
break;
}
}
return isnew;
}
/**
* 判断此邮件是否包含附件
*/
private boolean isContainAttach() throws Exception {
return isContainAttach(this.currentMessage);
}
private boolean isContainAttach(Part part) throws Exception {
boolean attachflag = false;
if (part.isMimeType("multipart/*")) {
// 如果邮件体包含多部分
Multipart mp = (Multipart) part.getContent();
// 遍历每部分
for (int i = 0; i < mp.getCount(); i++) {
// 获得每部分的主体
BodyPart bodyPart = mp.getBodyPart(i);
String disposition = bodyPart.getDisposition();
if ((disposition != null)
&& ((disposition.equals(Part.ATTACHMENT)) || (disposition
.equals(Part.INLINE)))){
attachflag = true;
} else if (bodyPart.isMimeType("multipart/*")) {
attachflag = isContainAttach((Part) bodyPart);
} else {
String contype = bodyPart.getContentType();
if (contype.toLowerCase().indexOf("application") != -1){
attachflag = true;
}
if (contype.toLowerCase().indexOf("name") != -1){
attachflag = true;
}
}
}
} else if (part.isMimeType("message/rfc822")) {
attachflag = isContainAttach((Part) part.getContent());
}
return attachflag;
}
/**
* 获得当前邮件
*/
private void getMail() throws Exception {
try {
this.saveMessageAsFile(currentMessage);
this.parseMessage(currentMessage);
} catch (IOException e) {
throw new IOException("保存邮件出错,检查保存路径");
} catch (MessagingException e) {
throw new MessagingException("邮件转换出错");
} catch (Exception e) {
e.printStackTrace();
throw new Exception("未知错误");
}
}
/**
* 保存邮件源文件
*/
private void saveMessageAsFile(Message message) {
try {
// 将邮件的ID中尖括号中的部分做为邮件的文件名
String oriFileName = getInfoBetweenBrackets(this.getMessageId(message)
.toString());
//设置文件后缀名。若是附件则设法取得其文件后缀名作为将要保存文件的后缀名,
//若是正文部分则用.htm做后缀名
String emlName = oriFileName;
String fileNameWidthExtension = this.receiverInfo.getEmailDir()
+ oriFileName + this.receiverInfo.getEmailFileSuffix();
File storeFile = new File(fileNameWidthExtension);
for (int i = 0; storeFile.exists(); i++) {
emlName = oriFileName + i;
fileNameWidthExtension = this.receiverInfo.getEmailDir()
+ emlName + this.receiverInfo.getEmailFileSuffix();
storeFile = new File(fileNameWidthExtension);
}
this.currentEmailFileName = emlName;
System.out.println("邮件消息的存储路径: " + fileNameWidthExtension);
// 将邮件消息的内容写入ByteArrayOutputStream流中
ByteArrayOutputStream baos = new ByteArrayOutputStream();
message.writeTo(baos);
// 读取邮件消息流中的数据
StringReader in = new StringReader(baos.toString());
// 存储到文件
saveFile(fileNameWidthExtension, in);
} catch (MessagingException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/*
* 解析邮件
*/
private void parseMessage(Message message) throws IOException,
MessagingException {
Object content = message.getContent();
// 处理多部分邮件
if (content instanceof Multipart) {
handleMultipart((Multipart) content);
} else {
handlePart(message);
}
}
/*
* 解析Multipart
*/
private void handleMultipart(Multipart multipart) throws MessagingException,
IOException {
for (int i = 0, n = multipart.getCount(); i < n; i++) {
handlePart(multipart.getBodyPart(i));
}
}
/*
* 解析指定part,从中提取文件
*/
private void handlePart(Part part) throws MessagingException, IOException {
String disposition = part.getDisposition();
String contentType = part.getContentType();
String fileNameWidthExtension = "";
// 获得邮件的内容输入流
InputStreamReader sbis = new InputStreamReader(part.getInputStream());
// 没有附件的情况
if (disposition == null) {
if ((contentType.length() >= 10)
&& (contentType.toLowerCase().substring(0, 10)
.equals("text/plain"))) {
fileNameWidthExtension = this.receiverInfo.getAttachmentDir()
+ this.currentEmailFileName + ".txt";
} else if ((contentType.length() >= 9) // Check if html
&& (contentType.toLowerCase().substring(0, 9)
.equals("text/html"))) {
fileNameWidthExtension = this.receiverInfo.getAttachmentDir()
+ this.currentEmailFileName + ".html";
} else if ((contentType.length() >= 9) // Check if html
&& (contentType.toLowerCase().substring(0, 9)
.equals("image/gif"))) {
fileNameWidthExtension = this.receiverInfo.getAttachmentDir()
+ this.currentEmailFileName + ".gif";
} else if ((contentType.length() >= 11)
&& contentType.toLowerCase().substring(0, 11).equals(
"multipart/*")) {
// System.out.println("multipart body: " + contentType);
handleMultipart((Multipart) part.getContent());
} else { // Unknown type
// System.out.println("Other body: " + contentType);
fileNameWidthExtension = this.receiverInfo.getAttachmentDir()
+ this.currentEmailFileName + ".txt";
}
// 存储内容文件
System.out.println("保存邮件内容到:" + fileNameWidthExtension);
saveFile(fileNameWidthExtension, sbis);
return;
}
// 各种有附件的情况
String name = "";
if (disposition.equalsIgnoreCase(Part.ATTACHMENT)) {
name = getFileName(part);
// System.out.println("Attachment: " + name + " : "
// + contentType);
fileNameWidthExtension = this.receiverInfo.getAttachmentDir() + name;
} else if (disposition.equalsIgnoreCase(Part.INLINE)) {
name = getFileName(part);
// System.out.println("Inline: " + name + " : "
// + contentType);
fileNameWidthExtension = this.receiverInfo.getAttachmentDir() + name;
} else {
// System.out.println("Other: " + disposition);
}
// 存储各类附件
if (!fileNameWidthExtension.equals("")) {
System.out.println("保存邮件附件到:" + fileNameWidthExtension);
saveFile(fileNameWidthExtension, sbis);
}
}
private String getFileName(Part part) throws MessagingException,
UnsupportedEncodingException {
String fileName = part.getFileName();
fileName = MimeUtility.decodeText(fileName);
String name = fileName;
if (fileName != null) {
int index = fileName.lastIndexOf("/");
if (index != -1) {
name = fileName.substring(index + 1);
}
}
return name;
}
/**
* 保存文件内容
* @param fileName 文件名
* @param input 输入流
* @throws IOException
*/
private void saveFile(String fileName, Reader input) throws IOException {
// 为了放置文件名重名,在重名的文件名后面天上数字
File file = new File(fileName);
// 先取得文件名的后缀
int lastDot = fileName.lastIndexOf(".");
String extension = fileName.substring(lastDot);
fileName = fileName.substring(0, lastDot);
for (int i = 0; file.exists(); i++) {
// 如果文件重名,则添加i
file = new File(fileName + i + extension);
}
// 从输入流中读取数据,写入文件输出流
FileWriter fos = new FileWriter(file);
BufferedWriter bos = new BufferedWriter(fos);
BufferedReader bis = new BufferedReader(input);
int aByte;
while ((aByte = bis.read()) != -1) {
bos.write(aByte);
}
// 关闭流
bos.flush();
bos.close();
bis.close();
}
/**
* 获得尖括号之间的字符
* @param str
* @return
* @throws Exception
*/
private String getInfoBetweenBrackets(String str) throws Exception {
int i, j; //用于标识字符串中的"<"和">"的位置
if (str == null) {
str = "error";
return str;
}
i = str.lastIndexOf("<");
j = str.lastIndexOf(">");
if (i != -1 && j != -1){
str = str.substring(i + 1, j);
}
return str;
}
public static void main(String[] args) throws Exception {
MailReceiverInfo receiverInfo = new MailReceiverInfo();
receiverInfo.setMailServerHost("pop.163.com");
receiverInfo.setMailServerPort("110");
receiverInfo.setValidate(true);
receiverInfo.setUserName("***");
receiverInfo.setPassword("***");
receiverInfo.setAttachmentDir("C:/temp/mail/");
receiverInfo.setEmailDir("C:/temp/mail/");
MailReceiver receiver = new MailReceiver(receiverInfo);
receiver.receiveAllMail();
}
}
- readEmail.rar (6.3 KB)
- 下载次数: 221
- readEmail2.rar (6.8 KB)
- 下载次数: 141
- readEmail3.rar (7.4 KB)
- 下载次数: 198
评论
4 楼
首席阿若
2015-04-22
不行的东西
3 楼
首席阿若
2015-04-22
附件是中文全是乱码,
2 楼
happingchann
2012-03-19
公开下密码,这发例子的是个闷骚男,把我破解出来的密码发给大家..
password:aa ,解压输入"aa"就OK了 你说你加密还加个这么简单的密码F_UCK
password:aa ,解压输入"aa"就OK了 你说你加密还加个这么简单的密码F_UCK
1 楼
anminer
2011-11-15
附件加什么密啊
发表评论
-
各大巨头电商提供的IP库API接口-新浪、搜狐、阿里...
2015-04-22 13:18 15910关键字:各大巨头电商提供的IP库API接口-新浪、搜狐、阿里. ... -
用Java来获取访问者真实的IP地址-超准确
2015-04-22 12:55 6258关键字:用Java来获取访问者真实的IP地址-超准确 下面分享 ... -
Shiro集成OAuth2
2015-04-21 10:31 12445关键字:Shiro集成OAuth2 参考:http://jin ... -
淘宝网架构分享总结 - 架构,分布式,淘宝,虚拟化,水平伸缩
2015-04-19 00:25 7635推荐综合架构交流群:JAVA开发高级群 点击入群!!! 关键 ... -
Zookeeper 和 SASL
2015-04-16 09:29 13636关键字:Zookeeper 和 SASL 介绍 这是一个描述Z ... -
非对称加密(RSA)加密解密实现通信JAVA端工具类(教程)
2015-04-15 17:27 1184关键字:非对称加密(RSA)加密解密实现通信JAVA端工具类( ... -
对称加密(AES)加密实现工具类(教程)
2015-04-15 17:11 2146关键字:对称加密(AES)加密实现工具类(教程) Java加 ... -
Curator-Framework开源Zookeeper快速开发框架介绍
2015-04-14 18:41 703关键字:Curator-Framework开源Zookeepe ... -
IM消息推送之Openfire
2015-04-13 13:40 2213关键字:IM消息推送之Openfire Openfire 采用 ... -
Nio框架之Mina的demo
2015-04-12 13:38 644关键字:Nio框架之Mina的demo 官网:http://m ... -
AMQP中文版协议规范
2015-01-23 17:12 2989关键字:AMQP中文版协议规范 AMQP中文版协议规范:ht ... -
数据库连接池选型
2014-12-04 18:32 1171关键字:数据库连接池选型 proxool(与spring不太 ... -
spring中的数据源配置信息加密方案
2014-10-22 10:36 1076关键字:spring中的数据源配置信息加密方案 附件是完整的 ... -
OAuth2.0的Java实现 Apache Amber
2014-10-09 23:20 795关键字:OAuth2.0的Java实现 Apache Ambe ... -
企业信息管理系统基础框架jeesite
2014-05-06 22:21 2586jeesite项目地址(使用说明,):http://jeesi ... -
java中文分词组件-word分词
2014-05-06 21:33 21987关键字:java中文分词组 ... -
java制作可执行文件EXE文件
2014-05-05 18:58 1603关键字:java制作可执行文件EXE文件 参考:http: ... -
Quartz任务调度器详解
2014-04-25 22:46 19001关键字: 参考文章:ht ... -
各种hash算法-hashcodeUtil
2014-04-24 15:36 4245关键字:各种hash算法-hashcodeUtil -
性能监控工具类(StopWatchUtil)
2014-03-21 15:12 5747关键字:性能监控工具类(StopWatchUtil) 附 ...
相关推荐
电子邮件接收POP3是一种常见的电子邮件协议,用于从邮件服务器下载邮件到本地客户端。在这个主题中,我们将深入探讨POP3协议的工作原理、Java编程语言如何实现POP3邮件接收,以及与之相关的可视化界面设计。 POP3...
2. IMAP 和 POP3 协议:对于邮件接收,JavaMail 提供了 `Folder` 和 `Message` 类来处理IMAP或POP3服务器上的邮箱。IMAP 允许用户在线查看邮件,而POP3通常将邮件下载到本地存储。使用 `Store` 类连接到服务器,然后...
JavaMail是一种广泛使用的Java库,用于处理电子邮件的发送和接收。在Java应用程序中实现邮件接收功能,JavaMail是必不可少的工具。本教程将详细介绍如何利用JavaMail API来接收邮件。 首先,我们需要理解JavaMail的...
这个库支持多种邮件协议,如 SMTP(简单邮件传输协议)用于发送邮件,POP3(邮局协议)和 IMAP(因特网消息访问协议)用于接收邮件。在这个资源中,我们将探讨如何使用 JavaMail 实现邮件的发送、接收、查看邮件数量...
JavaMail 是一个开源库,用于在Java应用程序中发送和接收电子邮件。这个库提供了一套API,使得开发者能够方便地处理SMTP、POP3和IMAP等邮件协议。在给定的标题和描述中,我们讨论的是如何使用JavaMail API来接收邮件...
使用Socket编程实现SMTP和POP3邮件功能涉及以下几个步骤: 1. **建立Socket连接**:首先,客户端需要创建一个Socket对象,连接到SMTP或POP3服务器。这通常通过指定服务器地址(IP或域名)和端口号(SMTP通常使用25...
JavaMail API是Java平台中的一个标准扩展库,用于发送、接收以及管理电子邮件。它提供了丰富的接口来实现邮件的各种操作,如构建复杂的MIME消息、处理附件等。 #### 二、使用JavaMail收发Gmail邮件 在使用JavaMail...
JavaMail 是一个强大的Java库,它允许开发人员在Java应用程序中实现邮件的发送、接收以及管理功能。这个项目不仅提供了SMTP、POP3和IMAP协议的支持,还包含了丰富的API,可以方便地处理邮件的MIME编码、附件、HTML...
在Java中,我们可以使用JavaMail API来实现POP3邮件接收。首先,需要引入javax.mail和javax.mail.internet库。以下是一个基本的邮件接收示例: ```java import javax.mail.*; import javax.mail.internet.*; ...
以上就是关于"JAVA100例之实例48 使用JavaMail接收邮件"的主要内容,通过学习和实践这个实例,开发者将能够熟练地使用JavaMail API来实现邮件的接收功能,这对于构建自动化邮件系统或者处理邮件相关的业务需求非常有...
JavaMail 是一个 Java API,用于在 Java 应用程序中发送和接收电子邮件。它提供了一个抽象层,允许开发者使用不同的电子邮件协议,例如 SMTP、POP3 和 IMAP。 在本文中,我们将讨论如何使用 JavaMail 库来代发邮件...
JavaMail是Java编程环境中用于处理电子邮件的一套API,它提供了丰富的功能,允许开发者发送、接收、存储和管理邮件。在JavaMail API详解的资源中,我们可以深入理解这一强大的工具。 首先,JavaMail API简介部分会...
(1) 收取并显示POP3邮件服务器上指定邮箱的邮件; (2) 使用SMTP邮件服务器发送邮件; (3) 邮件附件的发送与接受; (4) 删除邮件; 具体操作步骤如下: 1、打开javamailsystem文件夹,找到javamail.jar可执行文件,...
在IT领域,JavaMail API是Java开发者用于处理电子邮件发送与接收的强大工具。通过解析给定文件的标题、描述、标签及部分内容,我们可以深入探讨javamail发送与接收邮件的详细教程,以及如何利用JavaMail API实现邮件...
2. **接收邮件**:支持POP3和IMAP协议,能够接收来自不同邮件服务器的邮件,并对这些邮件进行操作,如读取、删除等。 3. **邮件处理**:包括解析邮件内容、管理附件等功能。 #### 三、JavaMail的核心类与接口 1. *...
JavaMail 是一个强大的开源库,用于在Java应用程序中发送和接收电子邮件。它支持多种协议,如POP3(Post Office Protocol version 3)和IMAP(Internet Message Access Protocol),这两种协议常用于从邮件服务器...
JavaMail是一个开源API,用于处理SMTP、IMAP和POP3等邮件协议,使得开发者能够方便地在Java应用程序中实现邮件收发功能。 2.2 Swing和Eclipse Swing是Java的GUI库,用于构建用户界面,而Eclipse是一款广泛使用的...
在本文中,我们将深入探讨如何使用 JavaMail 收取邮件,包括了解 POP3 和 IMAP 协议以及如何通过 JavaMail API 实现邮件的接收。 首先,我们需要知道发送邮件通常使用 SMTP(简单邮件传输协议),而接收邮件则涉及...