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.