Geçiş rehberi
Amazon SES'ten Mail.Land'e geçiş
SES'ten geçiş, AWS kimlik bilgilerini, yapılandırma kümelerini ve olay hedeflerini tek bir API anahtarı ve imzalı webhook'larla değiştirir. Bu rehber her yaygın SendEmail alanını eşler ve kod değişikliği gerektirenleri listeler.
# Before (Amazon SES)
SMTP_HOST=email-smtp.eu-central-1.amazonaws.com # your Region's endpoint
SMTP_PORT=587 # STARTTLS (465 for TLS wrapper)
SMTP_USER=<SES SMTP user name for that Region>
SMTP_PASS=<SES SMTP password for that Region>
# After (Mail.Land)
SMTP_HOST=smtp.mail.land
SMTP_PORT=587 # STARTTLS; 465 is not offered
SMTP_USER=apikey # any value; Mail.Land ignores it
SMTP_PASS=ml_pet_... # a Mail.Land key with SMTP enabledMail.Land'de Amazon SES kavramları
| Amazon SES | Mail.Land |
|---|---|
| IAM kullanıcısı ve SigV4 istek imzalama | X-API-Key başlığında API anahtarı (kimlik bilgisi) |
| AWS bölgesi başına SMTP kimlik bilgileri | SMTP parolası olarak kullanılan aynı API anahtarı |
| Doğrulanmış kimlik (alan adı) ve özel MAIL FROM | Doğrulanmış alan adı (SPF, DKIM, DMARC ve dönüş yolu) |
| Yapılandırma kümeleri ve olay hedefleri (SNS, EventBridge, Firehose) | HMAC-SHA256 ile imzalanan ve doğrudan uç noktanıza gönderilen webhook'lar |
| Hesap düzeyinde engelleme listesi | Türü ve kapsamı olan engelleme listeleri |
| E-posta şablonları (Handlebars) | {{name}} yer tutuculu şablonlar |
| Kişi listeleri ve konular (topics) | Posta listeleri, kampanyalar ve abonelik iptali yönetimi (Pro ve Max) |
| Sandbox | Sandbox anahtarları (ml_set_, ml_sem_): sandboxBehavior LogOnly iken istekler kabul edilir ve kaydedilir ama hiçbir zaman teslim edilmez |
Doğru API anahtarlarını oluşturun
Yazılacak IAM politikası yoktur. Bir Mail.Land anahtarının ön eki modunu ve akışını gösterir; her uygulama ve akış için bir anahtar oluşturun ve onu kullanan alan adları ile IP adresleriyle sınırlandırın.
| Ön ek | Ne için |
|---|---|
ml_pet_ | Üretim, işlemsel: makbuzlar, parola sıfırlama, uyarılar. İstek başına en fazla 5 alıcı. |
ml_pem_ | Üretim, pazarlama: send-batch ile bültenler ve toplu gönderimler, çağrı başına en fazla 10.000 alıcı. |
ml_set_ | Sandbox, işlemsel: sandboxBehavior LogOnly (varsayılan) iken istekler kabul edilir ve kaydedilir ama hiçbir zaman teslim edilmez. Entegrasyon testleriniz için kullanın. |
Her anahtar API'ye, SMTP'ye veya ikisine, seçili alan adlarına ve bilinen IP adreslerine sınırlandırılabilir. Anahtar bir kez gösterilir; Mail.Land yalnızca karmasını (hash) saklar.
SMTP'yi değiştirin: sunucuyu ve kimlik bilgilerini güncelleyin
SES SMTP kimlik bilgileri IAM üzerinden oluşturulur ve her AWS bölgesinde farklıdır. Mail.Land ise API anahtarınızı parola olarak kullanır ve kullanıcı adını yok sayar.
| Ayar | Amazon SES | Mail.Land |
|---|---|---|
| Sunucu | email-smtp.<region>.amazonaws.com | smtp.mail.land |
| Port | STARTTLS ile 25, 587 veya 2587 ya da TLS wrapper ile 465 ve 2465 | STARTTLS ile 587 |
| Kullanıcı adı | O bölgenin SMTP kullanıcı adı | Herhangi bir değer, örneğin apikey |
| Parola | O bölgenin SMTP parolası | SMTP'si etkin bir Mail.Land API anahtarı (işlemsel e-posta için ml_pet_) |
Mail.Land oturum açmayı yalnızca STARTTLS'ten sonra kabul eder; 465 ve 2465 portları sunulmaz. Uygulamanız TLS wrapper kullanıyorsa STARTTLS ile 587'ye geçirin. Mail.Land, X-SES-CONFIGURATION-SET gibi X-SES-* başlıklarını dikkate almaz; bu yüzden onları kaldırabilirsiniz. Mesajlar 15 MiB'a kadar olabilir.
API çağrısını değiştirin
SES istekleri genellikle bir AWS SDK'sı aracılığıyla AWS Signature Version 4 ile imzalanır. Mail.Land yalnızca X-API-Key başlığına ve daha düz bir JSON gövdesine ihtiyaç duyar. İşte ikisinde de aynı mesaj ve şablonlu bir gönderim.
aws sesv2 send-email --region eu-central-1 \
--from-email-address "[email protected]" \
--destination '{"ToAddresses":["[email protected]"]}' \
--reply-to-addresses "[email protected]" \
--email-tags Name=type,Value=order-shipped \
--content '{
"Simple": {
"Subject": { "Data": "Order 12345 has shipped" },
"Body": {
"Text": { "Data": "Your order is on its way." },
"Html": { "Data": "<p>Your order is on its way.</p>" }
}
}
}'curl -X POST https://api.mail.land/v1/transactional/send \
-H "X-API-Key: $MAILLAND_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"from": { "email": "[email protected]", "name": "Your Shop" },
"to": [{
"email": "[email protected]", "name": "Jane",
"variables": { "orderNumber": "12345" }
}],
"replyTo": "[email protected]",
"subject": "Order {{orderNumber}} has shipped",
"textContent": "Your order {{orderNumber}} is on its way.",
"htmlContent": "<p>Your order {{orderNumber}} is on its way.</p>",
"tags": ["order-shipped"]
}'
# MAILLAND_API_KEY=ml_pet_... (production, transactional)Gönderim çağrısı için alan eşlemesi
SES API v2 SendEmail'den (POST /v2/email/outbound-emails) POST /v1/transactional/send'e.
| Amazon SES | Mail.Land | Not |
|---|---|---|
AWS Signature Version 4 | X-API-Key: <key> | İstek imzalama yok; anahtarı HTTPS üzerinden gönderin. |
FromEmailAddress | from.email, from.name | Adres doğrulanmış bir alan adında olmalıdır. |
Destination.ToAddresses | to[].email, to[].name | İşlemsel anahtarla istek başına en fazla 5 alıcı; her biri ayrı bir kopya alır. |
Destination.CcAddresses, BccAddresses | Yok | Desteklenmez. Her alıcıya ayrı bir mesaj gönderin. |
ReplyToAddresses | replyTo | Liste yerine tek bir adres dizesi. Birden fazla kullandıysanız birini tutun. |
Content.Simple.Subject.Data | subject | Şablon kullanmıyorsanız zorunludur. |
Content.Simple.Body.Html.Data | htmlContent | |
Content.Simple.Body.Text.Data | textContent | |
Content.Simple.Headers [{ Name, Value }] | customHeaders | Dizi yerine başlık adları ve değerlerinden oluşan bir nesne. |
Content.Simple.Attachments[].FileName, ContentType, RawContent, ContentId, ContentDisposition | attachments[].fileName, contentType, content, contentId, inline | Base64 içerik. Satır içi görsel için inline: true ayarlayın. En fazla 10 ek ve toplam 10 MiB. |
Content.Raw.Data (MIME) | API'de yok | Hazır MIME mesajlarını bunun yerine SMTP rölesi üzerinden gönderin. |
Content.Template.TemplateName, TemplateArn | templateId | Önce şablonu Mail.Land'de yeniden oluşturun. |
Content.Template.TemplateData | variables, to[].variables | JSON dizesi yerine bir JSON nesnesi. |
EmailTags [{ Name, Value }] | tags | Ad ve değer çiftleri yerine dizelerden oluşan bir dizi. |
ConfigurationSetName | Yok | Webhook'lar ve izleme, Mail.Land hesabınızda ve her alan adında ayarlanır. |
ConfigurationOverrides.Tracking | tracking.opens, tracking.clicks | Alan adının açılma izleme tercihi önceliklidir. |
ListManagementOptions | Gönderim çağrısında yok | Pazarlama abonelik iptalleri Mail.Land listeleri ve kampanyalarıyla yönetilir. |
Karşılığı yok | scheduledAt | Bir mesajı 7 güne kadar ileriye zamanlayın. |
Karşılığı yok | X-Idempotency-Key başlığı | Saklama süresi içinde aynı anahtarla yapılan yeniden deneme, yeniden göndermek yerine özgün yanıtı döndürür. |
SES bir MessageId ile 200 yanıtı verir. Mail.Land; bir jobId, kabul edilen her alıcı için bir mesaj kimliği ve kabul edilen ile reddedilen alıcıların listeleriyle 202 Accepted yanıtı verir.
Alan adınızı ve DNS kayıtlarını ekleyin
Alan adını Mail.Land'e ekleyin ve panelin gösterdiği kayıtları yayımlayın. Gönderebilmek için SPF, DKIM ve DMARC'nin doğrulanması gerekir. Bunu SES hâlâ gönderim yaparken yapabilirsiniz.
| Kayıt | Ad | Değer | Not |
|---|---|---|---|
| SPF (TXT) | yourdomain.com | include:spf.mlnd.net | include'u mevcut SPF kaydınıza ekleyin. Bir alan adının yalnızca bir SPF kaydı olmalıdır. |
| DKIM (TXT) | mlnd._domainkey.yourdomain.com | v=DKIM1; k=rsa; p=... | Seçici (selector) mlnd olduğundan kayıt, SES'in kullandığı DKIM kayıtlarının yanında durur. |
| DMARC (TXT) | _dmarc.yourdomain.com | v=DMARC1; p=... | Zorunludur. Tek bir DMARC kaydı tutun; politikası olan mevcut bir kayıt yeterlidir. |
| Dönüş yolu (CNAME) | bounce.yourdomain.com | bounce.mlnd.net | DNS only olarak, proxy olmadan ayarlayın. SES'teki özel MAIL FROM alan adınız bu adı zaten kullanıyorsa SES göndermeyi bırakana kadar koruyun. |
SES'in DNS kayıtlarını taşıma bitene kadar koruyun ve yalnızca son mesajı gittikten sonra kaldırın.
Önce engelleme listenizi aktarın
SES hesap düzeyindeki engelleme listesi AWS bölgesi başına geçerlidir. Gönderim yaptığınız her bölgeden ListSuppressedDestinations (aws sesv2 list-suppressed-destinations) ile dışa aktarın, ardından uygun tür ve kapsamla, panelde veya POST /v1/transactional/suppressions/import ile Mail.Land'e aktarın.
| SES nedeni veya kaynağı | Mail.Land türü | Kapsam |
|---|---|---|
| BOUNCE | HardBounce | Global |
| COMPLAINT | Complaint | Global |
| Kişi listesi konularındaki abonelik iptalleri | Unsubscribe | Marketing; ya da yalnızca eşleşen Mail.Land posta listesine gönderilen kampanyalara uygulanan List |
SES listeye yalnızca kalıcı geri dönmeleri ekler ve Gmail spam bildirimleri listeye ulaşmaz; bu yüzden kendi sistemlerinizin tuttuğu engellemeleri de aktarın. Mail.Land üzerinden ilk gönderimden önce aktarın; böylece aboneliğini iptal edenler baştan engelli kalır.
Webhook'larınızı Mail.Land'e yönlendirin
Yapılandırma kümesini ve olay hedefini bir Mail.Land webhook'uyla değiştirin: HTTPS uç noktanızı ekleyin, olayları seçin ve X-MLND-Signature başlığını o webhook'un gizli anahtarıyla doğrulayın. Onaylanacak bir SNS aboneliği yoktur.
| SES olayı | Mail.Land olayı | Not |
|---|---|---|
Send | Şimdilik yok | message.sent henüz kullanılamıyor; 202 yanıtı kabulü doğrular. |
Teslimat (Delivery) | message.delivered | |
DeliveryDelay | message.deferred | |
Geri dönme (Bounce) | message.bounced | |
Complaint | message.complained | |
Subscription | message.unsubscribed | Alıcının kendi abonelik iptali için gönderilir; API üzerinden yaptığınız değişiklikler için gönderilmez. |
Reject | Yok | |
RenderingFailure | Yok | Eksik bir şablon değeri, API çağrısı sırasında 422 TEMPLATE_VARIABLE_MISSING ile reddedilir. |
Açılma, tıklama (Open, Click) | Henüz yok | Açılma ve tıklama olayları katalogda yer alır ama bugün gönderilmez. |
event_id'ye göre yinelenenleri ayıklayın; yeniden denenen teslimat aynı olay kimliğini taşır. Bir durum sonradan düzeltilebilir; bu yüzden son bir olaydan sonra da olayları işlemeye devam edin ve status_version'ı karşılaştırın.
Şablonlarınızı yeniden oluşturun
Her şablonu Mail.Land panelinde veya şablon API'siyle oluşturun, ardından templateId ve variables ile gönderin. Her yer tutucunun bir değeri olmalıdır; yoksa gönderim 422 koduyla ve eksik adlarla reddedilir.
| Amazon SES | Mail.Land |
|---|---|
{{firstName}} | {{firstName}} |
{{contact.firstName}} (iç içe) | {{firstName}} |
{{#each}}, {{#if}} ... {{else}} | Yok |
Satır içi partial'lar ({{> name}}) | Yok |
Mail.Land yer tutucuları sadedir: iç içe değer, koşul, döngü veya partial yoktur. Düz değerler geçirin ve mantığı uygulamanıza taşıyın ya da her varyant için bir şablon tutun.
Adım adım geçiş
- Gönderim alan adınızı Mail.Land'e ekleyip doğrulayın ve include:spf.mlnd.net'i mevcut SPF kaydınıza ekleyin.
- Kullandığınız her AWS bölgesinin engelleme listesini dışa aktarıp içe aktarın.
- Her uygulama ve akış için alan adlarınız ve IP adreslerinizle sınırlı Mail.Land anahtarları oluşturun.
- Şablonlarınızı yeniden oluşturun ve her olay hedefini bir webhook'la değiştirin.
- sandboxBehavior LogOnly olan bir sandbox anahtarı oluşturun ve entegrasyon testlerinizi e-posta teslim etmeden Mail.Land'e karşı çalıştırın.
- Denetiminizdeki adreslere gerçek mesajlar gönderin ve e-posta günlüğünde kontrol edin.
- Bir uygulamayı veya trafiğin küçük bir bölümünü taşıyın, ardından teslimatı, geri dönmeleri ve şikâyetleri izleyin.
- İki sağlayıcı birlikte çalışırken abonelik iptallerini iki yönde senkron tutun: yeni abonelik iptallerini, şikâyetleri ve geri dönmeleri SES'ten Mail.Land'e ve Mail.Land'den SES'e kopyalayın; kalan trafiği taşımadan önce son bir senkronizasyon yapın.
- Alan adınızın ısınma sürecini kontrol edin: Free ve Pro'da yeni bir alan adının aşamalarla artan bir günlük sınırı vardır ve bu sınırı aşan gönderimler reddedilir. Geçişi bu sınırlar içinde planlayın veya bize özel bir takvim sorun. Max'te ısınma aşaması yoktur.
- Ardından kalanını taşıyın ve SES'i son mesajları gidene kadar etkin tutun.
Kaynaklar
Bu rehberde kullanılan AWS'nin herkese açık sayfaları.
- [1]Amazon SES API v2: SendEmailhttps://docs.aws.amazon.com/ses/latest/APIReference-V2/API_SendEmail.html4 Kasım 2026 tarihinde kontrol edildi
- [2]Amazon SES: SMTP uç noktasına bağlanmahttps://docs.aws.amazon.com/ses/latest/dg/smtp-connect.html4 Kasım 2026 tarihinde kontrol edildi
- [3]Amazon SES: SMTP kimlik bilgilerini edinmehttps://docs.aws.amazon.com/ses/latest/dg/smtp-credentials.html4 Kasım 2026 tarihinde kontrol edildi
- [4]Amazon SES: gelişmiş e-posta kişiselleştirmehttps://docs.aws.amazon.com/ses/latest/dg/send-personalized-email-advanced.html4 Kasım 2026 tarihinde kontrol edildi
- [5]Amazon SES: olay yayımlamahttps://docs.aws.amazon.com/ses/latest/dg/monitor-using-event-publishing.html4 Kasım 2026 tarihinde kontrol edildi
- [6]Amazon SES: hesap düzeyinde engelleme listesihttps://docs.aws.amazon.com/ses/latest/dg/sending-email-suppression-list.html4 Kasım 2026 tarihinde kontrol edildi
Sık sorulan sorular
Test ederken SES üzerinden göndermeye devam edebilir miyim?
Evet. Bir alan adını Mail.Land'de doğrulamak, SES'in o alan adı için göndermesini durdurmaz; ikisini birlikte çalıştırıp trafiği kademeli olarak taşıyabilirsiniz.
Hâlâ bir AWS SDK'sına ihtiyacım var mı?
Hayır. Her HTTP istemcisi Mail.Land API'sini X-API-Key başlığıyla çağırabilir ve her SMTP kütüphanesi röleyle çalışır.
SendBulkEmail ile gönderdiğim toplu e-postayı nasıl gönderirim?
Bir pazarlama anahtarıyla (ml_pem_) POST /v1/transactional/send-batch kullanın. Her biri kendi değişkenleriyle 10.000 alıcıya kadar kabul eder.
Mail.Land nerede çalışıyor?
Mail.Land'de seçilecek bölge yoktur. Verilerinizin birincil kopyası Almanya'dadır; AB dışındaki sağlayıcılar GDPR sayfamızda listelenir.
Amazon SES'ten geçmeye hazır mısınız?
Ücretsiz bir hesap oluşturun ve ilk testinizi bugün gönderin. Yardım isterseniz kurulumunuzu bize anlatın.