javamail+imap

本文介绍了一个使用Java实现的通过IMAP协议读取Gmail邮件的方法。不仅能够获取邮件的基本信息,还能判断邮件是否已读,并且支持保存附件等功能。相较于POP3协议,IMAP提供了更丰富的邮件管理功能。

网上很多用pop3收邮件的例子,但是用pop3收邮件只能获取收件箱里面所有邮件,邮件是否已读等标记无法获取,使用imap协议则避免了这个尴尬,imap不仅能获得一个邮件的详细信息(比如是否已读,是否回复),它还允许用户更改邮件的标记,但是目前支持imap协议的邮件服务器并不多,我知道的只有21cn和gmail,下面的例子中使用了代理 、SSL认证多个内容,请大家参考。 代码如下:

package com.yourcompany.mail;

import java.io.*;

import java.security.Security;
import java.text.*;

import java.util.*;

import javax.mail.*;

import javax.mail.internet.*;

public class gmailRead ...{

private MimeMessage mimeMessage = null;

private String saveAttachPath = ""; // 附件下载后的存放目录

private StringBuffer bodytext = new StringBuffer();// 存放邮件内容的StringBuffer对象

private String dateformat = "yy-MM-dd HH:mm"; // 默认的日前显示格式

/** *//**
* * 構造函数,初始化一个MimeMessage對象
*
*/

public gmailRead() ...{

}

public gmailRead(MimeMessage mimeMessage) ...{

this.mimeMessage = mimeMessage;

System.out.println("create a PraseMimeMessage object........");

}

/** *//**
* * 獲取一个MimeMessage對象
*
*/

public void setMimeMessage(MimeMessage mimeMessage) ...{

this.mimeMessage = mimeMessage;

}

/** *//**
* * 獲得發件人的地址和姓名
*
*/

public String getFrom() 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;

}

/** *//**
*
* 獲得郵件的收件人,抄送,和密送的地址和姓名,根據所传递的参数的不同如
*
* to 獲得邮件的收件人 cc 獲得邮件的抄送人地址 bcc 獲得邮件的密送人地址
*
*/

public String getMailAddress(String type) 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("Error emailaddr type!");

}

return mailaddr;

}

/** *//**
* * 獲得郵件主题
*
*/

public String getSubject() throws MessagingException ...{

String subject = "";

try ...{

subject = MimeUtility.decodeText(mimeMessage.getSubject());

if (subject == null)

subject = "";

} catch (Exception exce) ...{

}

return subject;

}

/** *//**
* * 獲得郵件的發送日期
*
*/

public String getSentDate() throws Exception ...{

Date sentdate = mimeMessage.getSentDate();

SimpleDateFormat format = new SimpleDateFormat(dateformat);

return format.format(sentdate);

}

/** *//**
* * 獲得郵件的正文内容
*
*/

public String getBodyText() ...{

return bodytext.toString();

}

/** *//**
*
* 解析郵件,把得到的郵件内容保存到一个StringBuffer对象中,解析邮件 *
*
* 主要是根据MimeType类型的不同执行不同的操作,一步一步的解析
*
*/

public void getMailContent(Part part) throws Exception ...{

String contenttype = part.getContentType();

int nameindex = contenttype.indexOf("name");

boolean conname = false;

if (nameindex != -1)

conname = true;

System.out.println("CONTENTTYPE: " + contenttype);

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));

}

} else if (part.isMimeType("message/rfc822")) ...{

getMailContent((Part) part.getContent());

} else ...{

}

}

/** *//**
* * 判断此邮件是否需要回执,如果需要回执返回"true",否则返回"false"
*
*/

public boolean getReplySign() throws MessagingException ...{

boolean replysign = false;

String needreply[] = mimeMessage

.getHeader("Disposition-Notification-To");

if (needreply != null) ...{

replysign = true;

}

return replysign;

}

/** *//**
*
* *獲得此郵件的Message-ID
*
*/

public String getMessageId() throws MessagingException ...{

return mimeMessage.getMessageID();

}

/** *//**
*
* 判断此郵件是否已读,如果未读返回false,反之返回true
*
*/

public boolean isNew() throws MessagingException ...{

boolean isnew = false;

Flags flags = ((Message) mimeMessage).getFlags();

// add by wangdong

if (true == flags.contains(Flags.Flag.SEEN)) ...{
System.out.println("邮件已读");
}
else
...{
System.out.println("邮件未读");
}

Flags.Flag[] flag = flags.getSystemFlags();

System.out.println("flags's length: " + flag.length);

for (int i = 0; i < flag.length; i++) ...{

if (flag[i] == Flags.Flag.SEEN) ...{

isnew = true;

System.out.println("seen Message.......");

break;

}

}

return isnew;

}

/** *//**
* * 判断此郵件是否包含附件
*
*/

