IMAP-доступ к почтовому офису 365 с javamail

Я пытаюсь читать электронные письма в папке учетной записи электронной почты Office365, используя API JavaMail 1.4.

Мой код:

    public static void main(String argv[]) throws Exception {
    // Get a Properties object
    Properties props = System.getProperties();

    // Get a Session object
    Session session = Session.getInstance(props, null);

    // Get a Store object
    Store store = null;
    Folder rf = null;

    if (CUR_MAIL_PROTOCOL != null)
        store = session.getStore("imap");

    // Connect
    if (CUR_MAIL_HOST != null || CUR_MAIL_LOGIN != null || CUR_MAIL_PWD != null)
        store.connect("outlook.office365.com", 993, "**MYEMAIL**", "**MYPASS**");
    else
        store.connect();

    // List namespace
    rf = store.getDefaultFolder();

    getFolderDetails(rf, true, "");
    if ((rf.getType() & Folder.HOLDS_FOLDERS) != 0) {
        Folder[] f = rf.list("%");
        for (int i = 0; i < f.length; i++)
            getFolderDetails(f[i], recursive, "    ");
    }

    store.close();
}

Моя ошибка:

    Exception in thread "main" javax.mail.MessagingException: Connection timed out: connect;
  nested exception is: 
    java.net.ConnectException: Connection timed out: connect
    at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:298)
    at javax.mail.Service.connect(Service.java:234)

Спасибо

PS: учетная запись Office365 с использованием JavaMail 1.4 API


person Marin    schedule 07.04.2016    source источник
comment
FAQ по JavaMail содержит советы по отладке проблем с подключением.   -  person Bill Shannon    schedule 08.04.2016
comment
хорошо :D Теперь у меня есть эта ошибка: DEBUG: getProvider() возвращает javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc] * OK Служба Microsoft Exchange IMAP4 готова. [QQBNADMAUABSADAANQBDAEEAMAAyADEALgBlAHUAcgBwAHIAZAAwADUALgBwAHIAbwBkAC4AbwB1AHQAbABvAG8AawAuAGMAbwBtAA==] A0 CAPABILITY * CAPABILITY IMAP4 IMAP4rev1 LOGINDISABLED STARTTLS SASL-IR UIDPLCAP LCAPUS ADOVE ID UNSELECT CHILDREN ID завершено. A1 LOGIN [email protected] ***** A1 BAD Получена команда в недопустимом состоянии.   -  person Marin    schedule 08.04.2016
comment
Основная ошибка: LOGIN A1 BAD Команда получена в недопустимом состоянии.   -  person Marin    schedule 08.04.2016
comment
Попробуйте использовать imaps вместо imap. С imap сервер возвращает возможность LOGINDISABLED, что означает, что вы не можете выполнить простую команду имени пользователя/пароля LOGIN. С imaps такого быть не должно.   -  person dkarp    schedule 08.04.2016
comment
Вам удалось найти способ доступа к office365 через imaps? можешь опубликовать решение?   -  person Delorean    schedule 27.08.2017


Ответы (2)


Код PFB это решает.

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;

import javax.mail.Address;
import javax.mail.FetchProfile;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.search.FlagTerm;

public class OutLookReader_imaps {

    Folder inbox;

    // Constructor of the calss.

    public OutLookReader_imaps() {
        System.out.println("Inside MailReader()...");
        final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
        Properties props = System.getProperties();
        // Set manual Properties
        props.setProperty("mail.imaps.socketFactory.class", SSL_FACTORY);
        props.setProperty("mail.imaps.socketFactory.fallback", "false");
        props.setProperty("mail.imaps.port", "993");
        props.setProperty("mail.imaps.socketFactory.port", "993");
        props.put("mail.imaps.host", "outlook.office365.com");


        try {
            /* Create the session and get the store for read the mail. */

            Session session = Session.getDefaultInstance(System.getProperties(), null);
            Store store = session.getStore("imaps");

            store.connect("outlook.office365.com", 993, "My email ID", "my password");

            /* Mention the folder name which you want to read. */


            inbox = store.getFolder("INBOX");

            /* Open the inbox using store. */

            //inbox.open(Folder.READ_ONLY);
            inbox.open(Folder.READ_WRITE);

            Message messages[] = inbox.search(new FlagTerm(new Flags(
                    Flags.Flag.ANSWERED), false));
            //Message[] msgs = inbox.getMessages();

            System.out.println("No. of Unread Messages : " + inbox.getUnreadMessageCount());
            System.out.println("No. of Messages : " + inbox.getMessageCount());
            System.out.println("No. of Deleted Messages : " + inbox.getMode());

            FetchProfile fp = new FetchProfile();
            fp.add(FetchProfile.Item.ENVELOPE);

            inbox.fetch(messages, fp);

            try {

                printAllMessages(messages);

                inbox.close(true);
                store.close();

            } catch (Exception ex) {
                System.out.println("Exception arise at the time of read mail");
                ex.printStackTrace();
            }

        } catch (MessagingException e) {
            System.out.println("Exception while connecting to server: " + e.getLocalizedMessage());
            e.printStackTrace();
            System.exit(2);
        }

    }

    public void printAllMessages(Message[] msgs) throws Exception {
        for (int i = 0; i < msgs.length; i++) {
            System.out.println("MESSAGE #" + (i + 1) + ":");
            printEnvelope(msgs[i]);
        }
    }

    public void printEnvelope(Message message) throws Exception {

        Address[] a;

        if ((a = message.getFrom()) != null) {
            for (int j = 0; j < a.length; j++) {
                System.out.println("Email From : " + a[j].toString());
            }
        }

        String subject = message.getSubject();

        Date receivedDate = message.getReceivedDate();
        Date sentDate = message.getSentDate(); 

        SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");

        System.out.println("Email Subject : " + subject);

        if (receivedDate != null) {
            System.out.println("Received Date: " + df.format(receivedDate));
        }

        System.out.println("Sent Date : " + df.format(sentDate));
    }


    public static void main(String args[]) {
        new OutLookReader_imaps();
    }
}
person Raghu    schedule 09.08.2017
comment
все еще я получаю сообщение об ошибке: - javax.mail.AuthenticationFailedException: AUTHENTICATE failed. На самом деле я пытаюсь прочитать почту с моей офисной электронной почты, которая называется «офис 365». Не могли бы вы сказать мне, какое значение конфигурации или свойств мне не хватает? - person Narsingh barik; 02.12.2020

В моем случае не хватало:

 props.setProperty("mail.imaps.sasl.mechanisms","XOAUTH2")

у меня работают все реквизиты (и gmail, и o365):

"mail.imaps.ssl.enable"         true
"mail.imaps.sasl.enable"        true
"mail.imaps.auth.login.disable" true
"mail.imaps.auth.plain.disable" true
"mail.imaps.auth.mechanisms"    "XOAUTH2"
"mail.imaps.usesocketchannels"  true
"mail.event.scope"              "session"
"mail.imaps.starttls.enable"    true
"mail.imaps.sasl.mechanisms"    "XOAUTH2"
person Spec    schedule 25.05.2021