AWS Amplify İle E-Posta Gönderimi

Hatice Edis
wereprotein
Published in
5 min readFeb 1, 2022

--

Herkese selamlar! 👋

Bu yazıda “AWS Amplify ile E-Posta gönderimi nasıl yapılır?” sorusuna cevap vermeye çalışacağım. Bu sorunun çözümünda Amazon’un Amazon Simple Email Service (SES) servisini kullanacağız.

SES’i kullanabilmemiz için öncelikle ihtiyacımız olan şey Amazon üzerinde çalışacak bir lambda fonksiyonu yazmak.

Not: Bu yazı için Back-End’i Amplify ile yönetilen projeleri baz alacağız. Bundan dolayı Amplify hakkında daha geniş bilgiye ihtiyacınız varsa aşağıdaki linklere bakabilirsiniz :)

Haydi başlayalım ✌🏻

İlk olarak projeyi ele alalım. Bu proje, bir Todo App olsun ve bir de iletişim sayfası olsun. İsteyelim ki, iletişim formundan alınan kayıt ile hem belirlediğimiz kişiye e-posta gitsin, hem de alınan kayıt DynamoDB’de tutulsun. GraphQL API ile projede var olan şemamız ise aşağıdaki gibi olsun. (Basit iki örnek model ele aldık.)

type Todo @model {
id: ID!
name: String!
description: String
}
type Contact @model{
id: ID!
name: String!
email: String!
message: String!
}

Arayüz tarafında ise, formun bulduğun sayfa React ile yazılmış bir uygulama içinde aşağıdaki gibi olsun.

Burada formu kaydederken gönderdiğimiz createContact mutation’ı ile, DynamoDB’de oluşturduğumuz Contact adlı tablo üzerinde yeni bir kayıt oluşturuluyor. Yani, ilk isteğimiz böylece gerçekleşmiş oluyor. Şimdi gelelim E-Posta gönderimine.

İlk olarak girişte de bahsettiğim gibi, bir lambda function oluşturmamız gerekiyor. Bunun için; amplify add function diyerek yeni bir lambda function oluşturuyoruz.

İlk olarak bize lamba function’ın paketleme türünü soruyor. Burada serverless function`ı seçiyoruz.

Daha sonra lamba function’a vereceğimiz isimi ve hangi dil ile çalışacağımızı soruyor. Burada NodeJS ile ilerleyeceğiz.

Daha sonra ise yazacağımız lambda function’ın işlevine yönelik bir template seçmemizi istiyor. Lambda Trigger ‘ı seçiyoruz. Sonrasında ise bu Lambda Trigger’ın hangi olay ile çalışacağız belirtmemiz gerekiyor. Bunun için ise, DynamoDB’ye ait Contact tablosundaki olayları dinleyeceğimiz için, Amazon DynamoDB Stream`i seçiyoruz.

Ve burada bizden hangi tablo veya tabloları dinlemek istediğimizi soruyor. (Yani GraphQL API tarafında oluşturduğumuz model ile oluşturacağımız lambda function’ı bu şekilde birbiriyle ilişkilendiriyoruz.)

Burada Contact’a gelip, space ile tabloyu seçiyoruz.

Sonrasında ise, daha fazla ayar yapmak isteyip istemediğimizi soruyor. (Gelişmiş Ayarlar). Buna evet diyerek bir ayar daha yapmamız lazım. E-Postanın gönderiminde kullanacağımız adresleri, ortam değişkeni olarak tanımlarsak güvenli olacaktır. (Dilerseniz tek adres ile de yönetebilirsiniz.)

Burada diğer 3 ayarı hayır diyerek geçebiliriz.

Burada gönderen ve alıcı olarak iki e-posta adresi tanımladık.

Ve lambda function oluştu. Bize seçtiğimiz editörde, oluşturduğumuz function’ın çalışacağı index.js dosyasını açıyor.

Artık burayı düzenleyebiliriz :) Ama öncesinde yapmamız gerek bir şey var. Tanımladığımız e-posta adreslerini doğrulamamız gerek. Bunun için;

amplify console diyerek amazon console’a gidiyoruz. Arama kısmına “SES” yazıp; çıkan sonuçta “Amazon Simple Email Service” i seçiyoruz.

Create identity diyerek “email” veya “domain” adresi gidiyoruz. Ben e-posta adresi ile devam edeceğim. Bu tanımlamaları yaptıktan sonra, girdiğimiz e-posta adresine doğrulama linki gelecektir. Sonrasında ise, Verified identities kısımdan doğrulanmış e-posta adreslerimizi görebiliriz.

Buradaki listeden e-postaların detayına gidip oluşturulan kaynak adları almamız gerekiyor. Bunlar bize lazım olacak :)

Şöyle ki, tanımladığımız adresleri lambda üzerinde kullanabilmemiz için e-posta izinlerini güncellememiz gerekiyor. Bunu yaparken de, oluşturulan kaynak adlarını kullanacağız.

Editörümüz açıp,

{functionName}-cloudformation-template.json

dosyasına gidiyoruz.

Bu dosyada lambdaexecutionpolicy ayarını bulmamız gerekir.

Burada lambdaexecutionpolicy objesindeki Statement alanına her iki e-posta adresi için oluşturan kaynak adlarını girmek gerekecek. Burada SES’in sendEmail aksiyonu için Resource’da belirtilen e-posta adresine izin vermiş olacağız.

{ 
"Action": ["ses:SendEmail"],
"Effect": "Allow",
"Resource": "your email arn adress"
}

Bunu da yaptığımıza göre, atık NodeJS ile çalışacak olan fonksiyonumuzu yazabiliriz :)

Lambda function’ı oluşturduğumuzda açılan dosyaya geri dönüyoruz.

Burada bizim için hali hazırda function oluşturmuş, biz bunu silip düzenleyeceğiz.

İlk olarak aws-sdk paketini kullanacağız. Bunu import etmek ile başlayalım. Daha sonra bu paketin içindeki SES sınıfından yararlanacağız. Bu sınıfın sendEmail methodunu kullanacağız.

Daha sonra function’dan gelen event deki recordları kontrol edip bu recorlarda eventName’ı INSERT olanı buluyoruz. Burada 3 tip eventName geliyor. INSERT, MODIFY ve REMOVE. Biz e-posta’yı INSERT (yeni kayıt oluşturma) gerçekleşmişse göndereceğimiz için bunun kontrolünü yapıyoruz.

Sonrasında bu kaydın DynamoDB üzerindeki bilgilerini NewImage ile alabiliriz (eğer kullanmak istiyorsak).

En son ise SES’in sendEmail methodundaki parametreleri giriyoruz. env. olarak tanımladığımız e-posta adreslerini ve e-posta içeriğini de tanımladıktan sonra her şey tamamlandı :)

İşlemler bittiğine göre, amplify push diyerek lambda function’ı gönderebiliriz :)

O zaman test zamanı :)

Umarım sizler için faydalı bir içerik olmuştur. Tekrar güzel içeriklerle görüşmek üzere, sağlıcakla kalın ❤️

--

--