当前位置: 首页 > 知识库问答 >
问题:

使用JavaMail加快电子邮件检索

严稳
2023-03-14

目前,我的代码使用IMAP(imaps)和JavaMail访问我的Gmail收件箱,目的是阅读从最新到最旧发送给我自己的电子邮件,识别哪些电子邮件具有. zip或. xap格式的附件。如果找到,电子邮件的主题会显示出来,并询问我是否要下载附件。

如果我单击否,它会继续搜索。如果我单击是,它会调用createFolder方法来创建一个目录,将附件保存在那里,然后提取它。

问题:我收件箱中最近的一封电子邮件有一个. zip文件,因此可以很快找到它,但如果我单击“否”,则需要20秒以上才能找到下一封包含zip/xap的电子邮件,原因有2个:(1)有20封电子邮件最近(2)有2封电子邮件最近包含附件,但不是zip/xap。

我猜这是由于在识别附件的格式之前隔离附件所发生的递归,还是其他一些冗余代码/方法?我已经在这里和这里读到了Fetch概要文件可以帮助您,而不是不必要地联系服务器。

我希望能大大减少延误。取回/信封是正确的方法吗?我的代码是一堆乱七八糟的东西,还是您可以共享一个示例解决方案?非常感谢。

完整代码:

public class ReceiveMailImap {
    public ReceiveMailImap() {}

