JavaMail接收指定邮箱账号的邮件
/**
*
* @author archie
* 接收指定账号的邮件
*/
public class ReceiveMail {
/**
* Message实现了Part接口,它表示一个邮件消息,包含一系列的属性和一个消息内容。
* 消息属性包括了消息址址消息,定义了消息内容的结构(包括内容类型),
* 消息内容使用DataHandler对象包装实际数据。当邮件消息位于目录(folder)中时,
* 系统还使用了一个标志位集合来描述它的状态。
*/
private MimeMessage msg = null ;
private String saveAttchPath = "" ; // 保存附件路径
private StringBuffer bodytext = new StringBuffer(); // 邮件内容
private String dateformate = " yy-MM-dd HH:mm " ; // 日期格式化
public ReceiveMail(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编码为javamail方式编码
* 编码内容的字符集是系统字符集
*/
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 ;
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) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
bos.close();
bis.close();
}
}
/**
* 接收邮件
* @param part
* @param i
* @throws MessagingException
* @throws IOException
*/
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());
// 附件目录不存在则创建该目录
try {
if ( ! ( new File( " f://temp// " + i).isDirectory())) {
new File( " f://temp// " + i).mkdir();
}
} catch (SecurityException e) {
// e.printStackTrace();
}
// 设置保存附件路径
setSaveAttchPath( " f://temp// " + i);
if (flag){
saveAttchMent(part);
}
System.out.println( " ------------------END----------------------- " + i);
}
/**
* 测试主方法
* @param args
* @throws MessagingException
* @throws IOException
*/
public static void main(String[] args) throws MessagingException, IOException {
/**
* 初始化服务器环境
* session类定义了与远程邮件系统通信的邮件会话
* 它只是用于存储与服务器建立连接会话相关信息和逻辑。
*/
Properties props = new Properties();
props.setProperty( " mail.smtp.host " , " smtp.163.com " );
props.setProperty( " mail.smtp.auth " , " true " );
Session session = Session.getDefaultInstance(props, null );
/**
* 第1个参数为接受协议,第2个参数为邮件接收服务器的地址,
* 第三个参数为pop3协议的端口,最后两个为用户名和密码
*/
URLName urlname = new URLName( " pop3 " , " pop.163.com " , 110 , null , " [email protected]******* " , " 13938 " );
/**
* java.mail.Store 该类实际特定邮件协议上的读,写,监视,查找等操作
*/
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);
ReceiveMail rm = null ;
System.out.println( " 该账号邮件数目: " + count);
for ( int i = 0 ;i < count;i ++ ){
rm = new ReceiveMail((MimeMessage) msgs[i]);
rm.recive(msgs[i],i);;
System.out.println( " =============================邮件分隔线======================== " );
}
// 释放资源
try {
if (folder != null )
folder.close( false );
if (store != null )
store.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}