JavaMail Exchange Authentication
Asked Answered
C

9

11

I'm trying to use Exchange authentication from my app using JavaMail to do this. Could some one give me a guide to do this? After authentication I need to send mails that's the main reason that I'm using JavaMail. All the links that I found talks about problems with this but I think this must be an easy task to do from Java. Thanks in advance.

Calculator answered 11/11, 2009 at 4:57 Comment(0)
C
9

It is a good question! I have solved this issue.

First, you should import the jar ews-java-api-2.0.jar. if you use maven, you would add the following code into your pom.xml

<dependency>
  <groupId>com.microsoft.ews-java-api</groupId>
  <artifactId>ews-java-api</artifactId>
  <version>2.0</version>
</dependency>

Secondly, you should new java class named MailUtil.java.Some Exchange Servers don't start SMTP service by default, so we use Microsoft Exchange WebServices(EWS) instead of SMTP service.

MailUtil.java

package com.spacex.util;


import microsoft.exchange.webservices.data.core.ExchangeService;
import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion;
import microsoft.exchange.webservices.data.core.service.item.EmailMessage;
import microsoft.exchange.webservices.data.credential.ExchangeCredentials;
import microsoft.exchange.webservices.data.credential.WebCredentials;
import microsoft.exchange.webservices.data.property.complex.MessageBody;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.net.URI;

/**
 * Exchange send email util
 *
 * @author vino.dang
 * @create 2017/01/08
 */
public class MailUtil {

    private static Logger logger = LoggerFactory.getLogger(MailUtil.class);



    /**
     * send emial
     * @return
     */
    public static boolean sendEmail() {

        Boolean flag = false;
        try {
            ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP1); // your server version
            ExchangeCredentials credentials = new WebCredentials("vino", "abcd123", "spacex"); // change them to your email username, password, email domain
            service.setCredentials(credentials);
            service.setUrl(new URI("https://outlook.spacex.com/EWS/Exchange.asmx")); //outlook.spacex.com change it to your email server address
            EmailMessage msg = new EmailMessage(service);
            msg.setSubject("This is a test!!!"); //email subject
            msg.setBody(MessageBody.getMessageBodyFromText("This is a test!!! pls ignore it!")); //email body
            msg.getToRecipients().add("[email protected]"); //email receiver
//        msg.getCcRecipients().add("[email protected]"); // email cc recipients
//        msg.getAttachments().addFileAttachment("D:\\Downloads\\EWSJavaAPI_1.2\\EWSJavaAPI_1.2\\Getting started with EWS Java API.RTF"); // email attachment
            msg.send(); //send email
            flag = true;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return flag;

    }


    public static void main(String[] args) {

        sendEmail();

    }
}

if you want to get more detail, pls refer to https://github.com/OfficeDev/ews-java-api/wiki/Getting-Started-Guide

Cram answered 8/1, 2017 at 3:28 Comment(10)
535 5.7.3 Authentication unsuccessful when this error pops up just check if you are using Microsoft exchange user or normal user.Millrun
@amilarajans you should replace the url, user, password to yourselfCram
@Dang Thank you for this! You just saved me a lot of time. You could add to your answer the link to the EWS Java API documentation: github.com/OfficeDev/ews-java-api/wiki/Getting-Started-GuideAtonsah
@Spen, thank you too. i have add it to the EWS Java API documentation's Common Issues. pls help me check it and tell me whether it's correct.Cram
@Dang Oh I meant to add a link of the documentation to this stackoverflow answer.Atonsah
@Dang Yes, perfect :)Atonsah
@Spen, i have a question, did you use Spring Cloud?Cram
@Dang No, sorry. I'm using the Play Framework deployed on Google Cloud.Atonsah
Let us continue this discussion in chat.Cram
microsoft.exchange.webservices.data.core.exception.service.remote.ServiceRequestException: The request failed. The request failed. sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target Seeing this error . How to get around this?Mcmahan
B
6

After authentication I need to send mails

The below example works fine here with Exchange servers:

Properties properties = new Properties();
properties.put("mail.transport.protocol", "smtp");
properties.put("mail.smtp.host", "mail.example.com");
properties.put("mail.smtp.port", "2525");
properties.put("mail.smtp.auth", "true");

final String username = "username";
final String password = "password";
Authenticator authenticator = new Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(username, password);
    }
};

