简单邮件的解析
昨天讲了邮件的发送(这是一个个人笔记,如果有人要参考的话,估计需要做大量的修改才行,但整体逻辑是不会错),既然有发送,肯定会有邮件的解析,那么今天大桥就再写一个例子程序,关于邮件怎么解析。
@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					
	
近期评论