Escolha uma Página
(Last Updated On: 10/01/2021)

Eu costumava usar o Mailkit para fazer o serviço de E-mail no Core MVC. Depois de algumas atualizações para o Core 5.X, o Mailkit começou a falhar. Mudei para o SendGrid: muito mais simples de implementar e o que é importante: não falha!

Vamos iimplentar oe-mail como um serviõs, que pode ser usado a partir de qualquer página de controle.

Abra uma pasta nova chamando-a de Services. Nela colocaremos 4 arquivos, como segue:

Classe EmailConfig - arquivo EmailConfig.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace PoupaTempoDigital.Services
{
    public class EmailConfig
    {
        public String FromName { get; set; }
        public String FromAddress { get; set; }

        public String LocalDomain { get; set; }

        public String MailServerAddress { get; set; }
        public String MailServerPort { get; set; }

        public String UserId { get; set; }
        public String UserPassword { get; set; }
   
    }
}

O próximo arquivo de classe é usado normalmente por Identity, que envia e-mails  para confirmação da conta e redefinição de senha. Para obter mais detalhes, consulte https://go.microsoft.com/fwlink/?LinkID=532713

Classe EmailSender - arquivo EmailSender.cs
using System.Threading.Tasks;

namespace PoupaTempoDigital.Services
{
    // This class is used by the application to send email for account confirmation and password reset.
    // For more details see https://go.microsoft.com/fwlink/?LinkID=532713
    public class EmailSender : IEmailSender
    {
        public Task SendEmailAsync(string email, string subject, string message)
        {
            return Task.CompletedTask;
        }
    }
}

O próximo arquivo é uma interface, e é o que eu normalmente uso, porque gosto de enviar na solicitação do e-mail uma string definindo se minha mensagem está em formato de texto ou está em HTML. Esse parametro é passado pela string formato.

Interface IEmailService - arquivo IEmailService.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace PoupaTempoDigital.Services
{
    public interface IEmailService
    {
        Task SendEmailAsync(string email, string subject, string message, string formato);
    }

    public interface IEmailSender
    {
        Task SendEmailAsync(string email, string subject, string message);
    }

}

O quarto e último arquivo, nas pasta Services, é o arquivo que faz o serviço de entrega, usando o SendGrid. 

Você vai precisar instalar via Package Manager os componentes do SendGrid para validar o que é chamado no arquivo:
using SendGrid;
using SendGrid.Helpers.Mail;

Arquivo MessageServices.cs na pasta Services
using System;
using System.Threading.Tasks;
using Microsoft.Extensions.Options;
using Microsoft.Extensions.Configuration;
using SendGrid;
using SendGrid.Helpers.Mail;

namespace PoupaTempoDigital.Services
{
    // source http://6figuredev.com/technology/generic-repository-dependency-injection-with-net-core/

    // https://www.codeproject.com/Articles/1166364/Send-email-with-Net-Core-using-Dependency-Injectio
    public class EmailService : IEmailService
    {
        private readonly EmailConfig ec;
        private readonly IConfiguration _configuration;

        public EmailService(
            IOptions<EmailConfig> emailConfig,
            IConfiguration configuration
            )
        {
            this.ec = emailConfig.Value;
            _configuration = configuration;
        }

        public async Task SendEmailAsync(String email, String subject, String message, String formato = "Html")
        {
            try
            {
                var API = _configuration.GetSection("Sendgrid").GetSection("ApiKey").Value;
                var client = new SendGridClient(API);
                var from = new EmailAddress(ec.FromAddress, ec.FromName);
                var assunto = subject;
                var to = new EmailAddress(email, "");//todo colocar nome de quem recebe a mensagem
                var htmlContent = "";
                var plainTextContent = "";
                if (formato != "Text" || formato != "Texto")
                {
                    htmlContent = "<html><body>" + message + "</body></html>"; //o summernote retira estas tags quando grava o HTML, eu reincluo para os e-mails
                }
                else
                {
                    plainTextContent = message; 
                }
                var msg = MailHelper.CreateSingleEmail(from, to, subject, plainTextContent, htmlContent);
              //opcional
                msg.AddBcc("email_1_copia_oculta@gmail.com", "[CÓPIA] Poupatempo Digital");
              //opcional 2
                msg.AddBcc("email_2_copia_oculta@gmail.com", "[CÓPIA] Poupatempo Digital");
                // Disable click tracking.
                // See https://sendgrid.com/docs/User_Guide/Settings/tracking.html
                msg.SetClickTracking(false, false);
                
              // disable tracking settings
                // ref.: https://sendgrid.com/docs/User_Guide/Settings/tracking.html
                msg.SetClickTracking(false, false);
                msg.SetOpenTracking(false);
                msg.SetGoogleAnalytics(false);
                msg.SetSubscriptionTracking(false);

                var response = await client.SendEmailAsync(msg).ConfigureAwait(false);

            }
            catch (Exception ex)
            {
                Console.Write(ex.Message);
            }
        }


    }
}

