Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

Asp.NET Core – Amazon SES(Simple Email Service) İle E-Posta Gönderimi

Merhaba,

Bu içeriğimizde, AWS tarafından bir e-posta gönderim servisi olarak sunulan Amazon SES(Simple Email Service) ile kolayca yazılımlarımızdaki e-posta gönderme ihtiyacını nasıl giderebileceğimizi inceleyecek ve birçok yöntemin yanında, bir Asp.NET Core uygulaması üzerinden pratiksel tecrübede bulunup, öğreneceğiz. O halde buyurun başlayalım…

Biliyorsunuz ki; bir yazılımda kullanıcılarla bağlantı kurmak, yer yer önemli bildirimlerde bulunmak ve müşterilerimizle yeni gelişmelere dair etkili bir şekilde iletişimde kalmak oldukça önem arz etmekte ve bu süreçte e-posta iletişimi de mühim rol alabilmektedir. Özellikle e-ticaret ya da satış/pazarlama sektörlerinde hizmet veren yazılımlarda bu mühim rolün üzerine yoğun bir şekilde e-posta trafiği söz konusu olabilmekte, ee bu da son derecede ölçeklenebilir ve uygun maliyetlerde bir e-posta servisi gereği duyurabilmektedir. Böyle bir ihtiyaca istinaden piyasa da özel ya da cloud tabanlı birçok çözüm getirebilme imkanı söz konusuyken biryandan da AWS tarafından sırf bu işe odaklı geliştirilmiş Amazon SES’i güzel bir alternatif olarak değerlendirebilir ve yazılımlarımızdaki e-posta yeteneklerini önemli ölçüde artırabiliriz.

Amazon SES(Simple Email Service) Nedir?

Amazon SES(Simple Email Service), AWS tarafında sunulan bir e-posta gönderim servisidir. Bu servis ile kullanıcılara toplu e-postalar gönderilebilmekte ya da pazarlama ve bildirim gibi farklı türlerde e-posta işlemleri kolayca gerçekleştirilebilmektedir. Amazon SES’de e-postaların güvenli bir şekilde teslim edilebilmesi için high deliverability/email deliverability(yüksek teslim edilebilirlik) oranları hedeflenmiştir ve bunun için de çeşitli e-posta doğrulama, güvenlik ve spam koruma özellikleri ile donatılmıştır.

Amazon SES’in başlıca özelliklerini sıralamamız gerekirse eğer;

  • Kolay Entegrasyon
    Amazon SES, SMTP veya API ile uygulamalara kolayca entegre edilebilir ve bu sayede hızlıca e-posta aksiyonları alınabilir.
  • Ölçeklenebilirlik
    Amazon SES, çok yüksek hacimli e-posta gönderimleri için kolayca ölçeklenebilir bir yapı sunmakta ve böylece de toplu pazarlama veya bildirimde bulunma süreçleri için ideal bir ortam sağlamaktadır.
  • Etkin Maliyet
    Gönderilen e-posta sayısına göre ücretlendirme yapılmaktadır. Böylece de maliyetler optimize edilebilmekte ve herhangi bir ön veya asgari ücret ödemeksizin yalnızca gönderilen e-postalar üzerinden ödeme yapılacak şekilde bir avantaj sağlamaktadır.
  • Raporlama *
    Amazon SES, gönderilen e-postalar hakkında açılma, tıklama ve geri dönme gibi oldukça kritik metrikler sunmakta ve böylece e-posta performanslarını izleyerek yeni stratejilere büyük katkılarda bulunmaktadır!
  • Yüksek Teslim Edilebilirlik
    Amazon’un güvenli altyapısı sayesinde e-postalar genellikle hedeflenen alıcılara hızlı ve güvenilir şekilde ulaştırılmaktadır.

Özellikle e-ticaret gibi finansal yazılımlarda marka itibarını korumak için Amazon SES’den büyük istifade edilebilir.

