Ola pessoALL,

Uma dúvida recorrente que temos recebido é como enviar e-mails utilizando contas protegidas por MFA no Microsoft 365?

Antes de irmos para a resposta e código eu queria reforçar que esse não é o método recomendado pela Microsoft, nem do ponto de vista de uso e nao do ponto de vista de custos. As melhores opções ainda são SendGrid e SES da Amazon.

Primeiro de tudo a notícia triste, as permissões para envio via SMTP padrão só estão disponíveis quando você está autenticado utilizando as credenciais do usuário, como geralmente o envio é feito por sistema em background nós só temos as permissões de aplicação, então não poderemos utilizar as classes de envio padrão SMTP.

App Registration

O primeiro passo é registrarmos uma aplicação com as permissões necessárias no Azure AD (Microsoft Entra)

  • Azure Portal > Active Directory > App registrations > New registration
  • Name: email-sender (pode ser qualquer nome).
  • Type: Accounts in this organizational directory only (Single tenant)
  • Redirect URI: Em branco.

Permissões do App

Agora vem a parte mais importante, nosso app precisa ter uma permissão específica para envio de e-mails e essa permissão precisa ser autorizada por um ADMIN do Tenant, então se você não é admin peça para alguém que tenha credencial fazer esse passo.

  • API permissions > Add a permission
  • Microsoft Graph > Application Permissions > Mail.Send > click Add Permission
  • Após conceder as permissões, clique no botão "Grant admin consent"

Enviando um e-mail

O processo agora é simples, precisamos das informações básicas para uso de qualquer aplicação do Microsoft Entra (Azure AD):

  • TenantID
  • ClientID
  • ClientSecret

Precisaremos também de 2 pacotes no nosso projeto:

  • Azure.Identity
  • Microsoft.Graph

O código é bem simples:


using Azure.Identity;
using Microsoft.Graph;
using Microsoft.Graph.Models;
using Microsoft.Graph.Users.Item.SendMail;

var tenantId = "id-tenant-azure";
var clientId = "id-app-criado";
var clientSecret = "client-secret";

// Set up the user's email address and message content
var message = new Message
{
    Subject = "Test email from Microsoft 365 oauth",
    Body = new ItemBody
    {
        ContentType = BodyType.Html,
        Content = "<h1>Hello there!</h1><p>if you can read this, we are sending emails from an app using a microsoft 365 account</p>"
    },
    ToRecipients = new List<Recipient>
    {
        new Recipient
        {
            EmailAddress = new EmailAddress
            {
                Address = "<email-do-destinatario>"
            }
        }
    }
};

var clientSecretCredential = new ClientSecretCredential(tenantId, clientId, clientSecret);
var graphServiceClient = new GraphServiceClient(clientSecretCredential);

// Email de envio precisa ter uma licença válida no Microsoft 365 para envio de emails.
await graphServiceClient.Users["<email-para-envio>"]
    .SendMail
    .PostAsync(new SendMailPostRequestBody { Message = message });

Prontinho, com isso temos um código que autentica no Microsoft Graph e envia um e-mail. Vale lembrar que a conta usada para envio necessita ter uma licença válida no Microsoft 365.

[]s e até a próxima.

💡
Podemos te ajudar com uma revisão 100% gratuita do seu ambiente cloud.
Share this post