一:邮件解析的介绍:首先说明的是我是使用的James搭建的邮件服务器,邮件的内容会存在数据库表字段中并且部分邮件是base64编码过后的内容,还有部分是直接返回一个网页内容(Twiter注册的时候返回的就是网页)。如下图所示
下图是 gb2312 base64编码及解码后的内容(0MK1xLLiytTE47XE0enWpMLrzqo0NTY3ODk=)
那么问题来了。我们是手动从数据库中复制的内容,到网页上的工具进行解码的,我们要通过java 代码的方式实现取出正文内容
下面分步骤一一介绍。
①导包:
<!--email相关的类-->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1</version>
</dependency>
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
②:写工具类方法
获取文件的正文内容
//获得邮箱的正文
private void getMailTextContent(Part part, StringBuffer content) throws MessagingException, IOException {
//如果是文本类型的附件,通过getContent方法可以取到文本内容,但这不是我们需要的结果,所以在这里要做判断
System.out.println("邮件的内容:——————" + part.getContentType());
boolean isContainTextAttach = part.getContentType().indexOf("name") > 0;
if (part.isMimeType("text/*") && !isContainTextAttach) {
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);
}
}
}
获取邮件的发送时间
//获取发发送的时间
private String getSentDate(MimeMessage msg, String pattern) throws MessagingException {
Date receivedDate = msg.getSentDate();
if (receivedDate == null)
return "";
if (pattern == null || "".equals(pattern))
pattern = "yyyy年MM月dd日 E HH:mm ";
return new SimpleDateFormat(pattern).format(receivedDate);
}
获取发件人的信息
//获得发件人的信息
private String getFrom(MimeMessage msg) throws MessagingException, UnsupportedEncodingException {
String from;
Address[] froms = msg.getFrom();
if (froms.length < 1)
throw new MessagingException("没有发件人!");
InternetAddress address = (InternetAddress) froms[0];
String person = address.getPersonal();
if (person != null) {
person = MimeUtility.decodeText(person) + " ";
} else {
person = "";
}
from = person + "<" + address.getAddress() + ">";
return from;
}
③调用方法获取邮件的正文内容:从代码的角度发现,这个是通过流的方式获取的。存入的参数是你自定义的实体类Email,并且通过查询将Email的中的messageBody的属性的值传入Mesage 构造方法中。这个messageBody就是数据库中字段对应的值,是byte数组
private String getContent(Email email) throws Exception {
StringBuffer content = new StringBuffer(300);
byte[] mailInfo = email.getMessageBody();
InputStream is = new ByteArrayInputStream(mailInfo);
Message message = new MimeMessage(null, is);
MimeMessage msg = (MimeMessage) message;
log.info("邮件的大小为———>{}", msg.getSize());
log.info("邮件接收时间———>{}", getSentDate(msg, null));
log.info("发件人地址———>{}", getFrom(msg));
getMailTextContent(msg, content);
log.info("邮件的正文———>{}", content);
log.info("邮件解析完成");
return content.toString();
}
④:使用junit4测试一下,其中上面代码块中的content 就是邮件的正文内容。
数据看中查询解码的内容为:
测试的代码,将上面的几个方法写在测试类中,作为工具方法使用。调用后的结果如下图所示。
数据库查询出来的数据,并且通过网页的工具进行解码操作
使用代码解析的打印内容如下.
至此邮件的解析就这么多。