package pekatool;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
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.Address;
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.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
import javax.mail.search.FlagTerm;
import javax.mail.search.FromStringTerm;
import javax.mail.search.OrTerm;
import javax.mail.search.SearchTerm;
import javax.mail.search.SubjectTerm;
import com.sun.mail.imap.IMAPFolder;
import com.sun.mail.imap.IMAPStore;
/**
* @author vn0ndus
* @author peka
*/
/**
* 使用POP3协议接收邮件
*/
public class POP3ReceiveMailTest {
public static void main(String[] args) throws Exception {
System.out.println(System.getProperty("user.dir") + "\\FILESTOMAIL\\");
resceive();
}
/**
* 接收邮件
*/
public static void resceive() throws Exception {
Properties prop = System.getProperties();
prop.put("mail.store.protocol", getProperties("protocol"));
prop.put("mail.imap.host", getProperties("servicePath"));
Session session = Session.getInstance(prop);
IMAPStore store = (IMAPStore) session.getStore("imap"); // 使用imap会话机制,连接服务器
store.connect(getProperties("user"), getProperties("pwd"));
IMAPFolder folder = (IMAPFolder) store.getFolder("INBOX"); // 收件箱
folder.open(Folder.READ_WRITE);
// 筛选
/**
* Flag 类型列举如下 Flags.Flag.ANSWERED 邮件回复标记,标识邮件是否已回复。 Flags.Flag.DELETED
* 邮件删除标记,标识邮件是否需要删除。 Flags.Flag.DRAFT 草稿邮件标记,标识邮件是否为草稿。
* Flags.Flag.FLAGGED 表示邮件是否为回收站中的邮件。 Flags.Flag.RECENT
* 新邮件标记,表示邮件是否为新邮件。 Flags.Flag.SEEN 邮件阅读标记,标识邮件是否已被阅读。 Flags.Flag.USER
* 底层系统是否支持用户自定义标记,只读。
*/
FlagTerm ft = new FlagTerm(new Flags(Flags.Flag.SEEN), false);
// 获取未读邮件
Message[] messages = folder.search(ft);
/*
* Folder.READ_ONLY:只读权限 Folder.READ_WRITE:可读可写(可以修改邮件的状态)
*/
// System.out.println("未读邮件数: " + folder.getUnreadMessageCount());
//
// // 由于POP3协议无法获知邮件的状态,所以下面得到的结果始终都是为0
// System.out.println("删除邮件数: " + folder.getDeletedMessageCount());
// System.out.println("新邮件: " + folder.getNewMessageCount());
//
// // 获得收件箱中的邮件总数
// System.out.println("邮件总数: " + folder.getMessageCount());
//
// // 得到收件箱中的所有邮件,并解析
parseMessage(messages);
// 得到收件箱中的所有邮件并且删除邮件
// deleteMessage(messages);
// 释放资源
if (folder != null)
folder.close(true);
if (store != null)
store.close();
}
/**
* 解析邮件
*
* @param messages
* 要解析的邮件列表
*/
public static void parseMessage(Message... messages)
throws MessagingException, IOException {
boolean isMail=false;
// if (messages == null || messages.length < 1)
// throw new MessagingException("未找到要解析的邮件!");
// 解析所有邮件
for (int i = 0, count = messages.length; i < count; i++) {
MimeMessage msg = (MimeMessage) messages[i];
if (getSubject(msg).contains("发布BulkPO项目UAT环境")) {
isMail=true;
System.out.println("------------------解析第"
+ msg.getMessageNumber() + "封邮件-------------------- ");
System.out.println("主题: " + getSubject(msg));
System.out.println("发件人: " + getFrom(msg));
System.out.println("收件人:" + getReceiveAddress(msg, null));
System.out.println("发送时间:" + getSentDate(msg, null));
System.out.println("是否已读:" + isSeen(msg));
System.out.println("邮件优先级:" + getPriority(msg));
System.out.println("是否需要回执:" + isReplySign(msg));
System.out.println("邮件大小:" + msg.getSize() * 1024 + "kb");
boolean isContainerAttachment = isContainAttachment(msg);
System.out.println("是否包含附件:" + isContainerAttachment);
if (isContainerAttachment) {
File dir = new File(System.getProperty("user.dir")
+ "\\FILESTOMAIL\\");
judeDirExists(dir);
String fileName = (msg.getSubject()).replace("/", "_");
saveAttachment(msg, System.getProperty("user.dir")
+ "\\FILESTOMAIL\\" + fileName + "_" + i + "_"); // 保存附件
}
StringBuffer content = new StringBuffer(30);
getMailTextContent(msg, content);
System.out.println("邮件正文:"
+ (content.length() > 100 ? content.substring(0, 200)
+ "..." : content));
System.out.println("------------------第"
+ msg.getMessageNumber()
+ "封邮件解析结束-------------------- ");
System.out.println("版本号:" + getBulkVersion(content.toString()));
saveAsFileWriter(getBulkVersion(content.toString()));
//System.exit();
// curl -O
// http://devops-lab/share/package/com.walmart/bulkpo/bulkpo.war.7c48db4
}
}
if(!isMail){
System.out.println("未找到匹配的邮件! ");
}
}
/**
* 解析邮件
*
* @param messages
* 要解析的邮件列表
*/
public static void deleteMessage(Message... messages)
throws MessagingException, IOException {
if (messages == null || messages.length < 1)
throw new MessagingException("未找到要解析的邮件!");
// 解析所有邮件
for (int i = 0, count = messages.length; i < count; i++) {
/**
* 邮件删除
*/
Message message = messages[i];
String subject = message.getSubject();
// set the DELETE flag to true
message.setFlag(Flags.Flag.DELETED, true);
System.out.println("Marked DELETE for message: " + subject);
}
}
/**
* 获得邮件主题
*
* @param msg
* 邮件内容
* @return 解码后的邮件主题
*/
public static String getSubject(MimeMessage msg)
throws UnsupportedEncodingException, MessagingException {
return MimeUtility.decodeText(msg.getSubject());
}
/**
* 获得邮件发件人
*
* @param msg
* 邮件内容
* @return 姓名 <Email地址>
* @throws MessagingException
* @throws UnsupportedEncodingException
*/
public static String getFrom(MimeMessage msg) throws MessagingException,
UnsupportedEncodingException {
String from = "";
Address[] froms = msg.getFrom();
if (froms.length < 1)
throw new MessagingException("没有发件人!");
InternetAddress address = (InternetAddress) froms[0];
String person = address.getPersonal();
if (person != null) {
person = MimeUtility.decodeText(person) + " ";
} else {
person = "";
}
from = person + "<" + address.getAddress() + ">";
return from;
}
/**
* 根据收件人类型,获取邮件收件人、抄送和密送地址。如果收件人类型为空,则获得所有的收件人
* <p>
* Message.RecipientType.TO 收件人
* </p>
* <p>
* Message.RecipientType.CC 抄送
* </p>
* <p>
* Message.RecipientType.BCC 密送
* </p>
*
* @