pop3和imap读取邮箱

注意:

1. pop3只能读取inbox的,其它的需要imap读取。

2. SearchTerm过滤功能都是把邮件读取到本地,在本地过滤的。并不能实现在Mail Server上的过滤




import java.io.IOException;
import java.security.Security;
import java.util.ArrayList;
import java.util.Date;
import java.util.Properties;

import javax.annotation.Resource;
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.MimeMessage.RecipientType;
import javax.mail.internet.MimeUtility;
import javax.mail.search.AndTerm;
import javax.mail.search.BodyTerm;
import javax.mail.search.ComparisonTerm;
import javax.mail.search.FromStringTerm;
import javax.mail.search.OrTerm;
import javax.mail.search.SearchTerm;
import javax.mail.search.SentDateTerm;
import javax.mail.search.SubjectTerm;


import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;





@Service("MailService")
public class MailService {
private static final String emailAddr = "peering-ops@sina.com";
private static final String emailPs = "65A&u6x8";
private static final String[] ccEmail = { "xxx@sina.com" };
private static final String inBox = "INBOX";
private static final String sendBox = "已发送";
private static Logger logger = LogManager.getLogger("MailService");


private StringBuffer bodyCotent = new StringBuffer();
private String bodyText = "";


private Date filter_time;
private boolean filter_time_need = true;
private String filter_type;
private boolean filter_type_need = false;
private String filter_str;
private boolean filter_str_need = false;


@Resource(name = "mailSender")
private JavaMailSenderImpl mailSender;


public boolean sendMail(String title, String content, String[] sendTo,
String[] ccTo) {
try {
MimeMessage mailMessage = mailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(
mailMessage, "UTF-8");
messageHelper.setTo(sendTo);
if (null != ccTo) {
messageHelper.setCc(ccTo);
} else {
messageHelper.setCc(ccEmail);
}
messageHelper.setFrom("xxx@sina.com");
messageHelper.setSubject(title);
messageHelper.setText(content, false);
mailSender.send(mailMessage);
return true;


} catch (Exception e) {
logger.error("Mail send error. " + e.getMessage());
}
return false;
}


public ArrayList<JSONObject> readMail(String type, String filter,
Long dayBefore, String mailBox) {
filter_time = new Date(new Date().getTime() - dayBefore * 3600 * 24000);
filter_time_need = true;
filter_type = type;
if (false == IxpTools.isStringEmpty(filter_type)) {
filter_type_need = true;
}
filter_str = filter;
if (false == IxpTools.isStringEmpty(filter_str)) {
filter_str_need = true;
}
// mailBox=[INBOX,OUTBOX]
if (IxpTools.isStringEqual(inBox, mailBox)) {
return readMailBox(type, filter, dayBefore, true);
}
return readMailBox(type, filter, dayBefore, false);
}


private boolean match(Message message) {
try {
if (message.getReceivedDate().before(filter_time)) {
filter_time_need = false;
return false;
}


if (filter_type_need) {
if (false == message.getSubject().contains(filter_type)) {
return false;
}
}


if (filter_str_need) {
if (false == message.getSubject().contains(filter_str)) {
if (false == message.getContent().toString()
.contains(filter_str)) {
return false;
}
}
}
} catch (MessagingException | IOException ex) {
ex.printStackTrace();
}
return true;
}


@SuppressWarnings("restriction")
private ArrayList<JSONObject> readInBox(String type, String filter,
Long dayBefore) {
String host = "pop3.sina.com";// change accordingly
String mailStoreType = "pop3";
String username = "xxx@sina.com";
String password = "xxxx";
ArrayList<JSONObject> ret = new ArrayList<JSONObject>();
System.out.println("type=" + type + " filter=" + filter + " dayBefore="
+ dayBefore);
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
Properties props = new Properties();
props.setProperty("mail.pop3.host", host);
props.setProperty("mail.pop3.port", "995");
props.setProperty("mail.pop3.socketFactory.class", SSL_FACTORY);
props.setProperty("mail.pop3.socketFactory.port", "995");
props.setProperty("mail.pop3.socketFactory.fallback", "false");
props.setProperty("mail.store.protocol", "pop3");
props.setProperty("mail.pop3.auth", "true");


Session session = Session.getDefaultInstance(props);


try {
Store store = session.getStore(mailStoreType);
store.connect(username, password);
Folder folder = store.getFolder(inBox);
folder.open(Folder.READ_WRITE);


Folder defaultFolder = store.getDefaultFolder();
Folder[] allFolder = defaultFolder.list();
System.out.println("allFolder len=" + allFolder.length);
for (int i = 0; i < allFolder.length; i++) {// for time sequence
System.out.println("allFolder[" + i + "]="
+ allFolder[i].getFullName());
}


Date t1 = new Date(new Date().getTime() - dayBefore * 3600 * 24000);
SearchTerm comparisonTermGe = new SentDateTerm(ComparisonTerm.GE,
t1);
SearchTerm comparisonTermLe = new SentDateTerm(ComparisonTerm.LE,
new Date());
SearchTerm st = new AndTerm(comparisonTermGe, comparisonTermLe);


if (false == IxpTools.isStringEmpty(filter)) {
SearchTerm tmp = new OrTerm(new BodyTerm(filter),
new SubjectTerm(filter));
tmp = new OrTerm(new FromStringTerm(filter), tmp);
st = new AndTerm(st, tmp);
}


if (false == IxpTools.isStringEmpty(type)) {
st = new AndTerm(st, new SubjectTerm(type));
}
Message[] messages = folder.search(st);
System.out
.println("date filter messages.length=" + messages.length);
for (int i = messages.length - 1; i >= 0; i--) {// for time sequence
JSONObject ex = formatMail(messages[i], true);
if (null != ex) {
ret.add(ex);
}
}
// folder.close(true);
// store.close();
} catch (Exception e) {
e.printStackTrace();
}


return ret;
}


@SuppressWarnings("restriction")
private ArrayList<JSONObject> readMailBox(final String type,
final String filter, Long dayBefore, final boolean bInBox) {
String host = "imap.sina.com";// change accordingly
String mailStoreType = "imap";
String username = "xxx@sina.com";
String password = "xxx";
ArrayList<JSONObject> ret = new ArrayList<JSONObject>();
System.out.println("type=" + type + " filter=" + filter + " dayBefore="
+ dayBefore + " bInBox=" + bInBox);
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
Properties props = new Properties();
props.setProperty("mail.imap.host", host);
props.setProperty("mail.imap.port", "993");
// props.setProperty("mail.store.protocol", "imap");


props.setProperty("mail.imap.socketFactory.class", SSL_FACTORY);
props.setProperty("mail.imap.socketFactory.port", "993");
props.setProperty("mail.imap.socketFactory.fallback", "false");
// props.setProperty("mail.imap.auth", "true");


Session session = Session.getDefaultInstance(props);


try {
Store store = session.getStore(mailStoreType);
store.connect(username, password);
Folder folder;
if (bInBox) {
folder = store.getFolder(inBox);
} else {
folder = store.getFolder(sendBox);
}
folder.open(Folder.READ_WRITE);
final Date t1 = new Date(new Date().getTime() - dayBefore * 3600
* 24000);
@SuppressWarnings("serial")
SearchTerm searchCondition = new SearchTerm() {
@Override
public boolean match(Message message) {
try {
if (message.getReceivedDate().before(t1)) {
return false;
}


if (false == IxpTools.isStringEmpty(type)) {
if (false == message.getSubject().contains(type)) {
return false;
}
}


if (false == IxpTools.isStringEmpty(filter)) {
if (false == message.getSubject().contains(filter)) {
if (false == message.getContent().toString()
.contains(filter)) {
return false;
}
}
}
} catch (MessagingException | IOException ex) {
ex.printStackTrace();
}
return true;
}
};
// messages = folder.search(searchCondition); also in local
Message[] messages = folder.getMessages();
System.out.println("messages.length="+messages.length+" "+new Date().toLocaleString());
for (int i = messages.length - 1; i >= 0; i--) {// for time sequence
if (false == filter_time_need){
break;
}
if (match(messages[i])) {
JSONObject ex = formatMail(messages[i], bInBox);
if (null != ex) {
ret.add(ex);
}
}
}
System.out.println("ret.length="+ret.size()+" "+new Date().toLocaleString());
folder.close(false);
store.close();
} catch (Exception e) {
e.printStackTrace();
}


return ret;
}


private JSONObject formatMail(Message mx, boolean bRecv) {
JSONObject ret = new JSONObject();
ret.put("brcv", bRecv);
try {
String tmp = MimeUtility.decodeText(mx.getSubject());
ret.put("title", tmp);


Date sentDate = mx.getReceivedDate();
if (null == sentDate) {// very old one has no time
return null;
}
tmp = IxpTools.Date2Str(sentDate);
ret.put("time", tmp);


tmp = "";
InternetAddress[] senderAddr = (InternetAddress[]) mx.getFrom();
for (InternetAddress ax : senderAddr) {
if (IxpTools.isStringEqual(tmp, "")) {
tmp += ax.getAddress();
} else {
tmp += "," + ax.getAddress();
}
}
ret.put("sender", tmp);


tmp = "";
InternetAddress[] receiverAddr = (InternetAddress[]) mx
.getRecipients(RecipientType.TO);
for (InternetAddress ax : receiverAddr) {
if (IxpTools.isStringEqual(tmp, "")) {
tmp = ax.getAddress();
} else {
tmp += "," + ax.getAddress();
}
}
ret.put("receiver", tmp);


tmp = "";
InternetAddress[] ccAddr = (InternetAddress[]) mx
.getRecipients(RecipientType.CC);
if ((null != ccAddr) && (0 != ccAddr.length)) {
for (InternetAddress ax : ccAddr) {
if (IxpTools.isStringEqual(tmp, "")) {
tmp += ax.getAddress();
} else {
tmp += "," + ax.getAddress();
}
}
}
ret.put("ccreceiver", tmp);


getMailContent((Part) mx);
tmp = bodyCotent.toString();
ret.put("content", tmp);
ret.put("text", bodyText);
ret.put("isnew", isNew(mx));
} catch (Exception e) {
e.printStackTrace();
}
return ret;
}


private boolean isNew(Message mx) throws MessagingException {
/*
* Flags flags = mx.getFlags();
* System.out.println("seen="+mx.isSet(Flag.SEEN)); if
* (flags.contains(Flag.SEEN)) { return false; } flags.add(Flag.SEEN);
* mx.setFlags(flags, true); mx.saveChanges(); return true;
*/
return false;
}


private void getMailContent(Part part) throws Exception {
String contentType = part.getContentType();
int nameIndex = contentType.indexOf("name");
boolean conName = false;


bodyCotent = new StringBuffer();
if (nameIndex != -1) {
conName = true;
}
// multipart/*
// format=text/plain
// format=text/html
if (part.isMimeType("text/plain") && conName == false) {
bodyText = (String) part.getContent();
bodyCotent.append(bodyText);
} else if (part.isMimeType("text/html") && conName == false) {
bodyCotent.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")) {
System.out.println("message/rfc822");
getMailContent((Part) part.getContent());
} else {
logger.info("invalid email type=" + contentType);
bodyCotent.append((String) part.getContent());
}
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值