Peki Amazon SES’in fiyatlandırma politikası nasıldır?
Önceki satırlarda bahsedildiği üzere Amazon SES kullandıkça ödeme modelini benimsemektedir. Ancak EC2 instance’ında çalışan uygulamalarınız için her 24 saatte bir 200 e-posta’ya kadar ücretsiz bir cömertliğe sahiptir. Bunun dışında neredeyse çoğu durumda hiçbir ücret ödenmediğini söyleyebiliriz. Yine de takriben bir hesap yapmamız gerekirse eğer gönderilen veya alınan her 1000 e-posta için 0,10$ gibi bir meblağ söz konusudur diyebiliriz. Ayrıca gönderilen her ekstra GB boyutundaki veri için yaklaşım olarak da 0,12$ ek ücret alınmaktadır.

Amazon SES ile e-posta göndermenin yolları nelerdir?
Amazon SES ile e-posta göndermenin aşağıdaki gibi birkaç farklı yolu mevcuttur;

  • AWS Management Console kullanarak gönderilebilir,
  • AWS CLI Tool ve JSON payload kullanarak gönderilebilir,
  • SMTP kullanarak gönderilebilir,
  • .NET – AWS SDK kullanarak gönderilebilir.

Şimdi e-posta gönderimini bu yöntemlerle tek tek inceleyebilmek için öncelikle AWS Management Console üzerinden Amazon SES’i keşfedelim ve ardından mail gönderim süreçlerinde kullanacağımız bir identity oluşturmayı ele alalım;

AWS Management Console Üzerinden Amazon SES’i Keşfedelim ve Sender Identity Oluşturalım

Öncelikle AWS Management Console üzerinden Amazon SES’i açalım;Asp.NET Core - Amazon SES(Simple Email Service) İle E-Posta GönderimiEğer ilk defa Amazon SES servisine giriş yapıyorsanız aşağıdaki gibi ekranla karşılaşacaksınız;Asp.NET Core - Amazon SES(Simple Email Service) İle E-Posta GönderimiBurada ‘Get started’ diyerek devam edelim.

Şimdi e-posta gönderebilmek için öncelikle bir gönderici kimliği(sender identity) oluşturmamız ve ardından bunu doğrulamamız gerekmektedir. Bunun için soldaki menüden ‘Identities’ sekmesine gelelim ve açılan sayfada ‘Create identity’ butonuna tıklayalım.Asp.NET Core - Amazon SES(Simple Email Service) İle E-Posta GönderimiAmazon SES üzerinden e-posta göndermek için oluşturulacak identity; bir domain, sub-domain yahut gmail gibi harici e-posta adresi olabilir. Bizler bu örneğimizde Amazon SES’teki identity’i doğrulamak için şahsi e-posta adresimi kullanacağız.Asp.NET Core - Amazon SES(Simple Email Service) İle E-Posta GönderimiBurada verilen e-posta adresine doğrulama mailinin gönderileceğini ve bu nedenle erişilebilir bir adres yazılması gerektiğini unutmayınız. Velhasıl, identity’i oluşturalım ve belirtilen e-posta adresimizi kontrol edelim.Asp.NET Core - Amazon SES(Simple Email Service) İle E-Posta GönderimiGörüldüğü üzere doğrulama bağlantısı içeren bir mail almış bulunuyoruz. Oluşturduğumuz kimliği doğrulamak için mail’de ki linke tıklayalım ve ardından Amazon SES üzerinden identity’i kontrol edelim.Asp.NET Core - Amazon SES(Simple Email Service) İle E-Posta GönderimiEvet, artık identity oluşturduğumuza göre istediğimiz yöntemle mail gönderebiliriz 🙂

AWS Management Console Kullanarak E-Posta Gönderimi

AWS Management Console üzerinden Amazon SES mailbox simülatörü aracılığıyla uygulamamızın farklı e-posta gönderme senaryolarını nasıl işlediğini test edebiliriz.
Asp.NET Core - Amazon SES(Simple Email Service) İle E-Posta GönderimiBunun için yukarıdaki gibi ‘Send test email’ butonuna tıklayalım ve aşağıdaki gibi gerekli yapılandırmalarda bulunarak maili gönderelim;Asp.NET Core - Amazon SES(Simple Email Service) İle E-Posta GönderimiBurada görüldüğü üzere basit bir test mesajı oluşturmak için ‘Formatted’ sekmesi üzerinden ‘Custom’ bir senaryo belirliyoruz. Senaryoyu ‘Custom’ seçmemizin sebebi özel bir alıcı belirtmemize olanak sağlamasıdır. Ben çok fazla mail kurcalamayalım diye gönderenle alan maillerini aynı belirlemiş bulunuyorum. Ayrıca test sürecinde HTML kullanan veya ekler içeren daha karmaşık mail’leri de deneyebilmek için ‘Raw’ sekmesi üzerinden de yürüyebilirsiniz. Velhasıl, bu şekilde bir yapılandırmadan sonra posta kutumuzu kontrol edersek aşağıdaki gibi ilgili mailin geldiğini gözlemlemiş olacağız;Asp.NET Core - Amazon SES(Simple Email Service) İle E-Posta Gönderimi