Transport transport = null;

try {
    Session session = Session.getDefaultInstance(properties, authenticator);
    MimeMessage mimeMessage = createMimeMessage(session, mimeMessageData);
    transport = session.getTransport();
    transport.connect(username, password);
    transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());
} finally {
    if (transport != null) try { transport.close(); } catch (MessagingException logOrIgnore) {}
}
Bolt answered 11/11, 2009 at 12:30 Comment(2)
Thanks for your answer. I'm using the same username and password with my outlook and is working. Exception in thread "main" javax.mail.MessagingException: Could not connect to SMTP host: XXX.XXX.XXX.XXX, port: 2525; nested exception: java.net.ConnectException: Connection timed out: connect at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1545) at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:453) at javax.mail.Service.connect(Service.java:291) at javax.mail.Service.connect(Service.java:172) at javax.mail.Service.connect(Service.java:192) any idea?Calculator
You need to change the port number to the actual port number of the server. It's usually 25, but it can be different. Consult mailserver's admin for details. Sorry for not mentioning that in the message, I thought it'd be obvious enough.Bolt
L
3

Works for me:

Properties props = System.getProperties();
// Session configuration is done using properties. In this case, the IMAP port. All the rest are using defaults
props.setProperty("mail.imap.port", "993");
// creating the session to the mail server
Session session = Session.getInstance(props, null);
// Store is JavaMails name for the entity holding the mails
Store store = session.getStore("imaps");
// accessing the mail server using the domain user and password
store.connect(host, user, password);
// retrieving the inbox folder
Folder inbox = store.getFolder("INBOX");

This code is based on the sample code arrives with the download of java mail.

Luff answered 11/11, 2009 at 11:43 Comment(1)
Thanks for your answer. I don't understand your code could you comment your code or something?Calculator
E
3

Microsoft released an open sourced API for connecting to Exchange Web Service

https://github.com/OfficeDev/ews-java-api

Equitation answered 3/2, 2015 at 22:27 Comment(3)
Actually, Microsoft released it.Liable
I meant microsoft hahaEquitation
Seeing this error. Some SSL certificate not present?? Is there a way to get around it? microsoft.exchange.webservices.data.core.exception.service.remote.ServiceRequestException: The request failed. The request failed. sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested targetMcmahan
L
1

Exchange does not start SMTP service by default, so we can't use SMTP protocol to connect to Exchange server and try to send email. BalusC can work fine with the above code because your mailserver administrator enabled SMTP service on Exchange.while in most cases SMTP is disabled.I am also looking for solution.

This is the best answer among what i have found, but what a frustration is that you have to pay for it after 60 days.

Longboat answered 10/7, 2010 at 8:12 Comment(0)
E
0

Some Exchange servers don't have smtp protocol enabled.
In these cases you can use DavMail.

Ellaelladine answered 27/9, 2012 at 23:53 Comment(0)
W
0

Tried the ews-java-api, as mentioned by Populus on a previous comment. It was done on a Java SE environment with jdk1.6 and it works like a charm.
These are the libs that I had to associate with my sample:

  • commons-cli-1.2.jar
  • commons-codec-1.10.jar
  • commons-lang3-3.1.jar
  • commons-logging-1.2.jar
  • ews-java-api-2.0.jar
  • httpclient-4.4.1.jar
  • httpcore-4.4.5.jar

Hope it helps.

Waugh answered 5/7, 2016 at 15:20 Comment(0)
O
0

The package suggested above is essentially at end of life.

From https://github.com/OfficeDev/ews-java-api

Starting July 19th 2018, Exchange Web Services (EWS) will no longer receive feature updates. While the service will continue to receive security updates and certain non-security updates, product design and features will remain unchanged. This change also applies to the EWS SDKs for Java and .NET. More information here: https://developer.microsoft.com/en-us/graph/blogs/upcoming-changes-to-exchange-web-services-ews-api-for-office-365/

Osteopathy answered 20/10, 2020 at 17:23 Comment(0)
N
0

SOLVED

Just add the follow to your pom.xml dependencies

    <dependency>
        <groupId>javax.xml.ws</groupId>
        <artifactId>jaxws-api</artifactId>
        <version>2.3.1</version>
    </dependency>

seems that jaxws-api is missing in JAVA 11+

Nanette answered 14/3, 2021 at 9:20 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.