使用javaMail接收邮件(比较全)

摘要:
包装机构avidfang。邮政importjava.io。缓冲输入流;importjava.io。缓冲输出流;importjava.io。文件importjava.io。FileNotFoundException;importjava.io。文件输出流;导入java.io.IOExc
package org.davidfang.mail;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
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.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
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.Part;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.URLName;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
public class ReciveMail {

private MimeMessage msg = null;
private String saveAttchPath = "";
private StringBuffer bodytext = new StringBuffer();
private String dateformate = "yy-MM-dd HH:mm";

public ReciveMail(MimeMessage msg){
this.msg = msg;
}
public void setMsg(MimeMessage msg) {
this.msg = msg;
}

/**
* 获取发送邮件者信息
*
@return
*
@throws MessagingException
*/
public String getFrom() throws MessagingException{
InternetAddress[] address = (InternetAddress[]) msg.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"-->密送地址
*
@param type
*
@return
*
@throws MessagingException
*
@throws UnsupportedEncodingException
*/
public String getMailAddress(String type) throws MessagingException, UnsupportedEncodingException{
String mailaddr = "";
String addrType = type.toUpperCase();
InternetAddress[] address = null;

if(addrType.equals("TO")||addrType.equals("CC")||addrType.equals("BCC")){
if(addrType.equals("TO")){
address = (InternetAddress[]) msg.getRecipients(Message.RecipientType.TO);
}
if(addrType.equals("CC")){
address = (InternetAddress[]) msg.getRecipients(Message.RecipientType.CC);
}
if(addrType.equals("BCC")){
address = (InternetAddress[]) msg.getRecipients(Message.RecipientType.BCC);
}

if(address != null){
for(int i=0;i<address.length;i++){
String mail = address[i].getAddress();
if(mail == null){
mail = "";
}else{
mail = MimeUtility.decodeText(mail);
}
String personal = address[i].getPersonal();
if(personal == null){
personal = "";
}else{
personal = MimeUtility.decodeText(personal);
}
String compositeto = personal +"<"+mail+">";
mailaddr += ","+compositeto;
}
mailaddr = mailaddr.substring(1);
}
}else{
throw new RuntimeException("Error email Type!");
}
return mailaddr;
}

/**
* 获取邮件主题
*
@return
*
@throws UnsupportedEncodingException
*
@throws MessagingException
*/
public String getSubject() throws UnsupportedEncodingException, MessagingException{
String subject = "";
subject = MimeUtility.decodeText(msg.getSubject());
if(subject == null){
subject = "";
}
return subject;
}

/**
* 获取邮件发送日期
*
@return
*
@throws MessagingException
*/
public String getSendDate() throws MessagingException{
Date sendDate = msg.getSentDate();
SimpleDateFormat smd = new SimpleDateFormat(dateformate);
return smd.format(sendDate);
}

/**
* 获取邮件正文内容
*
@return
*/
public String getBodyText(){

return bodytext.toString();
}

/**
* 解析邮件,将得到的邮件内容保存到一个stringBuffer对象中,解析邮件 主要根据MimeType的不同执行不同的操作,一步一步的解析
*
@param part
*
@throws MessagingException
*
@throws IOException
*/
public void getMailContent(Part part) throws MessagingException, IOException{

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 count = multipart.getCount();
for(int i=0;i<count;i++){
getMailContent(multipart.getBodyPart(i));
}
}else if(part.isMimeType("message/rfc822")){
getMailContent((Part) part.getContent());
}

}

/**
* 判断邮件是否需要回执,如需回执返回true,否则返回false
*
@return
*
@throws MessagingException
*/
public boolean getReplySign() throws MessagingException{
boolean replySign = false;
String needreply[] = msg.getHeader("Disposition-Notification-TO");
if(needreply != null){
replySign = true;
}
return replySign;
}

/**
* 获取此邮件的message-id
*
@return
*
@throws MessagingException
*/
public String getMessageId() throws MessagingException{
return msg.getMessageID();
}

/**
* 判断此邮件是否已读,如果未读则返回false,已读返回true
*
@return
*
@throws MessagingException
*/
public boolean isNew() throws MessagingException{
boolean isnew = false;
Flags flags = ((Message)msg).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;
}
}

return isnew;
}

/**
* 判断是是否包含附件
*
@param part
*
@return
*
@throws MessagingException
*
@throws IOException
*/
public boolean isContainAttch(Part part) throws MessagingException, IOException{
boolean flag = false;

String contentType = part.getContentType();
if(part.isMimeType("multipart/*")){
Multipart multipart = (Multipart) part.getContent();
int count = multipart.getCount();
for(int i=0;i<count;i++){
BodyPart bodypart = multipart.getBodyPart(i);
String dispostion = bodypart.getDisposition();
if((dispostion != null)&&(dispostion.equals(Part.ATTACHMENT)||dispostion.equals(Part.INLINE))){
flag = true;
}else if(bodypart.isMimeType("multipart/*")){
flag = isContainAttch(bodypart);
}else{
String conType = bodypart.getContentType();
if(conType.toLowerCase().indexOf("appliaction")!=-1){
flag = true;
}
if(conType.toLowerCase().indexOf("name")!=-1){
flag = true;
}
}
}
}else if(part.isMimeType("message/rfc822")){
flag = isContainAttch((Part) part.getContent());
}

return flag;
}

