You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Java打开Gmail收件中的PDF附件并提取用户ID

实现Java读取Gmail邮件PDF附件并提取用户ID

嘿,我看你已经用Java Mail API搞定了Gmail收件箱的邮件读取功能,接下来要扩展处理PDF附件、从中提取用户ID的需求对吧?下面我就把具体的实现步骤和代码给你整理好:

第一步:添加必要的依赖

除了你已经用到的Java Mail API,还需要一个PDF处理库,这里推荐用Apache PDFBox——它是处理PDF文本提取的常用工具。如果用Maven的话,把下面的依赖加到你的pom.xml里:

<!-- Java Mail API -->
<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>
<!-- Apache PDFBox 用于PDF文本提取 -->
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.32</version>
</dependency>

第二步:扩展邮件读取代码,处理PDF附件

在你现有的读取邮件逻辑里,需要添加对多部分邮件(带附件的邮件)的处理逻辑。下面是整合后的完整代码示例,关键部分我都标出来了:

import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Multipart;
import javax.mail.BodyPart;
import javax.mail.Part;
import java.io.InputStream;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class GmailPDFExtractor {
    public static void main(String[] args) {
        // 邮箱配置
        String host = "imap.gmail.com";
        String mailStoreType = "imap";
        String username = "your-gmail-address@gmail.com";
        String password = "your-app-password"; // 注意:Gmail需要用应用专用密码,不是普通登录密码

        Properties properties = new Properties();
        properties.put("mail.imap.host", host);
        properties.put("mail.imap.port", "993");
        properties.put("mail.imap.starttls.enable", "true");

        // 创建会话
        Session session = Session.getInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
            }
        });

        try {
            // 连接邮箱存储
            Store store = session.getStore(mailStoreType);
            store.connect(host, username, password);

            // 打开收件箱
            Folder inbox = store.getFolder("INBOX");
            inbox.open(Folder.READ_ONLY);

            // 获取所有邮件
            Message[] messages = inbox.getMessages();
            System.out.println("Total Messages: " + messages.length);

            // 遍历邮件
            for (Message message : messages) {
                System.out.println("\n---------------------------------");
                System.out.println("Subject: " + message.getSubject());
                System.out.println("From: " + message.getFrom()[0]);

                // 处理邮件内容,检查是否是多部分(带附件)
                if (message.getContent() instanceof Multipart) {
                    Multipart multipart = (Multipart) message.getContent();

                    // 遍历所有邮件部分
                    for (int i = 0; i < multipart.getCount(); i++) {
                        BodyPart bodyPart = multipart.getBodyPart(i);

                        // 判断是否是PDF附件
                        if (Part.ATTACHMENT.equalsIgnoreCase(bodyPart.getDisposition()) &&
                            bodyPart.getFileName().toLowerCase().endsWith(".pdf")) {
                            System.out.println("找到PDF附件: " + bodyPart.getFileName());

                            // 提取PDF中的用户ID
                            String userId = extractUserIdFromPDF(bodyPart.getInputStream());
                            if (userId != null) {
                                System.out.println("提取到的用户ID: " + userId);
                            } else {
                                System.out.println("未在PDF中找到用户ID");
                            }
                        }
                    }
                }
            }

            // 关闭资源
            inbox.close(false);
            store.close();

        } catch (NoSuchProviderException e) {
            e.printStackTrace();
        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 从PDF输入流中提取用户ID的方法
    private static String extractUserIdFromPDF(InputStream pdfInputStream) {
        String userId = null;
        // 这里假设用户ID是类似 USER-123456 这样的格式,你可以根据实际情况调整正则表达式
        Pattern userIdPattern = Pattern.compile("USER-\\d+");

        try (PDDocument document = PDDocument.load(pdfInputStream)) {
            PDFTextStripper pdfStripper = new PDFTextStripper();
            String pdfText = pdfStripper.getText(document);

            // 匹配用户ID
            Matcher matcher = userIdPattern.matcher(pdfText);
            if (matcher.find()) {
                userId = matcher.group();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return userId;
    }
}

关键注意事项

  • Gmail应用专用密码:如果你开启了两步验证,必须使用Google账号的应用专用密码来登录,而不是普通登录密码。可以在Google账号的安全设置里生成。
  • 正则表达式调整:extractUserIdFromPDF方法里的正则是示例,你需要根据PDF里用户ID的实际格式修改,比如如果是纯数字ID,就改成\\d{6,}(匹配6位以上数字)之类的。
  • 资源管理:代码里用了try-with-resources自动关闭PDF文档,避免资源泄漏。

内容的提问来源于stack exchange,提问作者Mohit Tyagi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:10:45