Enviar correo electrónico desde servidor office 365 Exchange con Spring Boot

Conectarse a un servidor de correo office 365 Exchange usando Spring Boot y Java es bastante sencillo usando java mail, pero este solo funciona para correos personales como Outlook, yahoo, gmail y demás email personales. Basta con configurar puertos, host, dominio del servidor de correo, usuario y contraseña.

Cuando nos intentamos conectar a correos empresariales o institucionales, tendremos problemas de conexión.

Por alguna razón, con un servidor de correo Outlook Office 365 Exchange las cosas cambian un poco a nivel de programación. Con las nuevas versiones aparecen errores de conexión y no es posible conectarnos de Java usando Spring Boot.

En este post básicamente te explicare una de las soluciones que encontré sobre cómo configurar JavaMail para usar Office 365 Exchange Service para enviar correo, no te garantizo que sea la mejor, ni tiene las mejores practicas, porque fue algo que hice cuando apenas estaba empezando como programador.

Tabla de contenido
  1. Parámetros de configuración
  2. API REST Outlook365 con ews y Spring Boot
    1. Agregar dependencia maven
    2. Código Java para Spring Boot
    3. Documentación completa

Parámetros de configuración

Por defecto, estos son los parámetros de configuración para un servidor de correo office personal en el archivo application.properties.

spring.mail.host=smtp.office365.com
spring.mail.port=587
[email protected]
spring.mail.password=
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true

Pero como he mencionado, en el caso de office 365 en las ultimas versiones da problemas, asi que yo he encontrado una solución final.

API REST Outlook365 con ews y Spring Boot

Para los programadores apurados, aqui te dejo mi github para que vayas y clones el proyecto:

Y para los mas pacientes, aqui vamos paso a paso.

Agregar dependencia maven

Vamos al pom de tu proyecto en spring boot

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

Una vez agregada la dependencia corres el proyecto como clean y luego install (si estas usando Maven), en el caso de que estés usando Gradle, debes sincronizar nuevamente el proyecto.

Si usas Spring Tools das click derecho sobre el proyecto, en la sección de run encuentras las opciones antes mencionadas. Si estas desde consola en Linux puedes usar:

mvn clean
mvn install

Ahora simplemente pegamos el siguiente codigo:

Código Java para Spring Boot

Este fue un método que hice para crear un API rest que enviara un correo automáticamente, obviamente este es una función para que entiendan como se debe hacer, lógicamente los correos y contraseñas no deben ir desprotegidos o escritos dentro del código.

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import microsoft.exchange.webservices.data.autodiscover.IAutodiscoverRedirectionUrl;
import microsoft.exchange.webservices.data.autodiscover.exception.AutodiscoverLocalException;
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;

@RestController
public class TestCorreo {

	@GetMapping("/correo")
	public String probarCorreo() throws Exception {
		ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2);
		ExchangeCredentials credentials = new WebCredentials("username", "password");
		service.setCredentials(credentials);
		//service.setEnableScpLookup(true);
		//service.setUrl(new java.net.URI("https://webmail.travelpro.com"));
		
		service.autodiscoverUrl("[email protected]", new IAutodiscoverRedirectionUrl() {
			@Override
			public boolean autodiscoverRedirectionUrlValidationCallback(String url) throws AutodiscoverLocalException {
				return url.toLowerCase().startsWith("https://");
			}
		});
		
		EmailMessage msg = new EmailMessage(service);
        msg.setSubject("Hello world!");
        msg.setBody(MessageBody.getMessageBodyFromText("Sent using the EWS Java API."));
        msg.getToRecipients().add("[email protected]");
        msg.send();
        
        
        

		return service.toString();
	}

}

Si tienen algún error de conexión puedes descomentar la linea de código:

service.setEnableScpLookup(true);

Espero que te haya servido, como he mencionado antes, si quieres puedes ir a mi repositorio y simplemente copiarlo y reemplazar las credenciales de tu servidor de correo.

Nota: los servidores de correo exchange, en especial los de Outlook 365 son muy quisquillosos con el tema de la seguridad, así que si ingresas mal tus datos te bloquean el API por algunas horas.

Documentación completa

Aquí te dejo la documentación completa de la librería ews-java-api que he usado para este post.

Hay cosas interesantes, como por ejemplo, que también podemos leer correos, ver carpetas, listado de contactos y demás.

Recomendado:   Como redondear los bordes de una imagen en Blogger
Subir