packagecom.zz.mail;import java.io.*;import java.text.*;import java.util.*;import javax.mail.*;import javax.mail.internet.*;importjava.io.File;import jxl.*;/*** 有一封邮件就需要建立一个ReciveMail对象*/
public classReciveOneMail {private MimeMessage mimeMessage = null;private String saveAttachPath = "c:/"; //附件下载后的存放目录
private StringBuffer bodytext = new StringBuffer();//存放邮件内容
private String dateformat = "yy-MM-dd HH:mm"; //默认的日前显示格式
publicReciveOneMail(MimeMessage mimeMessage) {this.mimeMessage =mimeMessage;
}public voidsetMimeMessage(MimeMessage mimeMessage) {this.mimeMessage =mimeMessage;
}/*** 获得发件人的地址和姓名*/
public String getFrom() throwsException {
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 + "";returnfromaddr;
}/*** 获得邮件的收件人,抄送,和密送的地址和姓名,根据所传递的参数的不同 "to"----收件人 "cc"---抄送人地址 "bcc"---密送人地址*/
public String getMailAddress(String type) throwsException {
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 + "";
mailaddr+= "," +compositeto;
}
mailaddr= mailaddr.substring(1);
}
}else{throw new Exception("Error emailaddr type!");
}returnmailaddr;
}/*** 获得邮件主题*/
public String getSubject() throwsMessagingException {
String subject= "";try{
subject=MimeUtility.decodeText(mimeMessage.getSubject());if (subject == null)
subject= "";
}catch(Exception exce) {}returnsubject;
}/*** 获得邮件发送日期*/
public String getSentDate() throwsException {
Date sentdate=mimeMessage.getSentDate();
SimpleDateFormat format= newSimpleDateFormat(dateformat);returnformat.format(sentdate);
}/*** 获得邮件正文内容*/
publicString getBodyText() {returnbodytext.toString();
}/*** 解析邮件,把得到的邮件内容保存到一个StringBuffer对象中,解析邮件 主要是根据MimeType类型的不同执行不同的操作,一步一步的解析*/
public void getMailContent(Part part) throwsException {
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() throwsMessagingException {boolean replysign = false;
String needreply[]=mimeMessage
.getHeader("Disposition-Notification-To");if (needreply != null) {
replysign= true;
}returnreplysign;
}/*** 获得此邮件的Message-ID*/
public String getMessageId() throwsMessagingException {returnmimeMessage.getMessageID();
}/*** 【判断此邮件是否已读,如果未读返回返回false,反之返回true】*/
public boolean isNew() throwsMessagingException {boolean isnew = false;
Flags flags=((Message) mimeMessage).getFlags();
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;
}
}returnisnew;
}/*** 判断此邮件是否包含附件*/
public boolean isContainAttach(Part part) throwsException {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());
}returnattachflag;
}/*** 【保存附件】*/
public void saveAttachMent(Part part) throwsException {
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("gbk") != -1) {
fileName=MimeUtility.decodeText(fileName);
}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.toLowerCase().indexOf("gb18030") != -1))) {
fileName=MimeUtility.decodeText(fileName);
saveFile(fileName, mpart.getInputStream());
}
}
}
}else if (part.isMimeType("message/rfc822")) {
saveAttachMent((Part) part.getContent());
}
}/*** 【设置附件存放路径】*/
public voidsetAttachPath(String attachpath) {this.saveAttachPath =attachpath;
}/*** 【设置日期显示格式】*/
public void setDateFormat(String format) throwsException {this.dateformat =format;
}/*** 【获得附件存放路径】*/
publicString getAttachPath() {returnsaveAttachPath;
}/*** 【真正的保存附件到指定目录里】*/
private void saveFile(String fileName, InputStream in) throwsException {
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(newFileOutputStream(storefile));
bis= newBufferedInputStream(in);intc;while ((c = bis.read()) != -1) {
bos.write(c);
bos.flush();
}
}catch(Exception exception) {
exception.printStackTrace();throw new Exception("文件保存失败!");
}finally{
bos.close();
bis.close();
}//解析EXCEL
Workbook book = Workbook.getWorkbook(new File(storedir + separator +fileName));
Sheet[] sheets=book.getSheets();
Sheet sheet= sheets[0];
System.out.println("Sheet"+0);int col =sheet.getColumns();int row =sheet.getRows();for(int r=3;r
Cell cell = sheet.getCell(1, r);
String result=cell.getContents();
System.out.print(" "+result);//}//System.out.println();
}
book.close();
}/*** PraseMimeMessage类测试*/
public static void main(String args[]) throwsException {
String protocol= "pop3";boolean isSSL = true;
String host= "pop.163.com";int port = 995;
String username= "xxxx@163.com";
String password= "*****";
Properties props= newProperties();
props.put("mail.pop3.ssl.enable", isSSL);
props.put("mail.pop3.host", host);
props.put("mail.pop3.port", port);
Session session=Session.getDefaultInstance(props);
Store store=session.getStore(protocol);
store.connect(username, password);
Folder folder= store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
Message message[]=folder.getMessages();
System.out.println("Messages's length: " +message.length);
ReciveOneMail pmm= null;for (int i = 0; i < message.length; i++) {
System.out.println("======================");
pmm= newReciveOneMail((MimeMessage) message[i]);if(pmm.isNew()) {continue;
}else{
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 + " form: " +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: \r\n"
+pmm.getBodyText());
message[i].setFlag(Flags.Flag.SEEN,true);//设置为已读,不能使用。。。。
message[i].saveChanges();
pmm.setAttachPath("c:\\");
pmm.saveAttachMent((Part) message[i]);
}
}
}
}