Note que a chave de API do Sendgrid está no arquivo de cofigurações (appsettings.json, no diretório principal da aplicação, que você vai precisar editar), Seção Sendgrid, subseção ApiKey.

A seção Email contém todos os dados do e-mail que deverá ter o domínio VALIDADO numa conta do SendGrid.

Edite seu arquivo appsettings.json na raiz do seu aplicativo Core MVC
{
  "Email": {
    "FromName": "Nome do seu Site",
    "FromAddress": "nomedoseuemail@dominiodoseusite.com.br",
    "LocalDomain": "dominiodoseusite.com.br",
    "MailServerAddress": "mail.dominiodoseusite.com.br",
    "MailServerPort": "8889", //PRECISA COLOCAR A PORTA QUE TEM A VER COM SEU SITE
    "UserId": "atendimento@dominiodoseusite.com.br",
    "UserPassword": "senha_do_seu_email"
  },
  "Sendgrid": {
    "ApiKey": "Chave_de_api_copiada_do_SendGrid"
  },

//outras configurações que você já tenha

  "ConnectionStrings": {
    "DefaultConnection": "string de conexão do seu banco de dados"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}

Precisamos agora injetar esse serviço no programa principal. Abra seu arquivo Startup.cs

Dentro da rotina 

public void ConfigureServices(IServiceCollection services)

{…}

acrescente o registro do seu serviço de e-mail:

Edite seu arquivo Startup.cs , colocando estas linha no final da rotina public void ConfigureServices(IServiceCollection services)
public void ConfigureServices(IServiceCollection services)
{
//... cortado por brevidade... deixe todo seu códiso original aqui

//https://www.codeproject.com/Articles/1166364/Send-email-with-Net-Core-using-Dependency-Injectio
            // Inject email service 
            // Register email service
            services.Configure<EmailConfig>(Configuration.GetSection("Email"));
            services.AddTransient<IEmailService, EmailService>();
}

Não se esqueça de acrescentar no topo do Startup.cs os arquivos de Modelos (Models) e de Serviços (Services). alterando o namespace para o do seu aplicativo.

Edite seu arquivo Startup.cs , acertando os usings
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using PoupaTempoDigital.Data;
using System;
using PoupaTempoDigital.Models; //MUITO IMPORTANETE
using PoupaTempoDigital.Services; //MUITO IMPORTANETE
using System.Globalization;
using Microsoft.AspNetCore.Http;

É o Sendgrid que envia seus e-mails na verdade.No plano grátis, você pode enviar até 12 mil e-mais por mês, uma média de 400 por dia (para mim é até demais).

Entre em E-mail API -> Integration Guide -> escolha a opção WEB API (Recomended). -> Escolha C#

No item 2, de um nome paa sua chave de API (API Key) e clique no botão CREATE KEY

Copie esta chave para seu arquivo appsettings.json

No final da página, do lado direito, clique no quase INVISIVEL radio button: ⊗  

Isso vai liberar o botão NEXT: VERIFY INTEGRATION

Duas últimas dicas:

  • não envie um e-mail para o próprio e-mail ou para um e-mail que este em CC ou BCC. Vai falhar, segundo o SendGrid.
  • a documentação do SendGrid permite que você, mesmo mandando o e-mail pelos servidores dela, apareçam para os servidores qque recebem seus e-mails por um CNAME do seu domínio. Com isso, a entregabilidade é muito maior e seus e-mails não vão parar na caixa de SPAM.

 

Obrigado pela sua leitura. Continue visitando este blog e compartilhe artigos em sua rede de relacionamento. Por favor, se quiser, registre sugestões e comentários aqui no final da página.