AWS CLI ile E-Posta Gönderimi

AWS CLI kullanarak da e-posta gönderebilmekteyiz. Bunun için tabi ki de AWS CLI’ın yüklü olması gerekmektedir ki zaten sizde yüklü olduğuna inanıyorum. Hani ola ki yüklü değilse tee zamanında klavyeye aldığım şuradaki yazıda ilgili başlık altında anlatıldığı gibi yüklemeyi gerçekleştirebilir ve buradaki adımlara hazırbulunuşluluğunuzu sağlayabilirsiniz.

Velhasıl, AWS CLI üzerinden e-postayı aşağıdaki talimat eşliğinde gönderebiliriz;

aws ses send-email --from [gönderici mail] --to [alıcı mail] --text "...mail içeriği..." --subject "...konu..."

Misal olarak;

aws ses send-email --from gyildizmail@gmail.com --to gyildizmail@gmail.com --text "doldur be meyhaneci, boş kalmasın kadehim..." --subject "Doldur Doldur Doldur Doldur Doldurrrrr Gitsinnn"

Asp.NET Core - Amazon SES(Simple Email Service) İle E-Posta Gönderimi

Asp.NET Core İle E-Posta Gönderimi

Şimdiye kadar her ne kadar biz yazılımcılar açısından pekte dikkat çekmesede Amazon SES üzerinden e-posta göndermenin iki kolay yolunu değerlendirmiş bulunuyoruz. Şimdi esas olarak Amazon SES ile birlikte Asp.NET Core uygulamalarından nasıl e-posta gönderebileceğimizi inceleyeceğiz.

Tabi tam da bu noktada la hoca, daha SMTP ve .NET – AWS SDK kullanarak e-posta göndermeyi incelemedik! dediğinizi duyar gibiyim 🙂 Tamammm sakin… Bilmeniz gereken Amazon SES ile Asp.NET Core’dan e-posta göndermenin programatik olarak iki yolu vardır. Bu yollarda zaten geriye kalan bu iki teknikten ibarettir 😉 Şimdi öncelikle SMTP üzerinden Asp.NET Core’da e-posta göndermeyi inceleyelim. Ardından .NET – AWS SDK ile gönderimi değerlendireceğiz.

SMTP Üzerinden E-Posta Gönderimi

SMTP ile e-posta gönderebilmek için uygulamamızda kullanıcı adı, şifre, port ve server bilgileri gibi ihtiyaç olan verileri koordine edecek olan .NET için geliştirilmiş Mailkit paketin yüklenmesi gerekmektedir. Bunu birazdan yükleyeceğiz. Bunun için öncelikle SMTP Credentials oluşturmamız gerekmektedir.
Asp.NET Core - Amazon SES(Simple Email Service) İle E-Posta GönderimiHaliyle bunun için de yandaki görselde olduğu gibi soldaki menü üzerinden ‘SMTP settings’ sekmesine tıklayalım ve açılan sayfadan ‘Create SMTP credentials’ butonuna tıklayarak kullanıcı ayrıntılarına gelelim. Burada aşağıdaki ekran görüntüsünden de anlaşılacağı üzere uygulamamız tarafından host adresi olarak kullanılacak olan bir SMTP endpoint sunulmaktadır.Asp.NET Core - Amazon SES(Simple Email Service) İle E-Posta GönderimiVelhasıl, yeni bir kimlik bilgisi oluşturmak için ‘Create SMTP credentials’ butonuna tıkladığımızda yeni bir kullanıcı oluşturulabilmesi için AWS IAM servisine yönlendirme gerçekleştirilecektir.Asp.NET Core - Amazon SES(Simple Email Service) İle E-Posta GönderimiAsp.NET Core - Amazon SES(Simple Email Service) İle E-Posta GönderimiBu yönlendirme neticesinde oluşturulacak kullanıcı bilgileri görüldüğü üzere hali hazırda gelmektedir. Tabi sizler isterseniz kullanıcı adına istediğiniz şekilde müdahale edebilir ya da ufak tefek yetki özelleştirmelerinde bulunabilirsiniz. Ben hiç dokunmaksızın direkt olarak kullanıcıyı oluşturmayı tercih ediyorum. Ve nihai olarak SMTP credentials’a dair bilgileri yandaki görselde olduğu gibi elde ediyorum. Bu bilgileri birazdan uygulamada kullanabilmek için SMTP endpoint’i ile birlikte elimizin altında bulundurmamızda fayda vardır.

