如何读取邮件正文中的文字

2025/03/13

1. 简介

在本教程中,我们将探索如何使用Java读取电子邮件正文中的文本。我们将使用JavaMail API连接到电子邮件服务器、检索电子邮件并读取电子邮件正文中的文本。

2. 设置

在开始之前,我们需要将jakarta.mail依赖项添加到我们的pom.xml文件中:

<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>jakarta.mail-api</artifactId>
    <version>2.0.1</version>
</dependency>

JavaMail API是一组类和接口,它们提供了使用Java读取和发送电子邮件的框架。该库允许我们处理与电子邮件相关的任务,例如连接到电子邮件服务器和读取电子邮件内容。

3. 连接到电子邮件服务器

要连接到电子邮件服务器,我们需要创建一个Session对象,该对象充当我们应用程序的邮件会话。此会话使用Store对象与电子邮件服务器建立连接

以下是我们如何设置JavaMail API并连接到电子邮件服务器:

// Set up the JavaMail API
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.port", "587");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");

Session session = Session.getInstance(props, new Authenticator() {
    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication("your_email", "your_password");
    }
});

// Connect to the email server
try (Store store = session.getStore("imaps")){
    store.connect("imap.gmail.com", "your_email", "your_password");

    // ...
} catch (MessagingException e) {
    // handle exception
}

首先,我们为邮件会话配置属性,其中包含有关SMTP服务器的详细信息,包括主机、端口、身份验证和TLS设置。然后,我们使用这些属性创建一个Session对象和一个提供电子邮件地址和密码进行身份验证的Authenticator对象。

Authenticator对象用于向电子邮件服务器进行身份验证,并返回带有电子邮件地址和密码的PasswordAuthentication对象。一旦我们有了Session对象,我们就可以使用getStore()方法连接到电子邮件服务器,该方法返回一个Store对象。我们使用try-with-resources来管理Store对象,这可确保在我们用完后自动关闭Store。

4. 检索电子邮件

成功连接到电子邮件服务器后,下一步是从收件箱中检索电子邮件。这涉及使用Folder类访问inbox文件夹,然后获取其中包含的电子邮件

以下是我们从inbox文件夹中检索电子邮件的方法:

//... (same code as above to connect to email server)

// Open the inbox folder
try (Folder inbox = store.getFolder("inbox")){
    inbox.open(Folder.READ_ONLY);

    // Retrieve emails from the inbox
    Message[] messages = inbox.getMessages();

} catch (MessagingException e) {
    // handle exception
}

我们使用Store对象获取代表收件箱的Folder实例,getFolder(“inbox”)方法访问收件箱文件夹。然后我们使用Folder.READ_ONLY以只读模式打开此文件夹,这样我们就可以读取电子邮件而不做任何更改

getMessages()方法获取收件箱文件夹中的所有消息,这些消息存储在Message对象数组中。

5. 读取电子邮件内容

一旦我们有了消息对象数组,我们就可以遍历它们来访问每封电子邮件。要读取每封电子邮件的内容,我们需要使用Message类及其相关类,例如Multipart和BodyPart。

以下是如何读取电子邮件内容的示例:

void retrieveEmails() throws MessagingException {
    // ... connection and open inbox folder

    for (Message message : messages) {
        try {
            Object content = message.getContent();

            if (content instanceof Multipart) {
                Multipart multipart = (Multipart) content;

                for (int i = 0; i < multipart.getCount(); i++) {
                    BodyPart bodyPart = multipart.getBodyPart(i);
                    if (bodyPart.getContentType().toLowerCase().startsWith("text/plain")) {
                        plainContent = (String) bodyPart.getContent();
                    } else if (bodyPart.getContentType().toLowerCase().startsWith("text/html")) {
                        // handle HTML content
                    } else {
                       // handle attachement
                    }
                }
            } else {
                plainContent = (String) content;
            }
        } catch (IOException | MessagingException e) {
            // handle exception
        }
    }
}

在此示例中,我们遍历数组中的每个Message对象,并使用getContent()方法获取其内容。此方法返回一个Object,可以是纯文本的String或包含多个部分的电子邮件的Multipart。

如果内容是String的实例,则表明电子邮件是纯文本格式,我们可以简单地将内容转换为String。否则,如果内容是Multipart对象,我们需要分别处理每个部分,我们使用getCount()方法遍历各个部分并进行相应的处理。

对于Multipart中的每个BodyPart,我们使用getContentType()方法检查其内容类型。如果正文部分是文本部分,我们使用getContent()方法获取其内容并检查它是纯文本还是HTML内容,然后我们可以相应地处理文本内容。否则,我们将其作为附件文件处理。

6. 处理HTML内容

除了纯文本和附件,邮件正文还可以包含HTML内容。为了处理HTML内容,我们可以使用Jsoup等库来解析HTML并提取文本内容

下面是一个如何使用Jsoup处理HTML内容的示例:

try (InputStream inputStream = bodyPart.getInputStream()) {
    String htmlContent = new String(inputStream.readAllBytes(), "UTF-8");     
    Document doc = Jsoup.parse(htmlContent);     
    htmlContent = doc.text();
} catch (IOException e) {
    // Handle exception
}

在这个例子中,我们使用Jsoup来解析HTML内容,并提取文本内容,然后我们对文本内容进行必要的处理。

7. 嵌套MultiPart

在JavaMail中,一个Multipart对象可以包含另一个Multipart对象,这称为嵌套多部分消息。为了处理这种情况,我们需要使用递归这种方法允许我们遍历整个嵌套结构并从每个部分中提取文本内容

首先,我们创建一个方法来获取Message对象的内容:

String extractTextContent(Message message) throws MessagingException, IOException {
    Object content = message.getContent();
    return getTextFromMessage(content);
}

接下来,我们创建一个方法来处理content对象。如果内容是Multipart,我们将遍历每个BodyPart并递归地从每个部分提取内容。否则,如果content是纯文本,我们直接将文本附加到StringBuilder

String getTextFromMessage(Object content) throws MessagingException, IOException {
    if (content instanceof Multipart) {
        Multipart multipart = (Multipart) content;
        StringBuilder text = new StringBuilder();
        for (int i = 0; i < multipart.getCount(); i++) {
            BodyPart bodyPart = multipart.getBodyPart(i);
            text.append(getTextFromMessage(bodyPart.getContent()));
        }
        return text.toString();
    } else if (content instanceof String) {
        return (String) content;
    }
    return "";
}

8. 测试

在本节中,我们通过发送包含三部分的电子邮件来测试retrieveEmails()方法:纯文本内容和HTML内容:

在测试方法中,我们检索电子邮件并验证是否从电子邮件中正确读取和提取了纯文本内容和HTML内容:

EmailService es = new EmailService(session);
es.retrieveEmails();
assertEquals("This is a text body", es.getPlainContent());
assertEquals("This is an HTML body", es.getHTMLContent());

9. 总结

在本教程中,我们学习了如何使用Java从电子邮件正文中读取文本。我们讨论了设置JavaMail API、连接到电子邮件服务器以及提取电子邮件内容。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章