java邮件客户端


/***
 *邮件VO
**/
package net.jk.util.email.vo; import java.util.Date; import java.util.List; import net.jk.app.model.App_emailfile; public class App_email { private String title; // 主题 private String fromaddr; // 发件人 private String toaddr; // 收件人 private String acctoaddr; // 抄送 private String kind="no"; // 类型 private String sta = "收件箱"; // 状态 private Date senddate = new Date(); // 发送(接收)时间 private String mailbody; // 正文 private List<App_emailfile> app_emailfiles; /** [集合] */ public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getFromaddr() { return fromaddr; } public void setFromaddr(String fromaddr) { this.fromaddr = fromaddr; } public String getToaddr() { return toaddr; } public void setToaddr(String toaddr) { this.toaddr = toaddr; } public String getAcctoaddr() { return acctoaddr; } public void setAcctoaddr(String acctoaddr) { this.acctoaddr = acctoaddr; } public String getKind() { return kind; } public void setKind(String kind) { this.kind = kind; } public String getSta() { return sta; } public void setSta(String sta) { this.sta = sta; } public Date getSenddate() { return senddate; } public void setSenddate(Date senddate) { this.senddate = senddate; } public String getMailbody() { return mailbody; } public void setMailbody(String mailbody) { this.mailbody = mailbody; } public List<App_emailfile> getApp_emailfiles() { return app_emailfiles; } public void setApp_emailfiles(List<App_emailfile> app_emailfiles) { this.app_emailfiles = app_emailfiles; } }

package net.jk.util.email.vo;



/**

 * 

 * 

 * @author ZOUQH

 * 邮件附件实体

 *

 */



public class App_emailfile {



	private App_email app_email;

	private String name;		//名称

	private String url;		//URL

	private String kind;		//类型

	private String sta="启用";		//状态

	

	

	

	

	public App_email getApp_email() {

		return app_email;

	}

	public void setApp_email(App_email app_email) {

		this.app_email = app_email;

	}

	public String getName() {

		return name;

	}

	public void setName(String name) {

		this.name = name;

	}

	public String getUrl() {

		return url;

	}

	public void setUrl(String url) {

		this.url = url;

	}

	public String getKind() {

		return kind;

	}

	public void setKind(String kind) {

		this.kind = kind;

	}

	public String getSta() {

		return sta;

	}

	public void setSta(String sta) {

		this.sta = sta;

	}





}

  检查是否存在新邮件如果存在则收取并且标记已读

package net.jk.util.email;



import java.io.UnsupportedEncodingException;

import java.security.Security;

import java.util.Properties;



import javax.mail.FetchProfile;

import javax.mail.Flags;

import javax.mail.Folder;

import javax.mail.Message;

import javax.mail.MessagingException;

import javax.mail.Session;

import javax.mail.Store;



import com.sun.mail.imap.IMAPFolder;



/***

 * 

 * @author zouqh

 * 

 */

public class CheckNewMail {

	private String imaphost;

	private String username;

	private String password;

	private Session session;

	private Store store;

	private IMAPFolder folder=null;



	public CheckNewMail(String imaphost, String username, String password) {

		this.imaphost = imaphost;

		this.username = username;

		this.password = password;



	}



	private void connect() throws MessagingException {

		Security.addProvider(  new  com.sun.net.ssl.internal.ssl.Provider());

		final  String SSL_FACTORY  =   "javax.net.ssl.SSLSocketFactory" ;

		Properties props = System.getProperties();

		props.setProperty(  "mail.imap.socketFactory.class" , SSL_FACTORY);

		props.setProperty(  "mail.imap.socketFactory.port" ,  "993" );

		props.put("mail.store.protocol", "imap");

		props.put("mail.imap.host", imaphost);

		props.put("mail.imap.ssl.enable", "true");

		//props.setProperty(  "mail.imap.socketFactory.fallbac " ,  "false" );

		props.setProperty(  " mail.imap.port" ,  "993" );

		props.setProperty("mail.imap.auth.login.disable", "true");  

		this.session = Session.getInstance(props,null);

		this.session.setDebug(false);

		this.store = session.getStore("imap");

		this.store.connect(imaphost,username, password);

	}



	public int getNewMailCount() {

		int count = 0;

		 int total = 0;

		try {

			this.connect();

			folder =  (IMAPFolder) store.getFolder("INBOX");

			folder.open(Folder.READ_WRITE);

			 FetchProfile profile = new FetchProfile();

			 profile.add(FetchProfile.Item.ENVELOPE);

			 Message[] messages = folder.getMessages();

			 folder.fetch(messages, profile);

			 System.out.println("收件箱的邮件数:" + messages.length);

			count = folder.getNewMessageCount();

			total = folder.getMessageCount();

            System.out.println("-----------------您的邮箱共有邮件:" + total+" 封--------------");

			

			 System.out.println("\t收件箱的总邮件数:" + messages.length);  

             System.out.println("\t未读邮件数:" + folder.getUnreadMessageCount());  

             System.out.println("\t新邮件数:" + folder.getNewMessageCount());  

             System.out.println("----------------End------------------");

			 for(int i=(total-count);i<total;i++){

				 Message message = messages[i]; 

				 //message.setFlag(Flags.Flag.SEEN, true);

			 }

		} catch (MessagingException e) {

		     try  

	            {  

	                byte[] buf = e.getMessage().getBytes("ISO-8859-1");  

	                System.out.println(new String(buf, "GBK"));  

	            }  

	            catch (UnsupportedEncodingException e1)  

	            {  

	                e1.printStackTrace();  

	            }  

	            throw new RuntimeException("登录失败", e);  

		} finally {

			closeConnect();

		}

		return count;

	}



	// 关闭连接

	public void closeConnect() {

		try {

			if (folder != null)

				folder.close(true);// 关闭连接时是否删除邮件,true删除邮件

		} catch (MessagingException e) {

			e.printStackTrace();

		} finally {

			try {

				if (store != null)

					store.close();// 关闭收件箱连接

			} catch (MessagingException e) {

				e.printStackTrace();

			}

		}

	}



	public static void main(String[] args) {

		CheckNewMail mail = new CheckNewMail("imap.163.com",

				"[email protected]", "218660360****");

//		CheckNewMail mail = new CheckNewMail("imap.qq.com",

//		"[email protected]", "218660360****"");

//		CheckNewMail mail = new CheckNewMail("imap.yeah.net",

//		"[email protected]", "218660360****"");

		System.out.println(mail.getNewMailCount());

	}



}

  

 

package net.jk.util.email;



import java.io.File;

import java.security.Security;

import java.util.Properties;



import com.sun.net.ssl.internal.ssl.Provider;



/**

 * 收邮件的基本信息

 */

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;



	private boolean isSSL;

	



	/**

	 * 获得邮件会话属性

	 */

	public Properties getProperties() {

		Properties p = new Properties();

		if (isSSL() == true) {

			Security.addProvider(new Provider());

			final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";

			p.setProperty("mail.pop3.socketFactory.class", SSL_FACTORY);

			p.setProperty("mail.pop3.socketFactory.fallback", "false");

			p.setProperty("mail.pop3.port", this.mailServerPort);

			p.setProperty("mail.pop3.socketFactory.port", this.mailServerPort);

			p.put("mail.pop3.host", this.mailServerHost);

			p.put("mail.pop3.auth", validate ? "true" : "false");

		} else {

			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;

	}



	public boolean isSSL() {

		return isSSL;

	}



	public void setSSL(boolean isSSL) {

		this.isSSL = isSSL;

	}



	

}

  

package net.jk.util.email;



import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.ByteArrayOutputStream;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStreamWriter;

import java.io.Reader;

import java.io.UnsupportedEncodingException;

import java.util.ArrayList;

import java.util.Date;

import java.util.List;



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.MimeMultipart;

import javax.mail.internet.MimeUtility;



import net.jk.app.model.App_email;

import net.jk.app.model.App_emailfile;



import org.apache.commons.io.FileUtils;



/**

 * 邮件接收器,目前支持pop3协议。 能够接收文本、HTML和带有附件的邮件

 */

public class MailReceiver {

	// 收邮件的参数配置

	private MailReceiverInfo receiverInfo;

	// 与邮件服务器连接后得到的邮箱

	private Store store;

	// 收件箱

	private Folder folder;

	// 收件箱中的邮件消息

	private Message[] messages;

	// 当前正在处理的邮件消息

	private Message currentMessage;



	private String currentEmailFileName;



	private App_email app_email;



	private App_emailfile app_emailfiles;



	public List<App_email> app_emails = new ArrayList<App_email>();

	

	private static String path;

	

	public MailReceiver(String email, String password, String host,

			String hostport, boolean isSSL, String root) {

		this.receiverInfo = new MailReceiverInfo();

		this.receiverInfo.setUserName(email);

		this.receiverInfo.setPassword(password);

		this.receiverInfo.setMailServerHost(host);

		this.receiverInfo.setMailServerPort(hostport);

		this.receiverInfo.setSSL(isSSL);

		this.receiverInfo.setValidate(true);

		path=root;

		this.receiverInfo.setEmailDir(root + File.separator + email

				+ File.separator);

		this.receiverInfo.setAttachmentDir(root + File.separator + email

				+ File.separator);

	}

	

	

	

	

	public App_email getApp_email() {

		return app_email;

	}



	public void setApp_email(App_email app_email) {

		this.app_email = app_email;

	}





	public void setApp_emailfiles(App_emailfile app_emailfiles) {

		this.app_emailfiles = app_emailfiles;

	}



	

	public App_emailfile getApp_emailfiles() {

		return app_emailfiles;

	}









	public List<App_email> getApp_emails() {

		return app_emails;

	}



	public void setApp_emails(List<App_email> app_emails) {

		this.app_emails = app_emails;

	}









	private int total;



	public int getTotal() {

		return total;

	}



	public void setTotal(int total) {

		this.total = total;

	}













	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("连接邮件服务器失败!");

		}

	}



	/**

	 * 收邮件

	 */

	public void receiveMail(int count) throws Exception {

		if (this.receiverInfo == null) {

			throw new Exception("必须提供接收邮件的参数!");

		}

		// 连接到服务器

		if (this.connectToServer()) {

			// 打开收件箱

			if (this.openInBoxFolder()) {

				// 获取指定邮件

				this.getMail(count);

				this.closeConnection();

			} else {

				throw new Exception("打开收件箱失败!");

			}

		} else {

			throw new Exception("连接邮件服务器失败!");

		}

	}



	/**

	 * 登陆邮件服务器

	 */

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

		// session.setDebug(true);

		// 创建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) {

				e.printStackTrace();

				errorCounter++;

				System.err.println("下载第" + index + "封邮件时出错");

			}

		}

		System.out.println("------------------");

		System.out.println("成功下载了" + successCounter + "封邮件");

		System.out.println("失败下载了" + errorCounter + "封邮件");

		System.out.println("------------------");

	}



	private void getMail(int count) throws MessagingException {



		this.messages = this.folder.getMessages();

		System.out.println("总的邮件数目:" + messages.length);

		System.out.println("新邮件数目:" + this.getNewMessageCount());

		System.out.println("未读邮件数目:" + this.getUnreadMessageCount());

		int num = this.getMessageCount();

		int len = 0;

		int index = 0;

		int errorCounter = 0; // 邮件下载出错计数器

		int successCounter = 0;

		if (num > count) {

			index = num - count;

			len = num;

		}

		if (num <= count) {

			len = count;

		}

		for (; index < len; index++) {

			try {

				this.currentMessage = (messages[index]); // 设置当前message

				this.currentMessage.setFlag(Flags.Flag.SEEN, true); 

				System.out.println("正在获取第" + index + "封邮件");

				this.showMailBasicInfo();

				getMail(); // 获取当前message

				System.out.println("成功获取第" + index + "封邮件");

				successCounter++;

			} catch (Throwable e) {

				e.printStackTrace();

				errorCounter++;

				System.err.println("下载第" + index + "封邮件时出错");

			}

		}

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

		String tempStr = "";

		tempStr = mimeMessage.getSubject();

		tempStr = MessyCodeCheck.toGb2312(tempStr);

		try {

			// 将邮件主题解码

			subject = MimeUtility.decodeText(tempStr);

			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;

		int k = 0;

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

					k++;

					attachflag = true;

				} else if (bodyPart.isMimeType("multipart/mixed")) {

					k++;

					attachflag = isContainAttach((Part) bodyPart);

				} else {

					String contype = bodyPart.getContentType();

					if (contype.toLowerCase().indexOf("application") != -1) {

						attachflag = true;

						k++;

					}

					if (contype.toLowerCase().indexOf("name") != -1) {

						attachflag = true;

						k++;

					}

				}



			}

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



			attachflag = isContainAttach((Part) part.getContent());

		}



		if (attachflag) {

			System.out

					.println("hello==================================part.isMimeType"

							+ k + attachflag);

		}



		return attachflag;

	}



	/**

	 * 获得当前邮件

	 */

	private void getMail() throws Exception {

		try {

			List<App_emailfile> emailfiles = new ArrayList<App_emailfile>();

			App_email emailcontent = new App_email();

			emailcontent.setApp_emailfiles(this.getEmailFiles(emailfiles,

					this.currentMessage,emailcontent));

			// this.saveMessageAsFile(currentMessage);

			this.parseMessage(currentMessage, emailcontent);



		} 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 = null;

			if (this.getMessageId(message) != null) {

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

			File file = null;

			file = new File(this.receiverInfo.getEmailDir());

			// FileUtils.forceMkdir(file);

			file = storeFile;

			// FileUtils.touch(file);

			// 将邮件消息的内容写入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, App_email emailcontent)

			throws IOException, MessagingException {

		Object content = message.getContent();



		if (content instanceof Multipart) {

			handleMultipart((Multipart) content, emailcontent);

		} else if (content instanceof String) {

			

			if (content != null) {

				emailcontent.setMailbody( content.toString());

				try {

					emailcontent.setSenddate(this.getSentDate());

					emailcontent.setTitle(this.getSubject());

					emailcontent.setFromaddr(this.getFrom());

					emailcontent.setToaddr(this.getTOAddress());

					emailcontent.setAcctoaddr(this.getBCCAddress());

					app_emails.add(emailcontent);

				} catch (Exception e) {

					e.printStackTrace();

				}

			}

		}



		else {

			handlePart(message, emailcontent);

		}



	}



	/*

	 * 解析Multipart

	 */

	private void handleMultipart(Multipart multipart, App_email emailcontent)

			throws MessagingException, IOException {

		for (int i = 0, n = multipart.getCount(); i < n; i++) {

			handlePart(multipart.getBodyPart(i), emailcontent);

		}

	}



	/*

	 * 解析指定part,从中提取文件

	 */

	private void handlePart(Part part, App_email emailcontent)

			throws MessagingException, IOException {

		String disposition = null;

		String content = null;

		disposition = part.getDisposition();

		// 当前没有附件的情况

		if (disposition == null) {



			Object obj = part.getContent();

			System.out.println("abcdefg======>" + (obj instanceof Multipart));

			if (obj instanceof String) {

				content = (String) obj;



				if (content != null) {

					emailcontent.setMailbody(content);

					try {

						emailcontent.setSenddate(this.getSentDate());

						emailcontent.setTitle(this.getSubject());

						emailcontent.setFromaddr(this.getFrom());

						emailcontent.setToaddr(this.getTOAddress());

						emailcontent.setAcctoaddr(this.getBCCAddress());

					} catch (Exception e) {

						e.printStackTrace();

					}

				}



				app_emails.add(emailcontent);

			}



			if (obj instanceof Multipart) {

				this.handleMultipart((Multipart) obj,  emailcontent);

				

			}



		}



		if (!Part.ATTACHMENT.equalsIgnoreCase(part.getDisposition())) {

			if (part.getContent().getClass().equals(MimeMultipart.class)) {

				MimeMultipart mimemultipart = (MimeMultipart) part.getContent();

				System.out.println("Number of embedded multiparts "

						+ mimemultipart.getCount());

				for (int k = 0; k < mimemultipart.getCount(); k++) {

					if (mimemultipart.getBodyPart(k).getFileName() != null) {

						System.out.println("     > Creating file with name : "

								+ mimemultipart.getBodyPart(k).getFileName());

						savefile(mimemultipart.getBodyPart(k).getFileName(),

								mimemultipart.getBodyPart(k).getInputStream());

					}

				}

			}

		}



		System.out.println("     > Creating file with name : "

				+ part.getFileName());

		savefile(part.getFileName(), part.getInputStream());

	}



	

	

	public List<App_emailfile> getEmailFiles(List<App_emailfile> emailFiles, Part part,App_email emailcontent) {

		boolean attachflag = false;

		App_emailfile emailfile = null;

		try {

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

						emailfile = new App_emailfile();

						emailfile.setName(getFileName(bodyPart));

						

						emailfile.setUrl(path+bodyPart.getFileName());

						System.out.println();

						emailfile

								.setKind(MessyCodeCheck.getExtensionName(path));

						emailfile.setApp_email(emailcontent);

						emailFiles.add(emailfile);



					} else {

						String contype = bodyPart.getContentType();

						if (contype.toLowerCase().indexOf("application") != -1) {

							emailfile = new App_emailfile();

							emailfile.setName(getFileName(bodyPart));

							path = this.receiverInfo.getUserName()

									+ getFileName(bodyPart);

							emailfile.setUrl(path+bodyPart.getFileName());

							emailfile.setKind(MessyCodeCheck

									.getExtensionName(path));

							emailfile.setApp_email(emailcontent);

							emailFiles.add(emailfile);

						}

						if (contype.toLowerCase().indexOf("name") != -1) {

							emailfile = new App_emailfile();

							emailfile.setName(getFileName(bodyPart));

							path = this.receiverInfo.getUserName()

									+ getFileName(bodyPart);

							emailfile.setUrl(path+bodyPart.getFileName());

							emailfile.setKind(MessyCodeCheck

									.getExtensionName(path));

							emailfile.setApp_email(emailcontent);

							emailFiles.add(emailfile);

						}

					}



				}

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



				attachflag = isContainAttach((Part) part.getContent());

			}

		} catch (MessagingException e) {

			e.printStackTrace();

		} catch (IOException e) {

			e.printStackTrace();

		} catch (Exception e) {

			e.printStackTrace();

		}



		System.out

				.println("emailFiles.size()==================================>"

						+ emailFiles.size());



		return emailFiles;

	}





	public static void savefile(String FileName, InputStream is)

			throws IOException {

		File f = new File(path+ FileName);

		FileUtils.touch(f);

		FileOutputStream fos = new FileOutputStream(f);

		byte[] buf = new byte[4096];

		int bytesRead;

		while ((bytesRead = is.read(buf)) != -1) {

			fos.write(buf, 0, bytesRead);

		}

		fos.close();



	}



	private String getFileName(Part part) throws MessagingException,

			UnsupportedEncodingException {

		String fileName = part.getFileName();



		String name = null;

		if (fileName != null) {

			fileName = MimeUtility.decodeText(fileName);

			name = fileName;

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

		}

		// 从输入流中读取数据,写入文件输出流

		FileOutputStream fs = new FileOutputStream(file);

		OutputStreamWriter ow = new OutputStreamWriter(fs, "UTF-8");

		// FileWriter fos = new FileWriter(file);

		BufferedWriter bos = new BufferedWriter(ow);

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

		receiverInfo.setValidate(true);

		receiverInfo.setUserName("[email protected]");

		receiverInfo.setPassword("218660360****");

		receiverInfo.setAttachmentDir("E:/temp/mail/yeah");

		receiverInfo.setEmailDir("E:/temp/mail/yeah/emaildir");

		receiverInfo.setSSL(true);

		MailReceiver receiver = new MailReceiver(receiverInfo);



		receiver.receiveAllMail();

		

		System.out.println("receiver.getNewMessageCount()=====>"+receiver.getNewMessageCount());

		List<App_email> contents=new ArrayList<App_email>();

		

		for (App_email a : receiver.getApp_emails()) {

			if(!contents.contains(a)){

				contents.add(a);

			}

		}

		for (App_email a : contents) {

			System.out.println("a.getSubject()" + a.getTitle());

			if (a.getApp_emailfiles() != null) {

				for (App_emailfile b :a.getApp_emailfiles()) {

					System.out.println("b.getName()" + b.getUrl());

				}

			}

		}

	}

}

  发送带附件的邮件

