这里是实际需求中的一个DEMO

有一部分内容进行了注释和处理,参考需要修改成自己的实际参数。另这个是对于实际一个场景的案例并不是通用解决的工具类。

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements; 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.URLName;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties; import static java.lang.System.out; /**
* 描述:把邮件转换成此类的一个实例进行处理
*/ /**
* <!-- https://mvnrepository.com/artifact/javax.mail/javax.mail-api -->
* <dependency>
* <groupId>javax.mail</groupId>
* <artifactId>mail</artifactId>
* <version>1.4.7</version>
* </dependency>
* <p>
* <!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
* <dependency>
* <groupId>org.jsoup</groupId>
* <artifactId>jsoup</artifactId>
* <version>1.12.1</version>
* </dependency>
*/
public class ReceiveOneMail { /**
* 邮件信息
*/
private MimeMessage mimeMessage;
/**
* 邮件正文内容
*/
private StringBuffer bodyText = new StringBuffer(); public ReceiveOneMail(MimeMessage mimeMessage) {
this.mimeMessage = mimeMessage;
} /**
* main测试方法
*/
public static void main(String args[]) throws Exception { Message[] messages = testInit(); ReceiveOneMail pmm = null;
// 循环测试邮件的收件箱邮件【时间倒序】
for (int i = messages.length; i >= 0; i--) {
// // 构建 ReceiveOneMail 实例
pmm = new ReceiveOneMail((MimeMessage) messages[i]);
out.println("---------" + pmm.getSubject() + "--------");
pmm.getMailContent((Part) messages[i]);
List<MailContentTableInfo> list = pmm.parseContent();
// 模拟输出解析结果
for (MailContentTableInfo mailContentTableInfo :
list) {
out.println(mailContentTableInfo.toString());
}
}
} /**
* 初始化构建一个连接邮箱的信息进行测试
*
* @return 一个数组邮件信息
* @throws MessagingException 邮件信息异常
*/
public static Message[] testInit() throws MessagingException {
Properties props = System.getProperties();
props.put("mail.pop3.host", "【实际值】");
Session session = Session.getDefaultInstance(props, null);
URLName url = new URLName("pop3", "【实际值】", 110, null,
"【邮箱地址】", "【邮箱密码】");
Store store = session.getStore(url);
store.connect();
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
return folder.getMessages();
} /**
* 处理邮件中的正文,解析出里面的表格【第一个表格】
* 按照【委托资金划拨】的规则进行解析并实例化为一组MailContentTableInfo
*/
public List<MailContentTableInfo> parseContent() throws MessagingException, ParseException {
List<MailContentTableInfo> list = new ArrayList<>();
Document doc = Jsoup.parse(this.getBodyText());
// 处理匹配到的第一个 table 表格,并且获得表格中的所有行
Elements rows = doc.select("table").get(0).select("tr");
Elements firstRowCols = rows.get(0).select("td");
Elements lastRowCols = rows.get(rows.size() - 1).select("td");
// 处理整个表格的业务时间
String transferDate = evalTransferDate(rows.get(1).select("td").get(0).text());
for (int i = 1; i < firstRowCols.size(); i++) {
MailContentTableInfo mailContentTableInfo = new MailContentTableInfo();
mailContentTableInfo.setMailDate(this.getSentDate());
mailContentTableInfo.setTransferDate(transferDate);
mailContentTableInfo.setProductName(firstRowCols.get(i).text().replace(" ", ""));
mailContentTableInfo.setTransferAmount(new BigDecimal(lastRowCols.get(i).text().replace(",", "")));
list.add(mailContentTableInfo);
}
return list;
} /**
* 处理表格中的业务日期,和邮件发送时间的年份拼接成8位的字符日期;
* 原有表格中的日期是 6月2日这种,所以需要特殊处理。
*/
private String evalTransferDate(String transferDateText) throws MessagingException {
String[] transferMonthDate = transferDateText.split("月");
String month = transferMonthDate[0].length() == 1 ? "0" + transferMonthDate[0] : transferMonthDate[0];
String[] transferDayDate = transferMonthDate[1].split("日");
String day = transferDayDate[0].length() == 1 ? "0" + transferDayDate[0] : transferDayDate[0];
return this.getSentYearDate() + month + day;
} /**
* 获得邮件发送日期
*/
private String getSentDate() throws MessagingException {
return new SimpleDateFormat("yyyyMMdd").format(mimeMessage.getSentDate());
} /**
* 获得邮件发送年
*/
private String getSentYearDate() throws MessagingException {
return this.getSentDate().substring(0, 4);
} /**
* 获得当前邮件主题
*/
private String getSubject() throws MessagingException, UnsupportedEncodingException {
String subject = MimeUtility.decodeText(mimeMessage.getSubject());
return subject == null ? "" : subject;
} /**
* 获得邮件正文内容
*/
private String getBodyText() {
return bodyText.toString();
} /**
* 解析邮件,把得到的邮件内容保存到一个StringBuffer对象中,解析邮件 主要是根据MimeType类型的不同执行不同的操作,一步一步的解析
*/
private void getMailContent(Part part) throws Exception {
String contentType = part.getContentType();
int nameIndex = contentType.indexOf("name");
boolean conName = false;
if (nameIndex != -1) {
conName = true;
}
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 counts = multipart.getCount();
for (int i = 0; i < counts; i++) {
getMailContent(multipart.getBodyPart(i));
}
} else if (part.isMimeType("message/rfc822")) {
getMailContent((Part) part.getContent());
}
}
} /**
* 定义解析邮件表格内容后的实体类
*/
class MailContentTableInfo { private String col1;
private String col2;
private String col3;
private BigDecimal col4; public String getMailDate() {
return col1;
} public void setMailDate(String mailDate) {
this.col1 = mailDate;
} public String getProductName() {
return col3;
} public void setProductName(String productName) {
this.col3 = productName;
} public BigDecimal getTransferAmount() {
return col4;
} public void setTransferAmount(BigDecimal transferAmount) {
this.col4 = transferAmount;
} public String getTransferDate() {
return col2;
} public void setTransferDate(String transferDate) {
this.col2 = transferDate;
} @Override
public String toString() {
return "MailContentTableInfo{" +
"col1=" + col1 +
", col2=" + col2 +
", col3='" + col3 + '\'' +
", col4=" + col4 +
'}';
}
}

