IMAP access to mail office 365 with javamail
16,993
Solution 1
PFB Code this resolves.
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();
}
}
Solution 2
In my case what was missing was:
props.setProperty("mail.imaps.sasl.mechanisms","XOAUTH2")
all props working for me (both gmail and 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"
Comments
-
Marin almost 2 years
I'm trying to read the emails in a folder of an email account Office365 using JavaMail 1.4 api.
My code is:
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(); }
My error is:
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)
Thanks
PS: Account Office365 using JavaMail 1.4 api
-
Narsingh barik over 3 yearsstil I am getting error :- javax.mail.AuthenticationFailedException: AUTHENTICATE failed. Actually I am trying to read the mail from my office email which is 'office 365' . Could you please tell me, what configuration or properties value I am missing ?
-
Amber over 2 yearsDoes this still work? I am getting a MessagingException: A3 BAD User is authenticated but not connected. I know I have the right password because I can connect with pop3s, it's just imaps that I'm having trouble with.