自动接收新电子邮件-JavaMail

时间:2018-07-10 22:01:36

标签: java synchronization

如何使用JavaMail在一定范围内接收新电子邮件?例如:服务器每2秒检查一次Gmail中是否有新电子邮件。

我可以完成获取电子邮件的整个过程,我只需要它。每当收到新电子邮件时,系统都会为您提供刷新。

原因:我正在制作一个通知屏幕,每当收到一封新电子邮件时,我都需要显示此屏幕。

谢谢。

我的代码:

    public void lerEmail() {
        try {

            campolog.setContentType("text/html");
            Properties props = new Properties();

            props.put("mail.smtp.host", "smtp.gmail.com");
            props.put("mail.smtp.port", "587");
            props.put("mail.smtp.starttls.enable", "true");
            Session session = Session.getInstance(props);

            Store store = session.getStore("imaps");
            store.connect("pop.gmail.com", "email@gmail.com", "senha");

//            javax.mail.Folder[] folders = store.getDefaultFolder().list("*");
//            for (javax.mail.Folder folder : folders) {
//                if ((folder.getType() & javax.mail.Folder.HOLDS_MESSAGES) != 0) {
//                    System.out.println(folder.getFullName() + ": " + folder.getMessageCount());
//                }
//            }
            SortTerm[] termos = new SortTerm[1];

            termos[0] = SortTerm.ARRIVAL;

            Folder pastaEmail = store.getFolder("SMS");
            pastaEmail.open(Folder.READ_ONLY);

            Message[] mensagens = pastaEmail.getMessages();
            //System.out.println("Total de E-mails: " + mensagens.length);

            if (mensagens.length > 0) {
                int ultimaMensagem = mensagens.length - 1;
                campolog.setText("Mensagem: " + mensagens[ultimaMensagem].getContent().toString());

                extrair();
            } else {
                System.out.println("Não há E-mails.");
            }

            pastaEmail.close(false);
            store.close();

        } catch (NoSuchProviderException e) {
            System.out.println("Erro: " + e);
        } catch (MessagingException | IOException e) {
            System.out.println("Erro: " + e);
        }
    }

1 个答案:

答案 0 :(得分:0)

我知道了。在此示例中,我正常收到了电子邮件。如果我收到新的电子邮件,则我的应用程序会自动“读取”该邮件。

    public void lerEmail() {
        try {
            campolog.setContentType("text/html");
            // (1) Informações do Servidor
            Properties props = new Properties();
            props.put("mail.smtp.starttls.enable", "true");
            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.required", "true");
            props.put("mail.smtp.ssl.trust", "smtp.gmail.com");
            Session session = Session.getInstance(props);

            // (2) Conexão com o servidor
            Store store = session.getStore("imaps");
            store.connect("smtp.gmail.com", "email@email.com.br", "senha");

            // Buscar referência das pastas (Não precisa tirar o comentario, só se você quiser saber o nome das pastas).
//            Folder[] nomePastas = store.getDefaultFolder().list("*");
//            for (Folder pasta : nomePastas) {
//                if ((pasta.getType() & Folder.HOLDS_MESSAGES) != 0) {
//                    System.out.println(pasta.getFullName() + ": " + pasta.getMessageCount());
//                }
//            }

            // (3) Escolhemos a pasta INBOX e colocamos no modo "Ler e Escrever (READ_WRITE)" (Isso "autoriza" a modificação de "Não Lido" para "Lido")
            SortTerm[] termos = new SortTerm[1];
            termos[0] = SortTerm.ARRIVAL;
            Folder pastaEmail = store.getFolder("INBOX");
            pastaEmail.open(Folder.READ_WRITE);

            // (4) Cria filtro para mensagens não lidas.
            Flags visto = new Flags(Flags.Flag.SEEN);
            FlagTerm filtroNaoLidas = new FlagTerm(visto, false);

            // (5) Cria filtro para "ler" apenas um "endereço".
            FromStringTerm filtroEmail = new FromStringTerm("@abnerRodrigues.com.br"); //Se você quiser ler email de apenas um destinatário, faça a modificação

            // (6) Combina os filtros em um só.
            SearchTerm filtros = new AndTerm(filtroNaoLidas, filtroEmail);

            //Message[] mensagens = pastaEmail.getMessages(); //Aqui pega todas os emails.
            Message[] mensagens = pastaEmail.search(filtros); //Aqui filtra os emails de acordo com o que queremos.
            for (int q = 0; q < mensagens.length; q++) {
                mensagens[q].setFlag(Flag.SEEN, true);
            }

            timer = new Timer();
            timer.scheduleAtFixedRate(new TimerTask() {
                @Override
                public void run() {
                    try {
                        pastaEmail.open(Folder.READ_WRITE);
                        // Fazemos a primeira leitura de emails.
                        int start = 1;
                        int end = pastaEmail.getMessageCount();
                        while (start <= end) {
                            // new messages that have arrived
                            start = end + 1;
                            end = pastaEmail.getMessageCount();
                        }

                       // Adicionando um MessageCountListener to "ouvir" novas mensagens
                        pastaEmail.addMessageCountListener(new MessageCountAdapter() {
                            @Override
                            public void messagesAdded(MessageCountEvent ev) {
                                try {
                                    Message[] msgs = pastaEmail.search(filtros);
                                    for (Message msg : msgs) {
                                        Notificacao nf = new Notificacao();
                                        nf.setVisible(true);
                                        dispose();
                                    }
                                } catch (MessagingException ex) {
                                    Logger.getLogger(Notificacao.class.getName()).log(Level.SEVERE, null, ex);
                                }
                            }
                        });

                        // Aguardando novas mensagens
                        for (;;) {
                            ((IMAPFolder) pastaEmail).idle();
                        }
                    } catch (MessagingException ex) {
                        Logger.getLogger(Notificacao.class.getName()).log(Level.SEVERE, null, ex);
                    }

                }
            }, delay, interval);

            //System.out.println("Total de E-mails: " + mensagens.length);
            if (mensagens.length > 0) {
                int ultimaMensagem = mensagens.length - 1;
                campolog.setText("Mensagem: " + mensagens[ultimaMensagem].getContent().
            } else {
                System.out.println("Não há E-mails não lidos.");
                campotelefone.setText("");
                campolog.setText("<html><head></head><body><b> <center><font face= Arial><font size=6><font color=black> NÃO HÁ RESPOSTA DO MORADOR! </font></center></b></body></html>");
            }
            pastaEmail.close(false);
            store.close();
        } catch (NoSuchProviderException e) {
            System.out.println("Erro: " + e);
        } catch (MessagingException | IOException e) {
            System.out.println("Erro: " + e);
        }
    }