java来接收邮件并解析邮件正文中的表格的更多相关文章

  1. 使用Java POI来选择提取Word文档中的表格信息

    通过使用Java POI来提取Word(1992)文档中的表格信息,其中POI支持不同的ms文档类型,在具体操作中需要注意.本文主要是通过POI来提取微软2003文档中的表格信息,具体code如下(事 ...

  2. python之poplib模块下载并解析邮件

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之poplib模块下载并解析邮件 #https://github.com/michaelliao ...

  3. python3接收、解析邮件

    邮件接收 python3可以使用poplib.POP3进行邮件接收,具体如下: import poplib from email.parser import Parser def get_email( ...

  4. JavaMail入门第五篇 解析邮件

    上一篇JavaMail入门第四篇 接收邮件中,控制台打印出的内容,我们无法阅读,其实,让我们自己来解析一封复杂的邮件是很不容易的,邮件里面格式.规范复杂得很.不过,我们所用的浏览器内置了解析各种数据类 ...

  5. javamail 收邮件并解析附件

    package com.zz.mail; import java.io.*; import java.text.*; import java.util.*; import javax.mail.*; ...

  6. java windows自动化-mail自动发邮件

    本文旨在让测试人员了解如何发邮件 发邮件的话,最简单的事是直接手动发邮件,但是在自动化测试中,应做到让机器或者代码来自动发送邮件,笔者大概了解以下几种方法,总有一款口味适合你:1java代码来做下面即 ...

  7. 【Java EE 学习 21 下】【使用java实现邮件发送、邮件验证】

    一.邮件发送 1.邮件发送使用SMTP协议或者IMAP协议,这里使用SMTP协议演示. SMTP协议使用的端口号:25 rfc821详细记载了该协议的相关信息 (1)使用telnet发送邮件(使用12 ...

  8. Python连载57- 邮件头和主题、解析邮件

    一.添加邮件头,抄送等信息 1.mail["From"]表示发送者信息,包括姓名和邮件 2.mail["To"]表示接收者信息,包括姓名和邮件地址 3.mail ...

  9. Java面试知识点总结及解析

    声明:有人说, 有些面试题很变态,个人认为其实是因为我们基础不扎实或者没有深入.本篇文章来自一位很资深的前辈对于最近java面试题目所做的总结归纳,有170道题目 ,知识面很广 ,而且这位前辈对于每个 ...

随机推荐

  1. SpringBoot整合Elastic-job(详细)

    一 作业分片1.分片概念作业分片是指任务的分布式执行,需要将一个任务拆分为多个独立的任务项,然后由分布式的应用实例分别执行某一个或几个分片项.例如:Elastic-Job快速入门中文件备份的例子,现有 ...

  2. python动态的添加方法

    1.动态的创建实例方法 1 class Person(object): 2 def __init__(self,name,age): 3 self.name = name 4 self.age =ag ...

  3. ABI与ARM,X86的概念

    Android系统目前支持以下七种不同的CPU架构:ARMv5,ARMv7 (从2010年起),x86 (从2011年起),MIPS (从2012年起),ARMv8,MIPS64和x86_64 (从2 ...

  4. 游戏2048的python实现

    前些日子被问了一下2048是如何实现,说实话当时没有想的特别清晰,所以回答的也比较混乱,后来仔细想想这个问题还是挺有趣的,简单的实现了一下 这个问题里面主要有两个问题,一个是移动时的计算,二是移动前对 ...

  5. html密码框value为空,但是总有默认密码(原)

    input输入框加属性:autocomplete="new-password" ,浏览器就不会给他填充默认密码. <input class="form-contro ...

  6. [CSP-S模拟测试]:城市游戏(图论+DP)

    题目传送门(内部题109) 输入格式 第一行,两个整数$n,m$. 接下来$m$行,每行三个整数$u,v,l$,描述了一条道路连接的两个路口的编号以及道路的长度. 输出格式 输出一行一个整数,为所求的 ...

  7. 20175215 2018-2019-2 第五周java课程学习总结

    第六章学习内容 1.接口 使用interface来定义一个接口. 接口体中包含常量的声明(没有变量)和抽象方法两部分.接口体中只有抽象方法,没有普通的方法,而且接口体中所有的常量的访问权限一定都是pu ...

  8. 套接字之select系统调用

    select是IO多路复用的一种方式,用来等待一个列表中的多个描述符的可读可写状态: SYSCALL_DEFINE5(select, int, n, fd_set __user *, inp, fd_ ...

  9. D3(没写完

    说在博客前 这篇博客有许多使用到 STL 的地方,由于本人实在是记不全,所以我也参考了北大的一些教材,就别说我黈力了 QwQ 数据结构 今天讲的是数据结构啦(也是我这个蒟蒻最喜欢的 一些天天见面的好盆 ...

  10. QBXTD2上午

    话说lyd昨天没讲完他的该死的贪心,所以今天继续讲 贪心思想是考虑AB是最快的人,CD是最慢的人,要把CD两个人送过河,只有两种方案,牵扯到四个人,并且n个规模的原问题化成了n-2个规模的子问题 那么 ...