package net.jk.util.email;



import java.security.Security;

import java.util.ArrayList;

import java.util.Date;

import java.util.Iterator;

import java.util.List;

import java.util.Properties;

import java.util.StringTokenizer;



import javax.activation.DataHandler;

import javax.activation.FileDataSource;

import javax.mail.Address;

import javax.mail.BodyPart;

import javax.mail.Message;

import javax.mail.Multipart;

import javax.mail.Session;

import javax.mail.Transport;

import javax.mail.internet.AddressException;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeBodyPart;

import javax.mail.internet.MimeMessage;

import javax.mail.internet.MimeMultipart;

import javax.mail.internet.MimeUtility;



public class SendAttachMail {



	private String SMTPHost = ""; // SMTP服务器

	private String user = ""; // 登录SMTP服务器的帐号

	private String password = ""; // 登录SMTP服务器的密码

	private String from = ""; // 发件人邮箱

	private Address[] to = null; // 收件人邮箱

	private String subject = ""; // 邮件标题

	private String content = ""; // 邮件内容

	private Address[] copy_to = null;// 抄送邮件到

	private Session mailSession = null;

	private Transport transport = null;

	public ArrayList<String> filename = new ArrayList<String>(); // 附件文件名

	private static SendAttachMail sendMail = new SendAttachMail();