public boolean isContainAttach(Part part) throws Exception ...{

boolean attachflag = false;

// String contentType = part.getContentType();

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 = isContainAttach((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 = isContainAttach((Part) part.getContent());

}

return attachflag;

}

/** *//**
*
* 保存附件
*
*/

public void saveAttachMent(Part part) throws Exception ...{

String fileName = "";

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)))) ...{

fileName = mpart.getFileName();

if (fileName.toLowerCase().indexOf("gb2312") != -1) ...{

fileName = MimeUtility.decodeText(fileName);

}

saveFile(fileName, mpart.getInputStream());

} else if (mpart.isMimeType("multipart/*")) ...{

saveAttachMent(mpart);

} else ...{

fileName = mpart.getFileName();

if ((fileName != null)

&& (fileName.toLowerCase().indexOf("GB2312") != -1)) ...{

fileName = MimeUtility.decodeText(fileName);

saveFile(fileName, mpart.getInputStream());

}

}

}

} else if (part.isMimeType("message/rfc822")) ...{

saveAttachMent((Part) part.getContent());

}

}

/** *//**
*
* 设置附件存放路径
*
*/

public void setAttachPath(String attachpath) ...{

this.saveAttachPath = attachpath;

}

/** *//**
*
* 设置日期显示格式
*
*/

public void setDateFormat(String format) throws Exception ...{

this.dateformat = format;

}

/** *//**
*
* 获得附件存放路径
*
*/

public String getAttachPath() ...{

return saveAttachPath;

}

/** *//**
* * 保存附件到指定目录里
*
*/

private void saveFile(String fileName, InputStream in) throws Exception ...{

String osName = System.getProperty("os.name");

String storedir = getAttachPath();

String separator = "";

if (osName == null)

osName = "";

if (osName.toLowerCase().indexOf("win") != -1) ...{

separator = "/";

if (storedir == null || storedir.equals(""))

storedir = "c:/tmp";

} else ...{

separator = "/";

storedir = "/tmp";

}

File storefile = new File(storedir + separator + fileName);

System.out.println("storefile's path: " + storefile.toString());

// for(int i=0;storefile.exists();i++){

// storefile = new File(storedir+separator+fileName+i);

// }

BufferedOutputStream bos = null;

BufferedInputStream bis = null;

try ...{

bos = new BufferedOutputStream(new FileOutputStream(storefile));

bis = new BufferedInputStream(in);

int c;

while ((c = bis.read()) != -1) ...{

bos.write(c);

bos.flush();

}

} catch (Exception exception) ...{

exception.printStackTrace();

throw new Exception("文件保存失败!");

} finally ...{

bos.close();

bis.close();

}

}

/** *//**
* * 类测试
*
*/

public static void main(String args[]) throws Exception ...{

Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";

String host = "imap.gmail.com"; // 主机名/ip

String username = "xxxxxx"; // 用戶名

String password = "xxxxxxx"; // 密碼

// Properties props = new Properties();

Properties props = System.getProperties();
props.put("proxySet", "true");
props.put("socksProxyPort", "1089");
props.put("socksProxyHost", "172.16.128.86"); //sock5代理服务器地址

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");

// props.put("mail.pop3.auth", "true");

Session session = Session.getDefaultInstance(props, null);

session.setDebug(true);

Store store = session.getStore("imap");// 郵件服務器

store.connect(host, username, password);

Folder folder = store.getFolder("INBOX"); // 郵件服務器目錄

// folder.open(Folder.READ_ONLY);
folder.open(Folder.READ_WRITE);

Message message[] = folder.getMessages(); // 獲得郵件

System.out.println("Messages's length: " + message.length);

gmailRead pmm = null;

for (int i = 0; i < message.length; i++) ...{

pmm = new gmailRead((MimeMessage) message[i]);

System.out
.println("Message " + i + " subject: " + pmm.getSubject());

System.out.println("Message " + i + " sentdate: "
+ pmm.getSentDate());

System.out.println("Message " + i + " replysign: "
+ pmm.getReplySign());

System.out.println("Message " + i + " hasRead: " + pmm.isNew());

System.out.println("Message " + i + " containAttachment: "
+ pmm.isContainAttach((Part) message[i]));

System.out.println("Message " + i + " from: " + pmm.getFrom());

System.out.println("Message " + i + " to: "
+ pmm.getMailAddress("to"));

System.out.println("Message " + i + " cc: "
+ pmm.getMailAddress("cc"));

System.out.println("Message " + i + " bcc: "
+ pmm.getMailAddress("bcc"));

pmm.setDateFormat("yy年MM月dd日 HH:mm");

System.out.println("Message " + i + " sentdate: "
+ pmm.getSentDate());

System.out.println("Message " + i + " Message-ID: "
+ pmm.getMessageId());

// pmm.getMailContent((Part) message[i]);

System.out.println("Message " + i + " bodycontent:  "
+ pmm.getBodyText());

pmm.setAttachPath("d:/tmp");

// pmm.saveAttachMent((Part) message[i]);

message[i].setFlag(Flags.Flag.SEEN, true); //将邮件状态设置为已读
// message[i].saveChanges();//此处代码无用,如果放开报readonly错误,执行更新是通过下面folder.colse(true)实现的

}
folder.close(true);
}

}


本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/superstorm5/archive/2008/03/07/2157022.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值