java math meil_java来接收邮件并解析邮件正文中的表格

该DEMO展示了如何使用Java和Jsoup库从邮件中提取并解析第一个表格内容。通过处理邮件正文,提取表格行数据,并将其转换为特定实体类进行存储。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里是实际需求中的一个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;

/**

* 描述:把邮件转换成此类的一个实例进行处理

*/

/**

*

*

* javax.mail

* mail

* 1.4.7

*

*

*

*

* org.jsoup

* jsoup

* 1.12.1

*

*/

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 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 parseContent() throws MessagingException, ParseException {

List 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 +

'}';

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值