	// 无参数构造方法

	private SendAttachMail() {

	}



	public SendAttachMail(String smtphost, String user, String password,

			String from, Address[] to, String subject, String content,

			Address[] copy_to) {

		this.SMTPHost = smtphost;

		this.user = user;

		this.password = password;

		this.from = from;

		this.to = to;

		this.subject = subject;

		this.content = content;

		this.copy_to = copy_to;



	}



	// 返回本类对象的实例

	public static SendAttachMail getSendMailInstantiate() {

		return sendMail;

	}



	public String getContent() {

		return content;

	}



	public void setContent(String content) {

		try {

			// 解决内容的中文问题

			content = new String(content.getBytes("ISO8859-1"), "gbk");

		} catch (Exception ex) {

			ex.printStackTrace();

		}

		this.content = content;

	}



	public ArrayList<String> getFilename() {

		return filename;

	}



	public void setFilename(ArrayList<String> filename) {

		Iterator<String> iterator = filename.iterator();

		ArrayList<String> attachArrayList = new ArrayList<String>();

		while (iterator.hasNext()) {

			String attachment = iterator.next();

			try {

				// 解决文件名的中文问题

				attachment = MimeUtility.decodeText(attachment);

				// 将文件路径中的'\'替换成'/'

				attachment = attachment.replaceAll("\\\\", "/");

				attachArrayList.add(attachment);

			} catch (Exception ex) {

				ex.printStackTrace();

			}

		}

		this.filename = attachArrayList;

	}