Evet, SMTP kimlik bilgileri hazır olduğuna göre artık uygulamaya odaklanabiliriz. Tabi uygulama seviyesinde ilk olarak bi kaç satır önce bahsettiğim MailKit paketini yükleyerek devam edelim.

Bu kütüphaneleri kısaca tanıtmak gerekirse eğer; MailKit, e-posta gönderme ve alma işlemleri için kullanılırken, MimeKit ise e-posta içeriği oluşturmak için MailKit ile birlikte kullanılmaktadır.

Kütüphaneleri uygulamaya yükledikten sonra gönderilecek mail’in bilgilerini temsil edecek aşağıdaki modeli oluşturalım;

    public class MailRequest
    {
        public string? To { get; set; }
        public string? Subject { get; set; }
        public string? Body { get; set; }
    }

Ardından e-posta’yı gönderebilmek için uygulamayı SMTP credentials bilgileriyle yapılandırmamız gerekecektir. Bunun için de ilgili verileri aşağıdaki gibi appsettings.json’a taşıyalım;

  "MailSettings": {
    "Host": "email-smtp.us-west-2.amazonaws.com",
    "Port": 587,
    "From": "gyildizmail@gmail.com",
    "SMTP": {
      "Username": "AKIA5FTZEZM73RKKNRAK",
      "Password": "BDuoLv/fzDsYeAdICDYAhyCndLj27+aS5PKbboL0h3i2"
    }
  }

Ve son olarak da MailKit paketi eşliğinde bu yapılandırmaları kullanarak e-posta göndermek için aşağıdaki gibi bir servis oluşturalım;

using AmazonSES.Example.Models;
using AmazonSES.Example.Services.Abstractions;
using MailKit.Net.Smtp;
using MailKit.Security;
using MimeKit;

namespace AmazonSES.Example.Services
{
    public class MailService(IConfiguration configuration) : IMailService
    {
        public async Task SendEmailAsync(MailRequest mailRequest)
        {
            MimeMessage email = new();
            email.From.Add(new MailboxAddress("Gençay YILDIZ", configuration["MailSettings:From"]));
            email.To.Add(MailboxAddress.Parse(mailRequest.To));
            email.Subject = mailRequest.Subject;

            BodyBuilder bodyBuilder = new();
            bodyBuilder.HtmlBody = mailRequest.Body;
            email.Body = bodyBuilder.ToMessageBody();

            using SmtpClient smtpClient = new();
            await smtpClient.ConnectAsync(configuration["MailSettings:Host"], int.Parse(configuration["MailSettings:Port"]), SecureSocketOptions.StartTls);
            await smtpClient.AuthenticateAsync(configuration["MailSettings:SMTP:Username"], configuration["MailSettings:SMTP:Password"]);
            await smtpClient.SendAsync(email);
            await smtpClient.DisconnectAsync(true);
        }
    }
}

Yapılan çalışmaya göz atarsanız eğer pekte izah edilmeyi gerektiren bir durum olmadığı için hızlıca ilerleyelim ve bu servisi aşağıdaki gibi uygulamanın IoC Container’ına ekleyelim.

.
.
.
builder.Services.AddSingleton<IMailService, MailService>();
.
.
.

Evet, artık servisimizi kullanmaya odaklanabiliriz. Hemen aşağıdaki gibi bir minimal api endpoint’i oluşturalım ve Postman üzerinden gerekli testi gerçekleştirelim.