/**
* 保存附件
*
@param part
*
@throws MessagingException
*
@throws IOException
*/
public void saveAttchMent(Part part) throws MessagingException, IOException{
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 dispostion = mpart.getDisposition();
if((dispostion != null)&&(dispostion.equals(Part.ATTACHMENT)||dispostion.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/*")){
saveAttchMent(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")){
saveAttchMent((Part) part.getContent());
}
}
/**
* 获得保存附件的地址
*
@return
*/
public String getSaveAttchPath() {
return saveAttchPath;
}
/**
* 设置保存附件地址
*
@param saveAttchPath
*/
public void setSaveAttchPath(String saveAttchPath) {
this.saveAttchPath = saveAttchPath;
}
/**
* 设置日期格式
*
@param dateformate
*/
public void setDateformate(String dateformate) {
this.dateformate = dateformate;
}
/**
* 保存文件内容
*
@param filename
*
@param inputStream
*
@throws IOException
*/
private void saveFile(String filename, InputStream inputStream) throws IOException {
String osname = System.getProperty("os.name");
String storedir = getSaveAttchPath();
String sepatror = "";
if(osname == null){
osname = "";
}

if(osname.toLowerCase().indexOf("win")!=-1){
sepatror = "//";
if(storedir==null||"".equals(storedir)){
storedir = "d://temp";
}
}else{
sepatror = "/";
storedir = "/temp";
}

File storefile = new File(storedir+sepatror+filename);
System.out.println("storefile's path:"+storefile.toString());

BufferedOutputStream bos = null;
BufferedInputStream bis = null;

try {
bos = new BufferedOutputStream(new FileOutputStream(storefile));
bis = new BufferedInputStream(inputStream);
int c;
while((c= bis.read())!=-1){
bos.write(c);
bos.flush();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
bos.close();
bis.close();
}

}

public void recive(Part part,int i) throws MessagingException, IOException{
System.out.println("------------------START-----------------------");
System.out.println("Message"+i+" subject:" + getSubject());
System.out.println("Message"+i+" from:" + getFrom());
System.out.println("Message"+i+" isNew:" + isNew());
boolean flag = isContainAttch(part);
System.out.println("Message"+i+" isContainAttch:" +flag);
System.out.println("Message"+i+" replySign:" + getReplySign());
getMailContent(part);
System.out.println("Message"+i+" content:" + getBodyText());
setSaveAttchPath("c://temp//"+i);
if(flag){
saveAttchMent(part);
}
System.out.println("------------------END-----------------------");
}


public static void main(String[] args) throws MessagingException, IOException {
Properties props = new Properties();
props.setProperty("mail.smtp.host", "smtp.sina.com");
props.setProperty("mail.smtp.auth", "true");
Session session = Session.getDefaultInstance(props,null);
URLName urlname = new URLName("pop3","pop.qq.com",110,null,"715881036","kingsoft");

Store store = session.getStore(urlname);
store.connect();
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
Message msgs[] = folder.getMessages();
int count = msgs.length;
System.out.println("Message Count:"+count);
ReciveMail rm = null;
for(int i=0;i<count;i++){
rm = new ReciveMail((MimeMessage) msgs[i]);
rm.recive(msgs[i],i);;
}


}

}

免责声明:文章转载自《使用javaMail接收邮件(比较全)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇AR的一些常见的操作Prometheus介绍及二进制部署(一)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

浅谈JEECG多数据源的使用

首先,简单的介绍下什么是JEECG。JEECG(J2EECode Generation)是一款基于代码生成器的免费开源的快速开发平台,使用JEECG可以简单快速地开发出企业级的Web应用系统。JEECG提倡简单功能由代码生成器直接生成,复杂业务采用表单自定义,业务流程使用工作流来实现、扩展出任务接口,由开发者编写特殊业务逻辑。 下面我们重点讲解下JEECG...

C#解析json的两种方式

    C#中Json转换主要使用的几种方法! 这篇主要介绍2、4。第三种方法使用的比较局限,所以我没有深入学习。 第二种方法   我使用比较多的方式,这个方法是.NET内置的,使用起来比较方便 A、利用serializer获取json的泛型对象 利用Dictionary<string,object>接收转换完的json对象,然后用查询泛型...

entrySet用法 以及遍历map的用法

keySet是键的集合,Set里面的类型即key的类型entrySet是 键-值 对的集合,Set里面的类型是Map.Entry   1.keySet() Map map=new HashMap(); Iterator it=map.keySet().iterator(); Object key; Object value; while(it.hasNex...

dbus

dbus 概念 --翻遍了google和百度,就这个图对入门帮助最大,dbus的文档真难找 fcitx 概念 dbus-send 命令行 /inputmethod --对象路径 org.freedesktop.DBus.Properties --interface --dest=org.fcitx.Fcitx //名称 dbus-send -...

第十章 内部类1

说明:内部类和组合是完全不同的概念,内部类看起来更像是一种代码隐藏机制。内部类了解外围类,并能与之通信。要创建一个内部类是非常简单的,只要将一个类定义在另一个类的内部即可。 创建内部类对象的方式: 1.如果内部类为公有、静态内部类: packagethink.in.java.test; /*** 一个包裹着公有的、静态的、内部类的外部类 * @aut...

C#-微信公众平台接口-上传临时素材

最烦做微信公众平台的东西。。文档说得不清不楚,又没示例代码,只能自己 慢慢搜索,弄了一晚上,基本弄出来了,把本地的图片上传到微信的临时素材那里,返回媒体ID,用于其他操作,代码如下 :(自己导入相应的类System.Net.Http,JSON解析用的LitJson)         /// <summary>        /// 上传临时素材...