	public String getFrom() {

		return from;

	}



	public void setFrom(String from) {

		this.from = from;

	}



	public String getPassword() {

		return password;

	}



	public void setPassword(String password) {

		this.password = password;

	}



	public String getSMTPHost() {

		return SMTPHost;

	}



	public void setSMTPHost(String host) {

		SMTPHost = host;

	}



	public String getSubject() {

		return subject;

	}



	public void setSubject(String subject) {

		try {

			// 解决标题的中文问题

			subject = MimeUtility.encodeText(subject);

		} catch (Exception ex) {

			ex.printStackTrace();

		}

		this.subject = subject;

	}



	public Address[] getTo() {

		return to;

	}



	public void setTo(String toto) {

		int i = 0;

		StringTokenizer tokenizer = new StringTokenizer(toto, ";");

		to = new Address[tokenizer.countTokens()];// 动态的决定数组的长度

		while (tokenizer.hasMoreTokens()) {

			String d = tokenizer.nextToken();

			try {

				d = MimeUtility.encodeText(d);

				to[i] = new InternetAddress(d);// 将字符串转换为整型

			} catch (Exception e) {

				e.printStackTrace();

			}

			i++;

		}

	}



	public String getUser() {

		return user;

	}



	public void setUser(String user) {

		this.user = user;

	}



