java使用javax.mail实现数据库中邮件的解析

 一:邮件解析的介绍:首先说明的是我是使用的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 就是邮件的正文内容。

数据看中查询解码的内容为:

测试的代码,将上面的几个方法写在测试类中,作为工具方法使用。调用后的结果如下图所示。

数据库查询出来的数据,并且通过网页的工具进行解码操作 

使用代码解析的打印内容如下.

至此邮件的解析就这么多。

Java读取电子邮件附件通常涉及到使用一些第三方库,如JavaMail API和Apache POI等,它们可以帮助处理邮件通信和文件操作。以下是基本步骤: 1. 引入所需库:首先需要在项目导入JavaMail API(用于处理邮件)、javax.activation.*(用于处理数据流)以及相关的邮件解析库,例如如果附件是PDF、Word文档等,可能还需要Poi库。 ```java import javax.mail.*; import javax.mail.internet.MimeMessage; import javax.activation.DataHandler; import java.io.InputStream; ``` 2. 连接邮箱:使用邮箱地址和密码创建Session实例,并指定SMTP服务器和其他设置。 ```java Properties props = System.getProperties(); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true"); Session session = Session.getInstance(props, new Authenticator() { // 实现Authentication过程... }); ``` 3. 获取邮件使用Session获取邮件Store并打开Folder,然后搜索特定邮件。 ```java Store store = session.getStore("imaps"); // 使用imap或pop3协议 store.connect(...); // 连接到邮箱服务器 Folder folder = store.getFolder("INBOX"); // 或者自定义的邮件夹 folder.open(Folder.READ_ONLY); Message[] messages = folder.getMessageCount() > 0 ? folder.getMessages() : null; ``` 4. 遍历邮件并提取附件:遍历邮件数组,找到包含附件的消息,然后获取DataHandler对象并读取附件内容。 ```java for (Message message : messages) { if (message.isMimeType("multipart")) { // 处理多部分邮件,如包含多个附件 Multipart multipart = (Multipart) message.getContent(); for (int i = 0; i < multipart.getCount(); i++) { BodyPart part = multipart.getBodyPart(i); if (part.getDataHandler() != null) { DataHandler handler = part.getDataHandler(); InputStream inputStream = handler.getInputStream(); // 读取并处理附件... } } } else { if (message.getDataHandler() != null) { DataHandler handler = message.getDataHandler(); InputStream inputStream = handler.getInputStream(); // 读取单个附件... } } } ``` 5. 关闭资源:记得关闭所有已打开的输入流、邮件Store和Folder。 ```java inputStream.close(); folder.close(); store.close(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值