    public static void doit() throws MessagingException, IOException {
        Folder inbox = null;
        Store store = null;

        try {
            Properties props = System.getProperties();
            Session session = Session.getDefaultInstance(props, null);
            //session.setDebug(true);
            store = session.getStore("imaps");
            store.connect("imap.gmail.com", "myAccount@gmail.com", "myPassword");
            inbox = store.getFolder("Inbox");
            inbox.open(Folder.READ_WRITE);
            Message messages[] = inbox.getMessages();

            //  Loop newest to oldest
            for (int i = messages.length - 1; i >= 0; i--) {
                Message msg = messages[i];
                //If current msg has no attachment, skip.
                if (!hasAttachments(msg)) {
                    continue;
                }

                String from = "Sender Unknown";
                if (msg.getReplyTo().length >= 1) {
                    from = msg.getReplyTo()[0].toString();
                } else if (msg.getFrom().length >= 1) {
                    from = msg.getFrom()[0].toString();
                }
                subject = msg.getSubject();

                if (from.contains("myAccount@gmail.com")) {
                    //Get My Documents

                    subject = subject.replaceAll("[^a-zA-Z0-9.-]", "_");

                    //Call Save Attachment -->>
                    saveAttachment(msg.getContent());
                    msg.setFlag(Flags.Flag.SEEN, true);
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            if (inbox != null) {
                inbox.close(true);
            }
            if (store != null) {
                store.close();
            }
        }
    }

    public static boolean hasAttachments(Message msg) throws MessagingException, IOException {
        if (msg.isMimeType("multipart/mixed")) {
            Multipart mp = (Multipart) msg.getContent();
            if (mp.getCount() > 1) return true;
        }
        return false;
    }

    public static void saveAttachment(Object content)
    throws IOException, MessagingException {
        OutputStream out = null;
        InputStream in = null;
        try {
            if (content instanceof Multipart) {
                Multipart multi = ((Multipart) content);
                int parts = multi.getCount();
                for (int j = 0; j < parts; ++j) {
                    MimeBodyPart part = (MimeBodyPart) multi.getBodyPart(j);
                    if (part.getContent() instanceof Multipart) {
                        // part-within-a-part, do some recursion...
                        saveAttachment(part.getContent());
                    } else {
                        int allow = 0;

                        if (part.isMimeType("application/x-silverlight-app")) {
                            extension = "xap";
                            allow = 1;
                        } else {
                            if (part.isMimeType("application/zip")) {
                                extension = "zip";
                                allow = 1;
                            }
                        }
                        if (allow == 1) {
                            int dialogResult = JOptionPane.showConfirmDialog(null, "The most recent file is: " + subject + " Would you like to download this file?", "Question", 0);
                            if (dialogResult == JOptionPane.YES_OPTION) {
                                savePath = createFolder(subject) + "\\" + subject + "." + extension;
                            } else {
                                continue;
                            }
                            out = new FileOutputStream(new File(savePath)); in = part.getInputStream();
                            int k;
                            while ((k = in .read()) != -1) {
                                out.write(k);
                            }

                            //Unzip
                            savePath = savePath.toString();
                            Unzip unzipFile = new Unzip();
                            unzipFile.UnZipper(dir, savePath);
                        } else {
                            continue;
                        }
                    }
                }
            }
        } finally {
            if ( in != null) { in .close();
            }
            if (out != null) {
                out.flush();
                out.close();
            }
        }
    }

    public static File createFolder(String subject) {
        JFileChooser fr = new JFileChooser();
        FileSystemView myDocs = fr.getFileSystemView();
        String myDocuments = myDocs.getDefaultDirectory().toString();
        dir = new File(myDocuments + "\\" + subject);
        savePathNoExtension = dir.toString();
        dir.mkdir();
        return dir;
    }

    public static void main(String args[]) throws Exception {
        ReceiveMailImap.doit();
    }
}

共有1个答案

汤承允
2023-03-14

FetchProfile允许您“批量”预取一些消息信息。随后,当您访问消息对象的相应字段时,将使用此预取信息。您可能想使用FetchProfile。项目CONTENT\u INFO和FetchProfile。项目信封。除此之外,您的代码看起来很好。

 类似资料:
  • 我有一个Outlook.com的电子邮件帐户。我希望我的Java应用程序能够使用JavaMail从该电子邮件帐户发送电子邮件。为此,我通过OAuth授予了我的应用程序访问权限。 我已经能够使用msgshow中提供的精彩示例应用程序通过IMAP成功连接.java。但是,我正在尝试通过SMTP通过我的 Outlook.com 电子邮件帐户发送电子邮件,但我没有任何运气。我尝试过同时使用msgsend.

  • 我需要通过我的应用程序发送一封电子邮件,比如使用带有OAuth的javamail API,但我需要如何使用我在下面添加的代码。 我的代码:

  • 我在使用我的公司交换服务器通过Javamail发送电子邮件时遇到了一些问题。我们有一个应用程序通过gmail服务器发送电子邮件没有任何问题,但对于Google策略的一些更改,我们希望使用公司服务器来完成这项工作。我确信会话属性中的问题,但我无法找到使其工作的方法 这是显示日志的错误 javax.mail.MessagingException:无法连接到SMTP主机:mail.company.com

  • 问题内容: 以下Java代码用于将文件附加到电子邮件。我想通过电子邮件发送 多个 文件附件。任何建议,将不胜感激。 问题答案: 好吧,自从我完成JavaMail工作已经有一段时间了,但是看起来您可以重复多次此代码: 例如,您可以编写一个方法来做到这一点: 然后从您的主要代码中,只需调用: 等等

  • 问题内容: 我有兴趣在收到来自具有特定主题的特定地址的电子邮件时触发某些操作。为了能够做到这一点,我需要对邮箱进行监视,检查每个传入的邮件(特别是我使用gmail)。最简单的方法是什么? 问题答案: Gmail提供了通过POP进行连接的功能,您可以在gmail设置面板中将其打开。Python可以使通过POP的连接非常容易: 您只需要将此脚本作为cron作业运行即可。不确定您使用的平台如何,YMMV

  • 问题内容: 我正在尝试在JavaMail API的帮助下通过IMAP访问来自Gmail帐户的电子邮件。我想知道为什么代码对一个电子邮件帐户有效,而对另一个电子邮件帐户无效。 我可以访问两个电子邮件帐户的文件夹。但是对于其中一个电子邮件帐户,无法访问其他文件夹,例如,它将引发异常。有人可以解释出什么问题了吗? 先感谢您。 这是代码: 问题答案: 是否有一个帐户使用非英语用户界面? Gmail文件夹名