Amazon Simple Email Service, afgekort SES, is een Cloud gebaseerde e-mailbezorgdienst van Amazon Web Services. Het biedt een betrouwbare en schaalbare oplossing voor het versturen van e-mails vanuit je webapplicaties. Het vereenvoudigt het proces van e-mailverzending door een infrastructuur te bieden die de e-mailbezorging verzorgt. Het neemt taken zoals het beheren van e-mailservers, het afhandelen van bounces en klachten, en het onderhouden van de afzenderreputatie op zich. Dit zorgt ervoor dat je e-mails een grotere kans hebben om daadwerkelijk in de inbox van ontvangers terecht te komen.
In dit artikel gaan we een .Net applicatie bouwen waarmee we een e-mail via SES versturen.
Vereisten
Voordat je aan de slag kunt gaan, zijn er enkele vereisten.
Je hebt een AWS account nodig. Als je nog geen account hebt kun je die hier aanmaken.
Visual Studio 2022 moet geïnstalleerd staan op je pc, met de AWS Toolkit extensie. Heb je deze nog niet geïnstalleerd? Volg de stappen in dit artikel.
Tijdelijk e-mail adres aanmaken
Navigeer naar TEMP MAIL en er wordt een tijdelijk e-mail adres voor je aangemaakt. Zorg dat de tab open blijft staan, anders ben je het e-mail adres kwijt.
Registreren SES Identity
Navigeer in een nieuwe tab naar AWS Console and log in.
Eenmaal ingelogd, zoek naar de Simple Email Service.
Als je voor het eerst het SES dashboard opstart dan krijg je een melding dat de service in Sandbox modus is.
Zolang de e-mail service in Sandbox modus is, zijn er een aantal beperkingen waar je rekening mee moet houden. Een aantal hebben te maken met het aantal e-mails wat je kunt versturen, maar de belangrijkste is dat je alleen e-mails kunt versturen naar geverifieerde e-mail adressen. Die gaan we nu aanmaken.
Klik op “Identities” in het linker menu.
Klik vervolgens op "Create Identity".
Kies voor Identity Type "Email address".
Geef het tijdelijke e-mail adres in en klik op "Create Identity".
Er is nu een e-mail verstuurd naar het TEMPMAIL e-mail box. Open deze e-mail en bevestig via de link.
Het e-mail adres is nu geverifieerd. Nu kunnen we de applicatie gaan opzetten waarmee we de eerste e-mail gaan versturen naar het geverifieerde e-mail adres.
Asp.Net applicatie aanmaken
Open Visual Studio 2022.
In het top menu, klik op “File” → “New” → "Project".
Selecteer project template "ASP.Net Core Web API" en klik op "Next".
Geef het project een naam, kies locatie en klik op "Next".
Laat hier alle default waarden staan en klik op "Create".
De solution wordt nu aangemaakt met een voorbeeld project. Deze bevat een endpoint om de weersverwachting op te vragen.
We gaan dit voorbeeld project uitbreiden door bij elke aanroep de weersverwachting ook naar het geverifieerde e-mail adres te sturen.
Stuur e-mails vanuit een Asp.Net applicatie
Ga terug naar Visual Studio 2022.
Voeg de benodigde nuget packages toe aan het project.
AWSSDK.Extensions.NETCore.Setup AWSSDK.SimpleEmail MimeKit
Maak nu een nieuwe map aan in het project, genaamd "Options". Maak in de deze map een nieuwe class aan voor de instellingen, waarin we vastleggen welke e-mail adressen gebruikt moeten worden bij het versturen van de e-mails. Deze class wordt gebruikt om de instellingen vanuit de appsettings in te lezen.
namespace FirstMailApp.Options; public class EmailOptions { public string FromName { get; set; } public string FromEmail { get; set; } public string ToName { get; set; } public string ToEmail { get; set; } }
Leg nu gelijk de instellingen vast in appsettings.Development.json.
{ "Email": { "FromName": "Wilco van Dijk", "FromEmail": "habadek957@cpaurl.com", "ToName": "Wilco van Dijk", "ToEmail": "habadek957@cpaurl.com" } }
Maak nog een nieuwe map aan in het project, genaamd "Services". We voegen hierin een nieuwe service toe voor het versturen van de e-mails. We maken daarbij gebruik van Mimekit.
using Amazon.SimpleEmail; using Amazon.SimpleEmail.Model; using FirstMailApp.Models; using MimeKit; namespace FirstMailApp; public interface IEmailService { Task SendAsync(EmailRequest mailRequest); } public class EmailService : IEmailService { private readonly IAmazonSimpleEmailService _mailService; public EmailService(IAmazonSimpleEmailService mailService) { _mailService = mailService; } public async Task SendAsync(EmailRequest mailRequest) { // Build body var bodyBuilder = new BodyBuilder(); if (mailRequest.IsHtmlBody) bodyBuilder.HtmlBody = mailRequest.Body; else bodyBuilder.TextBody = mailRequest.Body; foreach (var attachment in mailRequest.Attachments) bodyBuilder.Attachments.Add(attachment.Name, attachment.File); // Message var mimeMessage = new MimeMessage(); // Sender mimeMessage.From.Add(new MailboxAddress(mailRequest.From.Name, mailRequest.From.Email)); // Recipients foreach (var recipient in mailRequest.Recipients) mimeMessage.To.Add(new MailboxAddress(recipient.Name, recipient.Email)); mimeMessage.Subject = mailRequest.Subject; mimeMessage.Body = bodyBuilder.ToMessageBody(); using (var messageStream = new MemoryStream()) { await mimeMessage.WriteToAsync(messageStream); var sendRequest = new SendRawEmailRequest { RawMessage = new RawMessage(messageStream) }; var response = await _mailService.SendRawEmailAsync(sendRequest); } } }
Deze service is generiek opgezet, zodat verschillende typen e-mails worden ondersteund. Je kunt er tekst mee versturen, maar ook html en zelfs bijlagen kunnen worden bijgevoegd. De service kan worden aangeroepen door een request object mee te sturen. Deze gaan we nu aanmaken.
Maak nog een nieuwe map aan in het project, genaamd "Models". Hierin maken we een nieuwe class aan voor het e-mail request.
namespace FirstMailApp.Models; public class EmailRequest { public EmailRequest() { Recipients = new List<EmailRecipient>(); Attachments = new List<EmailAttachment>(); } public EmailFrom From { get; set; } public List<EmailRecipient> Recipients { get; set; } public string Subject { get; set; } public string Body { get; set; } public bool IsHtmlBody { get; set; } public List<EmailAttachment> Attachments { get; set; } } public class EmailAttachment { public string Name { get; set; } public FileStream File { get; set; } } public class EmailRecipient { public string Name { get; set; } public string Email { get; set; } } public class EmailFrom { public string Name { get; set; } public string Email { get; set; } }
Nu moeten we de nieuwe services nog registreren. Open het bestand Program.cs en voeg de volgende code toe.
// Add services to the container. builder.Services.Configure<EmailOptions>(builder.Configuration.GetSection("Email")); builder.Services.AddDefaultAWSOptions(builder.Configuration.GetAWSOptions()); builder.Services.AddAWSService<IAmazonSimpleEmailService>(); builder.Services.AddScoped<IEmailService, EmailService>();
Nu kunnen alle services geïnstantieerd worden via Dependency Injection. Wil je daar meer over weten klik dan hier.
De laatste stap is het daadwerkelijk versturen van de e-mail als de API wordt aangeroepen. Open het bestand WeatherForecastController.cs en breidt de constructor uit met de EmailService en de instellingen.
private readonly IEmailService _emailService; private readonly EmailOptions _emailOptions; private readonly ILogger<WeatherForecastController> _logger; public WeatherForecastController( IEmailService emailService, IOptions<EmailOptions> emailOptions, ILogger<WeatherForecastController> logger) { _emailService = emailService; _emailOptions = emailOptions.Value; _logger = logger; }
De laatste aanpassing is het versturen van de weersverwachting voor de volgende dag.
[HttpGet(Name = "GetWeatherForecast")] public async Task<IEnumerable<WeatherForecast>> Get() { var forecast = Enumerable.Range(1, 5).Select(index => new WeatherForecast { Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)), TemperatureC = Random.Shared.Next(-20, 55), Summary = Summaries[Random.Shared.Next(Summaries.Length)] }).ToArray(); var body = $"Date: {forecast[0].Date}" + Environment.NewLine + $"Temperature: {forecast[0].TemperatureC}" + Environment.NewLine + $"Summary: {forecast[0].Summary}"; // Send email with forecast for tomorrow await _emailService.SendAsync(new EmailRequest { From = new EmailFrom { Name = _emailOptions.FromName, Email = _emailOptions.FromEmail }, Recipients = new List<EmailRecipient>() { new EmailRecipient { Name = _emailOptions.ToName, Email = _emailOptions.ToEmail } }, Subject = "Weatherforecast for tomorrow", Body = body, IsHtmlBody = false }); return forecast; }
Start nu de applicatie op en roep de API aan via Swagger (of Postman). Als je een 200 statuscode terugkrijgt is de e-mail verstuurd. Controleer nu je tijdelijke e-mail of de e-mail is aangekomen.
De broncode voor de voorbeeld applicatie in dit artikel kun je hier vinden. Vergeet niet het tijdelijke e-mail adres te verwijderen uit SES!