简单邮件的解析
昨天讲了邮件的发送(这是一个个人笔记,如果有人要参考的话,估计需要做大量的修改才行,但整体逻辑是不会错),既然有发送,肯定会有邮件的解析,那么今天大桥就再写一个例子程序,关于邮件怎么解析。
@Service("parseMailService")
public class ParseMailServiceImpl {
private static final Logger LOG = LoggerFactory.getLogger(ParseMailServiceImpl.class);
private static final String[] flagOfMailEnds = {"<DIV><BR></DIV>", "From:<", "From: <", "Sent: ", "Kind regards,",
"Kind Regards,", "Best regards,", "Best Regards,", "Kind regards,", "Regards,", "Thanks",
"----- Original Message -----", "> -------------", "---------------"};
private static final String[] flagOfMailStarts = {"Hi,", "</HEAD>"};
private static final String[] regExHtmls = {"<[^>]+>", "<[^>]+"};
@Autowired
private MailServerService mailServerService;
public void parseMail() throws Exception {
LOG.info("==Start parse Mail==");
Session session = mailServerService.getSession();
Store store = session.getStore(“pop3”);
store.connect(MAIL_SERVER_HOST, MAIL_ADDRESS, MAIL_SERVER_PASSWORD);
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_WRITE);
Message[] messages = folder.getMessages();
int mailNo = Integer.parseInt((String) execution.getVariable(SystemConstant.MAIL_NO));
Message message = messages[mailNo];
Map<String, String> contents = parseMessage(message);
message.setFlag(Flags.Flag.DELETED, true);
// message.saveChanges();
mailServerService.closeConn(folder, store);
LOG.info("==Mail parse success, this mail from: " + contents.get("user") + "==");
}
private String splitContentBySpecialCharacter(String context) {
// Remove mail bottom
for (String flagOfMailEnd : flagOfMailEnds) {
int endIndex = context.indexOf(flagOfMailEnd);
if (endIndex > -1) {
context = context.substring(0, endIndex);
}
}
// Remove mail top
for (String flagOfMailStart : flagOfMailStarts) {
int startIndex = context.indexOf(flagOfMailStart);
if (startIndex > -1) {
context = context.substring(startIndex + flagOfMailStart.length());
}
}
// Filter the HTML tags
for (String regExHtml : regExHtmls) {
Pattern p_html = Pattern.compile(regExHtml, Pattern.CASE_INSENSITIVE);
Matcher m_html = p_html.matcher(context);
context = m_html.replaceAll("");
}
context.replaceAll(" ", "");
// Filter "rn"
Pattern CRLF1 = Pattern.compile("(rn|r|n|nr){3,}");
Matcher m1 = CRLF1.matcher(context);
context = m1.replaceAll("");
Pattern CRLF = Pattern.compile("(rn|r|n|nr)");
Matcher m = CRLF.matcher(context);
context = m.replaceAll(" ");
return context;
}
public Map<String, String> parseMessage(Message message) throws MessagingException, IOException {
Map<String, String> contents = new HashMap<String, String>();
StringBuffer content = new StringBuffer(300);
content = getMailTextContent(message, content);
contents.put("comment", splitContentBySpecialCharacter(content.toString()));
return contents;
}
public StringBuffer getMailTextContent(Part part, StringBuffer content) throws MessagingException, IOException {
boolean isContainTextAttach = part.getContentType().indexOf("name") > 0;
if (part.isMimeType("text/*") && !isContainTextAttach) {
if (content.length() > 0) {
content.setLength(0);
}
content.append(part.getContent().toString());
} else if (part.isMimeType("message/rfc822")) {
getMailTextContent((Part) part.getContent(), content);
} else if (part.isMimeType("multipart/*")) {
Multipart multipart = (Multipart) part.getContent();
int partCount = multipart.getCount();
for (int i = 0; i < partCount; i++) {
BodyPart bodyPart = multipart.getBodyPart(i);
getMailTextContent(bodyPart, content);
}
}
return content;
}
}
@Service("mailServerService")
public class MailServerServiceImpl implements MailServerService {
private static final Logger LOG = LoggerFactory.getLogger(MailServerServiceImpl.class);
@Override
public Session getSession() {
Properties props = System.getProperties();
props.put("mail.smtp.port", 25);
Session session = Session.getDefaultInstance(props);
return session;
}
@Override
public void closeConn(Folder folder, Store store) {
try {
if (null != folder) {
folder.close(true);
}
if (null != store) {
store.close();
}
} catch (MessagingException e) {
LOG.error("Close connection fail with mail server", e);
}
}
}
全文完,如果本文对您有所帮助,请花 1 秒钟帮忙点击一下广告,谢谢。
作 者: BridgeLi,https://www.bridgeli.cn
原文链接:http://www.bridgeli.cn/archives/29
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
作 者: BridgeLi,https://www.bridgeli.cn
原文链接:http://www.bridgeli.cn/archives/29
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
分类: Java
近期评论