Enviar correos a través de SMTP no esta recomendado, además la autenticación básica de Exchange también esta discontinuada. Por tanto necesitamos una alternativa para mandar correos a través de Office 365.

Microsoft Graph

Microsoft Graph es una API que nos permite interactuar con Microsoft 365. Esta API entre otros nos permite enviar correos electrónicos.

Para interactuar con la API tendremos que hacerlo a través de OAuth token.

Pasos para configurarlo:

1. Registrar la aplicación en Azure AD

Para registrar la Aplicación empresarial debemos acceder a la web de Azure, y buscar en el buscador de la parte superior «Active directory».

Accedemos al apartado de registro de aplicaciones:

Seguidamente hacemos click en nuevo registro.

Le ponemos nombre a la aplicación y dejamos el resto de valores por defecto.

Una vez echo esto debemos guardarnos el id de la aplicación y el del tenant.

Una vez hecho esto nos creamos un secreto para la aplicación, esto lo haremos desde el apartado de Certificados y secretos.

Hacemos click en crear nuevo secreto, y le ponemos un nombre, y un tiempo de expiración.

Una vez hecho esto nos copiamos el valor del secreto.

Como último paso en Azure, añadimos el permiso de enviar correo a la aplicación empresarial.

Y hacer click en al apartado donde pone conceder consentimiento.

Enviar mails usando .NET

Una forma sencilla de hacerlo es con una aplicación ASP.NET Core 6.

Lo primero que haremos será guardar nuestras credenciales en el archivo secrets.json

{
  "tenantId": "<YOUR_TENANT_ID>",
  "clientId": "<YOUR_CLIENT_ID>",
  "clientSecret": "<YOUR_CLIENT_SECRET>"
}

Usaremos dos librerías:

  • Azure.Identity
  • Microsoft.Graph

Ahora nos crearemos una clase de tipo servicio:

public class GraphMailService
{
    private readonly IConfiguration _config;

    public GraphMailService(IConfiguration config)
    {
        _config = config;
    }

    public async Task SendAsync(string fromAddress, string toAddress, string subject, string content)
    {
        string? tenantId = _config["tenantId"];
        string? clientId = _config["clientId"];
        string? clientSecret = _config["clientSecret"];

        ClientSecretCredential credential = new(tenantId, clientId, clientSecret);
        GraphServiceClient graphClient = new(credential);

        Message message = new()
        {
            Subject = subject,
            Body = new ItemBody
            {
                ContentType = BodyType.Text,
                Content = content
            },
            ToRecipients = new List<Recipient>()
            {
                new Recipient
                {
                    EmailAddress = new EmailAddress
                    {
                        Address = toAddress
                    }
                }
            }
        };

        bool saveToSentItems = true;

        await graphClient.Users[fromAddress]
          .SendMail(message, saveToSentItems)
          .Request()
          .PostAsync();
    }
}

Ahora en el código principal de la aplicación :

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddScoped<GraphMailService>();

var app = builder.Build();

app.MapGet("/", async(GraphMailService mailService) => await mailService.SendAsync(
    "<YOUR_SENDER_ADDRESS>",
    "<YOUR_RECIPENT_ADDRESS>",
    "<YOUR_SUBJECT>",
    "<YOUR_MESSAGE>"));

app.Run();

Ahora si arrancamos la aplicación, y accedemos con el navegador debería enviar el correo.

Conclusión

De forma bastente sencilla podemos enviar correos electrónicos, sin depender del protocolo SMTP.

Además este método al ser a través de API nos permite enviar correos electrónicos de manera sencilla a través de cualquier lenguaje de programación, o cualquier aplicación que pueda enviar peticiones a una API.

por domingo

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *