Obtenir du courrier de GMail dans une application Java en utilisant IMAP

Je souhaite accéder aux messages de GMail à partir d’une application Java utilisant JavaMail et IMAP. Pourquoi est-ce que je reçois une exception SocketTimeoutException ?

Voici mon code:

Properties props = System.getProperties(); props.setProperty("mail.imap.host", "imap.gmail.com"); props.setProperty("mail.imap.port", "993"); props.setProperty("mail.imap.connectiontimeout", "5000"); props.setProperty("mail.imap.timeout", "5000"); try { Session session = Session.getDefaultInstance(props, new MyAuthenticator()); URLName urlName = new URLName("imap://MYUSERNAME@gmail.com:MYPASSWORD@imap.gmail.com"); Store store = session.getStore(urlName); if (!store.isConnected()) { store.connect(); } } catch (NoSuchProviderException e) { e.printStackTrace(); System.exit(1); } catch (MessagingException e) { e.printStackTrace(); System.exit(2); } 

Je mets les valeurs de timeout de manière à ce que le délai d’expiration ne soit pas “définitif”. MyAuthenticator possède également le nom d’utilisateur et le mot de passe, qui semblent redondants avec l’URL. Existe-t-il une autre façon de spécifier le protocole? (Je ne l’ai pas vu dans JavaDoc pour IMAP.)

    Utiliser des imaps était une excellente suggestion. Aucune des réponses fournies n’a fonctionné pour moi, alors j’ai encore consulté Google et trouvé quelque chose qui fonctionnait. Voici à quoi ressemble mon code maintenant.

     Properties props = System.getProperties(); props.setProperty("mail.store.protocol", "imaps"); try { Session session = Session.getDefaultInstance(props, null); Store store = session.getStore("imaps"); store.connect("imap.gmail.com", "@gmail.com", ""); ... } catch (NoSuchProviderException e) { e.printStackTrace(); System.exit(1); } catch (MessagingException e) { e.printStackTrace(); System.exit(2); } 

    C’est sympa car cela supprime l’authentificateur redondant. Je suis content que cela ait fonctionné parce que le SSLNOTES.txt me fait tourner la tête.

    Dans JavaMail, vous pouvez utiliser imaps comme schéma d’URL pour utiliser IMAP sur SSL. (Voir SSLNOTES.txt dans votre dissortingbution JavaMail pour plus de détails.) Par exemple, imaps://username%40gmail.com@imap.gmail.com/INBOX .

    De même, utilisez smtps pour envoyer des emails via Gmail. par exemple, smtps://username%40gmail.com@smtp.gmail.com/ . Encore une fois, lisez SSLNOTES.txt pour plus de détails. J’espère que cela aide!

    Vous devez utiliser les propriétés suivantes pour les imaps:

     props.setProperty("mail.imaps.host", "imap.gmail.com"); props.setProperty("mail.imaps.port", "993"); props.setProperty("mail.imaps.connectiontimeout", "5000"); props.setProperty("mail.imaps.timeout", "5000"); 

    Nota que c’est “imaps”, pas “imap”, puisque le protocole que vous utilisez est imaps (IMAP + SSL)

    Vous devez vous connecter à GMail uniquement avec SSL. Définir les propriétés suivantes forcera cela pour vous.

     props.setProperty ("mail.imap.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
     props.setProperty ("mail.imap.socketFactory.fallback", "false");
    

    Si vous souhaitez plus de code exemple sur l’utilisation de JavaMail avec Gmail (par exemple, conversion d’étiquettes Gmail en noms de dossiers IMAP ou en utilisant IMAP IDLE), consultez mon programme GmailAssistant sur SourceForge .

    Vérifiez http://g4j.sourceforge.net/ . Il existe un client gmail minimal construit avec cette API.

    J’ai utilisé les propriétés suivantes pour obtenir le magasin et ça marche bien.

    "mail.imaps.host" : "imap.gmail.com"
    "mail.store.protocol" : "imaps"
    "mail.imaps.port" : "993"

    Voici ce qui a fonctionné pour mon équipe et moi, avec un compte classique pseudonyme@gmail.com et un compte professionnel employee@business.com:

      final Properties properties = new Properties(); properties.put("mail.imap.ssl.enable", "true"); imapSession = Session.getInstance(properties, null); imapSession.setDebug(false); imapStore = imapSession.getStore("imap"); imapStore.connect("imap.gmail.com", USERNAME, "password"); 

    avec USERNAME = “pseudonyme” dans le cas classique et USERNAME = “employee@business.com” dans le cas du compte professionnel.

    Dans le cas classique, et si vous utilisez une ancienne dépendance JavaMail, n’oubliez pas de réduire la sécurité du compte ici: https://www.google.com/settings/security/lesssecureapps

    Dans les deux cas, cochez la case Paramètres GMail => Transfert POP / IMAP si IMAP est activé pour le compte.

    J’espère que cela aide!

    Pour aller plus loin :

    JSSE doit être installé pour utiliser SSL avec Java

     URLName server = new URLName("imaps://:@imap.gmail.com/INBOX");