.
.
.
app.MapPost("/send-mail", async (MailRequest mailRequest, IMailService mailService)
    => await mailService.SendEmailAsync(mailRequest));

app.Run();

Asp.NET Core - Amazon SES(Simple Email Service) İle E-Posta GönderimiAsp.NET Core - Amazon SES(Simple Email Service) İle E-Posta GönderimiEvet, görüldüğü üzere .NET Core uygulamasında SMTP üzerinden başarıyla e-posta gönderimini gerçekleştirmiş bulunuyoruz.

Şimdi sıra son olarak da .NET – AWS SDK ile e-posta gönderimini incelemeye gelmiştir.

.NET – AWS SDK İle E-Posta Gönderimi

Evet, artık aynı işlemin AWS SDK üzerinden nasıl yapılacağına göz atacağız. Bunun için öncelikle aşağıdaki paketlerin uygulamaya yüklenmesi gerekmektedir;

AWS SDK üzerinden çalışacağımızdan dolayı AWS CLI profile yapılandırmasından istifade edeceğiz. Bunun için de appsettings.json dosyasına aşağıdaki bilgileri ekleyelim;

{
  .
  .
  .,
  "AWS": {
    "Profile": "default",
    "Region": "us-west-2"
  }
  .
  .
  .
}

Ardından e-posta gönderebilmek için aşağıdaki servisi geliştirelim;

    public class SESService(IConfiguration configuration, IAmazonSimpleEmailService amazonSimpleEmailService) : ISESService
    {
        public async Task SendEmailAsync(MailRequest mailRequest)
        {
            Body mailBody = new(new Content(mailRequest.Body));
            Message message = new(new Content(mailRequest.Subject), mailBody);
            Destination destination = new([mailRequest.To]);
            SendEmailRequest request = new(configuration["MailSettings:From"], destination, message);
            SendEmailResponse response = await amazonSimpleEmailService.SendEmailAsync(request);
            Console.WriteLine(response.HttpStatusCode);
        }
    }

Ve ‘Program.cs’ dosyası üzerinden de aşağıdaki servis yapılandırmasında bulunalım;

.
.
.
builder.Services.AddDefaultAWSOptions(builder.Configuration.GetAWSOptions());
builder.Services.AddAWSService<IAmazonSimpleEmailService>();

builder.Services.AddSingleton<ISESService, SESService>();
.
.
.

İşte bitti. Şimdi bu yapılanmayı test edebileceğimiz öncekine benzer bir endpoint oluşturalım ve ardından görselde olduğu gibi Postman üzerinden testimizi gerçekleştirelim;

.
.
.
app.MapPost("/send-mail", async (MailRequest mailRequest, ISESService sesService)
    => await sesService.SendEmailAsync(mailRequest));

app.Run();

Asp.NET Core - Amazon SES(Simple Email Service) İle E-Posta GönderimiAsp.NET Core - Amazon SES(Simple Email Service) İle E-Posta GönderimiEvet, görüldüğü üzere AWS SDK üzerinden de başarılı bir şekilde e-posta gönderimini gerçekleştirmiş bulunuyoruz. Kanaatimce .NET uygulamaları için en doğru ve konforlu yöntemin AWS SDK ile gerçekleştirildiğini düşünüyorum. Tabi ihtiyaç durumlarında benimsenecek yaklaşım ve gösterilecek davranış tabi ki de sizlerin tercihine kalmış.

Nihai olarak;
E-posta gibi yazılımlar açısından kritik bir kitle/birey iletişim aracını efektif ve gönül rahatlığıyla kullanabilmek için Amazon SES’i neden tercih etmemiz gerektiğine ve nasıl faydalanabileceğimize dair istişaremizi etmiş bulunuyoruz. Bundan gayrısı hayrını görmeniz dileğiyle…

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Not : Örnek çalışmaya aşağıdaki github adresinden erişebilirsiniz.
https://github.com/gncyyldz/AmazonSES.Example

Bunlar da hoşunuza gidebilir...

1 Cevap

  1. burak dedi ki:

    Merhaba nasil yapilacagini cok iyi anlatmissiniz ancak ben mimarisini merak ediyorum sanal ortamda https jss gateway ve lambdanin nasil isledigini neyin nerede gorevli oldugunu anlatan bir yaziyi sizden dinlemek guzel olurdu

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir