Java读取邮件内容

该文章详细描述了一个使用Spring框架编写的Java服务,用于通过IMAP协议从邮箱接收未读邮件,包括邮件主题、发件人和收件人信息,并将邮件标记为已读。

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


import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.search.FlagTerm;

import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.Properties;

@Service
public class MailReceiverService {
    private Session session; // 邮件会话对象
    private Properties props; // 系统属性

    public void receiveEmail() throws MessagingException, IOException {
        if (session == null) {
            initSession();
        }

        // 连接到邮件服务器
        Store store = session.getStore("imap"); // 使用IMAP协议
        store.connect((String)props.get("mail.imap.host"), (String)props.get("username"), (String)props.get("password"));

        // 打开收件箱
        Folder inbox = store.getFolder("INBOX");
        // 读写模式,以便标记邮件为已读
        inbox.open(Folder.READ_WRITE);

        // 添加过滤 只取未读的
        Flags seen = new Flags(Flags.Flag.SEEN);
        FlagTerm unseenFlagTerm = new FlagTerm(seen, false);

        // 获取未读邮件
        Message[] messages = inbox.search(unseenFlagTerm);

        // 逐个处理邮件
        for (Message message : messages) {
            System.out.println("Subject: " + message.getSubject());
            System.out.println("From: " + InternetAddress.toString(message.getFrom()));
            System.out.println("To: " + InternetAddress.toString(message.getRecipients(Message.RecipientType.TO)));

            // 读取邮件内容
            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().startsWith("text/plain")) {
                        System.out.println("Content: " + bodyPart.getContent());
                    }
                }
            } else if (content instanceof String) {
                System.out.println("Content: " + content);
            }
            // 标记邮件为已读
            message.setFlag(Flags.Flag.SEEN, true);
            System.out.println("---------------------------------------");
        }

        // 关闭连接
        inbox.close(false);
        store.close();
    }

    private void initSession() {
        props = System.getProperties();
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.host", "smtp.**");
        props.put("mail.smtp.port", "**");
        props.put("mail.imap.host", "imap**"); // IMAP服务器地址 用来接收邮件的
        props.put("mail.imap.port", "**"); // IMAP端口号
        props.put("username", ""); // 自己的用户名
        props.put("password", ""); // 自己的密码

        session = Session.getDefaultInstance(props, null);
        session.setDebug(true);
    }


}

<think>好的,我现在需要帮助用户解决如何用Java获取邮件内容的问题。用户想要一个API示例,所以我得先回想一下Java中处理邮件的相关库。 首先,Jakarta Mail(以前是JavaMail)是处理邮件的主流API。根据用户提供的引用[3],他们提到了jakarta.mail-api和angus-activation的实现。所以应该使用Jakarta Mail的依赖,并且需要配置正确的实现,比如Angus。 接下来,用户需要获取邮件内容邮件内容可能包括正文、附件等。通常的步骤是连接到邮件服务器,读取收件箱中的邮件,然后解析邮件内容。需要用到Session、Store、Folder这些类。引用[1]提到使用MimeMessage类,这可能和读取邮件内容有关。 然后,代码示例的结构应该是怎样的呢?首先建立会话,设置属性如主机名、端口、协议。然后连接到Store,打开收件箱的Folder。获取邮件列表后,遍历每封邮件,提取主题、发件人、正文等内容。对于HTML内容,可能需要检查MIME类型,并处理多部分内容。 需要注意的是异常处理,比如关闭连接时的try-catch块,以及正确关闭Folder和Store。引用[2]中的服务器地址可能需要替换为用户实际的邮箱服务器,比如IMAP的地址。 另外,引用[4]中的签名和认证部分可能涉及到安全连接,比如使用SSL,所以在代码中需要设置相应的属性,如mail.imap.ssl.enable为true。 最后,确保代码示例中的占位符被正确替换,比如主机、端口、用户名和密码。同时提醒用户处理可能的异常和依赖配置,参考引用[3]中的依赖配置,避免运行时错误。</think>以下是使用JavaMail API获取邮件内容的示例代码及分步说明: ### 步骤1:添加依赖 ```xml <dependency> <groupId>jakarta.mail</groupId> <artifactId>jakarta.mail-api</artifactId> <version>2.1.2</version> </dependency> <dependency> <groupId>org.eclipse.angus</groupId> <artifactId>angus-activation</artifactId> <version>2.0.2</version> </dependency> ``` ### 步骤2:建立邮件会话 ```java Properties props = new Properties(); props.put("mail.store.protocol", "imaps"); // 使用IMAP协议 props.put("mail.imap.host", "imap.example.com"); // 邮箱服务器地址[^2] props.put("mail.imap.port", "993"); props.put("mail.imap.ssl.enable", "true"); Session session = Session.getInstance(props); ``` ### 步骤3:读取邮件内容 ```java try (Store store = session.getStore()) { store.connect("your_email@example.com", "password"); // 邮箱账号密码 try (Folder inbox = store.getFolder("INBOX")) { inbox.open(Folder.READ_ONLY); Message[] messages = inbox.getMessages(); for (Message message : messages) { // 获取邮件基本信息 String subject = message.getSubject(); Address[] from = message.getFrom(); // 解析邮件内容 Object content = message.getContent(); if (content instanceof String) { System.out.println("文本内容:" + content); } else if (content instanceof MimeMultipart) { MimeMultipart multipart = (MimeMultipart) content; for (int i=0; i<multipart.getCount(); i++) { BodyPart bodyPart = multipart.getBodyPart(i); if (bodyPart.isMimeType("text/plain")) { System.out.println("纯文本正文:" + bodyPart.getContent()); } else if (bodyPart.isMimeType("text/html")) { System.out.println("HTML正文:" + bodyPart.getContent()); } } } } } } ``` ### 关键API说明 1. `MimeMessage`: 表示MIME格式的邮件对象[^1] 2. `Message.getContent()`: 获取邮件内容,可能返回字符串或多部分内容 3. `MimeMultipart`: 处理包含附件或多格式的邮件内容 4. `BodyPart`: 邮件的组成部分(正文/附件) ### 注意事项 1. IMAP协议需使用SSL加密连接[^2] 2. 附件处理需要检查`BodyPart`的`Disposition`属性 3. 大邮件建议分批次获取消息,避免内存溢出 4. 支持通过`UIDFolder`接口获取唯一标识符实现增量同步
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值