	public Address[] getCopy_to() {

		return copy_to;

	}



	// 设置抄送

	public void setCopy_to(String copyTo) {

		int i = 0;

		StringTokenizer tokenizer = new StringTokenizer(copyTo, ";");

		copy_to = new Address[tokenizer.countTokens()];// 动态的决定数组的长度

		while (tokenizer.hasMoreTokens()) {

			String d = tokenizer.nextToken();

			try {

				d = MimeUtility.encodeText(d);

				copy_to[i] = new InternetAddress(d);// 将字符串转换为整型

			} catch (Exception e) {

				e.printStackTrace();

			}

			i++;

		}

	}



	public void connect() throws Exception {



		Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());

		final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";

		// 创建一个属性对象

		Properties props = new Properties();

		MyAuthenticator auth = null;

		// 指定SMTP服务器

		props.put("mail.smtp.host", this.SMTPHost);

		// 指定是否需要SMTP验证

		props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);

		props.setProperty("mail.smtp.socketFactory.fallback", "false");

		props.setProperty("mail.smtp.port", "465");

		props.setProperty("mail.smtp.socketFactory.port", "465");

		props.put("mail.smtp.auth", "true");

		// 创建一个授权验证对象

		auth = new MyAuthenticator(this.user, this.password);

		// 创建一个Session对象

		mailSession = Session.getDefaultInstance(props, auth);

		// 设置是否调试

		mailSession.setDebug(true);

		if (transport != null)

			transport.close();// 关闭连接

		// 创建一个Transport对象

		transport = mailSession.getTransport("smtp");

		// 连接SMTP服务器

		transport.connect(this.SMTPHost, this.user, this.password);

	}



	// 发送邮件

	public String send() {

		String issend = "";

		try {// 连接smtp服务器

			connect();

			// 创建一个MimeMessage 对象

			MimeMessage message = new MimeMessage(mailSession);



			// 指定发件人邮箱

			message.setFrom(new InternetAddress(from));

			// 指定收件人邮箱

			message.addRecipients(Message.RecipientType.TO, to);

			if (!"".equals(copy_to))

				// 指定抄送人邮箱

				message.addRecipients(Message.RecipientType.CC, copy_to);

			// 指定邮件主题

			message.setSubject(subject);

			// 指定邮件发送日期

			message.setSentDate(new Date());

			// 指定邮件优先级 1:紧急 3:普通 5:缓慢

			message.setHeader("X-Priority", "1");

			message.saveChanges();

			// 判断附件是否为空

			if (!filename.isEmpty()) {

				// 新建一个MimeMultipart对象用来存放多个BodyPart对象

				Multipart container = new MimeMultipart();

				// 新建一个存放信件内容的BodyPart对象

				BodyPart textBodyPart = new MimeBodyPart();

				// 给BodyPart对象设置内容和格式/编码方式

				textBodyPart.setContent(content, "text/html;charset=gbk");

				// 将含有信件内容的BodyPart加入到MimeMultipart对象中

				container.addBodyPart(textBodyPart);

				Iterator<String> fileIterator = filename.iterator();

				while (fileIterator.hasNext()) {// 迭代所有附件

					String attachmentString = fileIterator.next();

					// 新建一个存放信件附件的BodyPart对象

					BodyPart fileBodyPart = new MimeBodyPart();

					// 将本地文件作为附件

					FileDataSource fds = new FileDataSource(attachmentString);

					fileBodyPart.setDataHandler(new DataHandler(fds));

					// 处理邮件中附件文件名的中文问题

					String attachName = fds.getName();

					attachName = MimeUtility.encodeText(attachName);

					// 设定附件文件名

					fileBodyPart.setFileName(attachName);

					// 将附件的BodyPart对象加入到container中

					container.addBodyPart(fileBodyPart);

				}

				// 将container作为消息对象的内容

				message.setContent(container);

			} else {// 没有附件的情况

				message.setContent(content, "text/html;charset=gbk");

			}

			// 发送邮件

			Transport.send(message, message.getAllRecipients());

			if (transport != null)

				transport.close();

		} catch (Exception ex) {

			issend = ex.getMessage();

		}

		return issend;

	}



	public static void main(String args[]) {



		String subject = "主题信息";

		String content = "<html><title>TEST</title><body>这个只是一个测试文件!请注意查收!</body></html>";

		String from = "[email protected]";

		String tto = "[email protected]";

		String[] media = tto.split(",");

		List list = new ArrayList();

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

			try {

				list.add(new InternetAddress(media[i]));

			} catch (AddressException e) {

				e.printStackTrace();

			}

		}

		InternetAddress[] address = (InternetAddress[]) list

				.toArray(new InternetAddress[list.size()]);

		Address[] copy_to = address;

		SendAttachMail mail = new SendAttachMail("smtp.qq.com",

				"[email protected]", "2186603606***", from, address, subject,

				content, copy_to);

		//mail.filename.add("E:/files/11.jpg");

		mail.send();

//		try {

//			mail.connect();

//		} catch (Exception e) {

//			// TODO Auto-generated catch block

//			e.printStackTrace();

//		}

	}



}

  

  

你可能感兴趣的:(java)