Brevo Transactional Email Kurulumu: SMTP + API Yapılandırma Rehberi
Brevo (eski Sendinblue) transactional email SMTP kurulumu, API anahtarı, SPF/DKIM ayarları ve WordPress entegrasyonu. Gerçek vaka ile adım adım.

E-ticaret sitenizde bir müşteri sipariş verdi, ama onay maili spam'e düştü. Ya da hiç gitmedi. Sorun hosting firmanızın SMTP sunucusu değil, sorun transactional email altyapınızın olmaması. Ben FUTIA'da 2023'ten beri Brevo (eski adıyla Sendinblue) ile günde 3.000+ sipariş onayı, şifre sıfırlama ve sepet hatırlatma maili gönderiyorum. Bu yazıda Brevo'nun SMTP kurulumunu, API entegrasyonunu ve SPF/DKIM yapılandırmasını gerçek bir vaka üzerinden anlatacağım.
Brevo, özellikle e-ticaret ve SaaS projeler için tasarlanmış bir transactional email platformu. SendGrid veya Mailgun'a göre daha kullanıcı dostu, AWS SES'e göre daha az teknik bilgi gerektiriyor. Ücretsiz hesapta günde 300 mail hakkı var, ücretli planda ise saniyede 200 mail gönderebiliyorsunuz. Ben diolivo.com.tr projesinde CartBounty sepet kurtarma otomasyonunu Brevo SMTP üzerinden kurmuştum. 6 ayda %340 trafik büyümesinin yanında, sepet kurtarma mailleri ortalama %18 geri dönüş oranı yakaladı. Bu yazıda aynı süreci sizin projenize nasıl uygulayacağınızı göstereceğim.
Brevo Hesap Açma ve API Anahtarı Alma
İlk adım bir Brevo hesabı oluşturmak. brevo.com adresine girip Sign Up butonuna tıklayın. E-posta doğrulaması yaptıktan sonra dashboard'a yönlendirileceksiniz. Ücretsiz hesap 300 mail/gün ile sınırlı, ama test ve küçük projeler için yeterli. Ben FUTIA'da ilk 3 ay ücretsiz hesapla çalıştım, sonra Starter planına (25 EUR/ay, 20.000 mail) geçtim.
API anahtarı almak için sağ üst köşedeki profil ikonuna tıklayın, SMTP & API menüsüne girin. Burada iki seçenek var: SMTP credentials ve API Keys. SMTP, WordPress veya WooCommerce gibi hazır CMS'lerde kullanılıyor. API ise custom kod entegrasyonu için. Ben her iki yöntemi de kullanıyorum, çünkü bazı projelerde WP SMTP eklentisi daha hızlı, bazılarında ise Brevo PHP SDK daha esnek.
API anahtarı oluşturmak için API Keys sekmesine gidin, Create a New API Key butonuna tıklayın. İsim verin (örneğin "Production WooCommerce"), v3 versiyonunu seçin. Oluşturulan anahtarı kopyalayıp güvenli bir yere kaydedin. Bu anahtar bir daha görüntülenemez, kaybederseniz yenisini oluşturmanız gerekir. SMTP şifresi ise SMTP & API sayfasındaki "SMTP" sekmesinde görünüyor, bu şifreyi de kopyalayın.
SMTP Bilgileri
Brevo SMTP sunucu bilgileri şöyle:
- Host: smtp-relay.brevo.com
- Port: 587 (TLS) veya 465 (SSL)
- Kullanıcı adı: Brevo hesabınızın e-posta adresi
- Şifre: SMTP & API sayfasındaki SMTP şifresi
Bu bilgileri WordPress SMTP eklentilerinde veya custom PHP kodunda kullanacaksınız. Port 587 genellikle daha az sorunlu, çünkü bazı hosting firmaları 465'i blokluyor.
WordPress ve WooCommerce SMTP Kurulumu
WordPress sitesinde Brevo SMTP kullanmak için WP Mail SMTP eklentisini öneriyorum. Ücretsiz, güvenilir ve 3 milyon+ aktif kurulum var. Eklentiyi yükledikten sonra Settings > WP Mail SMTP menüsüne gidin. Mailer olarak "Other SMTP" seçin.
Ayarlar şöyle:
- SMTP Host: smtp-relay.brevo.com
- SMTP Port: 587
- Encryption: TLS
- Authentication: ON
- SMTP Username: Brevo hesap e-postanız (örneğin info@futia.net)
- SMTP Password: Brevo SMTP şifreniz
From Email kısmına sitenizin resmî e-posta adresini yazın (örneğin siparis@siteniz.com). Bu adres Brevo'da doğrulanmış olmalı, yoksa mailler gönderilmez. From Name kısmına marka adınızı yazın (örneğin "Diolivo E-ticaret").
Kaydedin ve "Send Test Email" butonuna tıklayın. Kendi e-postanıza test maili gönderin. Eğer "Message sent!" uyarısı gelirse kurulum başarılı. Gelmezse SMTP şifresini kontrol edin, bazen kopyalarken başında veya sonunda boşluk kalabiliyor.
WooCommerce için ek bir ayar gerekmiyor, çünkü WooCommerce WordPress'in wp_mail() fonksiyonunu kullanıyor. WP Mail SMTP bu fonksiyonu override ediyor, dolayısıyla tüm sipariş onayları, şifre sıfırlama ve yönetici bildirimleri Brevo üzerinden gidecek.
CartBounty Sepet Kurtarma Entegrasyonu
Ben diolivo.com.tr projesinde CartBounty eklentisini kullanarak terk edilmiş sepet maillerini Brevo üzerinden gönderiyorum. CartBounty, sepeti terk eden kullanıcılara 1 saat, 6 saat ve 24 saat sonra hatırlatma maili gönderiyor. Kurulum basit: CartBounty > Settings > Email sayfasında "Use WordPress default email" seçeneğini işaretleyin. WP Mail SMTP zaten aktif olduğu için CartBounty otomatik olarak Brevo'yu kullanacak.
İlk 3 ayda 2.847 sepet kurtarma maili gönderdik, %18,3'ü geri dönüş yaptı (522 sipariş). Ortalama sepet değeri 340 TL olduğu için bu otomasyon 177.480 TL ek gelir getirdi. Brevo'nun ücretsiz planı bu hacim için yetmedi, Starter plana geçtik. Aylık 25 EUR, ama ROI 70x olunca maliyet önemsiz.
SPF ve DKIM Kayıtlarını Ayarlama
Brevo üzerinden gönderilen maillerin spam'e düşmemesi için SPF ve DKIM DNS kayıtlarını doğru yapılandırmanız gerekiyor. Bu kayıtlar, mailin gerçekten sizin domain'inizden geldiğini kanıtlıyor. Brevo, her domain için otomatik olarak SPF ve DKIM değerleri üretiyor.
Brevo dashboard'da Senders & IP > Domains menüsüne gidin. "Authenticate a Domain" butonuna tıklayın, domain adınızı girin (örneğin futia.net). Brevo size 3 DNS kaydı verecek:
1. SPF kaydı (TXT): v=spf1 include:spf.brevo.com ~all 2. DKIM kaydı (TXT): Uzun bir string, örneğin mail._domainkey.futia.net 3. Tracking kaydı (CNAME): İsteğe bağlı, açılma ve tıklama takibi için
Bu kayıtları domain sağlayıcınızın DNS paneline eklemeniz gerekiyor. Ben Cloudflare kullanıyorum, sizin sağlayıcınız GoDaddy, Namecheap veya Natro olabilir. DNS paneline girin, Add Record butonuna tıklayın.
SPF kaydı için:
- Type: TXT
- Name: @ (veya boş bırakın)
- Content: v=spf1 include:spf.brevo.com ~all
- TTL: Auto veya 3600
DKIM kaydı için:
- Type: TXT
- Name: mail._domainkey (Brevo'nun verdiği değer)
- Content: Brevo'nun verdiği uzun string
- TTL: Auto
Kayıtları ekledikten sonra DNS yayılması 10 dakika ile 48 saat arasında sürebilir. Genellikle 1-2 saat içinde aktif oluyor. Brevo dashboard'da "Verify" butonuna tıklayarak kontrol edin. Yeşil tik işareti gelirse kurulum tamamdır.
DMARC Kaydı Ekleme
SPF ve DKIM'e ek olarak DMARC kaydı da eklemenizi öneriyorum. DMARC, SPF ve DKIM kontrollerinin başarısız olması durumunda mailin ne yapılacağını belirliyor. Ben şu DMARC kaydını kullanıyorum:
- Type: TXT
- Name: _dmarc
- Content: v=DMARC1; p=quarantine; rua=mailto:info@futia.net
- TTL: Auto
Bu kayıt, SPF veya DKIM başarısız olursa mailin karantinaya alınmasını söylüyor. p=reject daha sıkı bir politika, ama ilk başta quarantine ile test etmenizi öneririm. rua parametresi, DMARC raporlarının hangi e-postaya gönderileceğini belirtiyor.
Brevo API ile Custom Entegrasyon
WordPress kullanmıyorsanız veya daha fazla kontrol istiyorsanız Brevo API'sini kullanabilirsiniz. Ben futia.net projesinde video üretim otomasyonunu Brevo API ile entegre ettim. Müşteri ödeme yaptığında Stripe webhook'u tetikleniyor, ben de Brevo API'sine POST request atarak onay maili gönderiyorum.
Brevo API v3, RESTful yapıda ve JSON formatında çalışıyor. PHP, Python, Node.js, Ruby için resmi SDK'lar var. Ben PHP SDK kullanıyorum, Composer ile kurulumu çok basit:
composer require sendinblue/api-v3-sdk
Basit bir transactional email gönderme kodu:
require_once(__DIR__ . '/vendor/autoload.php');
$config = SendinBlue\Client\Configuration::getDefaultConfiguration()->setApiKey('api-key', 'BREVO_API_ANAHTARINIZ');
$apiInstance = new SendinBlue\Client\Api\TransactionalEmailsApi(
new GuzzleHttp\Client(),
$config
);
$sendSmtpEmail = new \SendinBlue\Client\Model\SendSmtpEmail();
$sendSmtpEmail['subject'] = 'Siparişiniz Onaylandı';
$sendSmtpEmail['htmlContent'] = '<html><body><h1>Merhaba {{name}}</h1><p>Sipariş numaranız: {{order_id}}</p></body></html>';
$sendSmtpEmail['sender'] = array('name' => 'Diolivo', 'email' => 'siparis@diolivo.com.tr');
$sendSmtpEmail['to'] = array(array('email' => 'musteri@example.com', 'name' => 'Ahmet Yılmaz'));
$sendSmtpEmail['params'] = array('name' => 'Ahmet', 'order_id' => '12345');
try {
$result = $apiInstance->sendTransacEmail($sendSmtpEmail);
print_r($result);
} catch (Exception $e) {
echo 'Hata: ', $e->getMessage(), PHP_EOL;
}
Bu kod, Mustache tarzı template değişkenleri kullanıyor. htmlContent içinde {{name}} ve {{order_id}} placeholder'ları var, params array'i ile bu değerleri dolduruyorsunuz. Brevo otomatik olarak replace ediyor.
Webhook ile Açılma ve Tıklama Takibi
Brevo, gönderilen maillerin açılma, tıklama, bounce ve spam şikayeti eventlerini webhook ile bildiriyor. Ben bu webhook'u kullanarak müşteri engagement skorlaması yapıyorum. Örneğin bir müşteri 3 sepet kurtarma mailini açmadan siliyorsa, 4. maili göndermiyorum (maliyet optimizasyonu).
Webhook kurmak için Brevo dashboard'da Transactional > Settings > Webhooks menüsüne gidin. Add a Webhook butonuna tıklayın, endpoint URL'inizi girin (örneğin https://siteniz.com/brevo-webhook). Event türlerini seçin: opened, clicked, hard_bounce, soft_bounce, spam.
Brevo, her event için POST request atıyor. PHP ile basit bir webhook handler:
$json = file_get_contents('php://input');
$data = json_decode($json, true);
if ($data['event'] === 'opened') {
$email = $data['email'];
$messageId = $data['message-id'];
// Veritabanına kaydet
logEmailOpen($email, $messageId);
}
Bu veriyi analiz ederek en çok açılan mail saatlerini, en etkili konu satırlarını ve düşük engagement'lı segmentleri tespit edebilirsiniz.
Template Oluşturma ve Dinamik İçerik
Brevo'nun template editörü, drag-and-drop yapıda ve responsive. Ben genellikle HTML template'leri custom yazıyorum, ama hızlı prototip için editör kullanışlı. Campaigns > Email Templates menüsünde Create a Template butonuna tıklayın.
Drag-and-drop editörde metin, resim, buton ve sosyal medya blokları var. Template'i tasarladıktan sonra Save & Activate edin. Template ID'yi kopyalayın, API çağrısında templateId parametresi olarak kullanacaksınız.
Dinamik içerik için Mustache syntax kullanılıyor. Örneğin:
<p>Merhaba {{contact.FIRSTNAME}},</p>
<p>{{params.product_name}} ürününü sepetinizde unuttunuz.</p>
<a href="{{params.cart_url}}">Sepete Dön</a>
API çağrısında params ve contact değerlerini gönderiyorsunuz:
$sendSmtpEmail['templateId'] = 12;
$sendSmtpEmail['params'] = array(
'product_name' => 'Organik Zeytinyağı 1L',
'cart_url' => 'https://diolivo.com.tr/sepet'
);
$sendSmtpEmail['to'] = array(array(
'email' => 'musteri@example.com',
'name' => 'Ahmet Yılmaz'
));
Brevo, contact bilgilerini otomatik olarak doldurur (FIRSTNAME, LASTNAME gibi). Eğer contact listede yoksa params ile manuel değer göndermeniz gerekir.
Conditional Content
Brevo, template içinde if/else mantığı da destekliyor. Örneğin sepet değeri 500 TL'den fazlaysa kargo bedava mesajı göstermek:
{{#if params.cart_total > 500}}
<p style="color: green;">Kargo Bedava!</p>
{{else}}
<p>500 TL üzeri kargo bedava.</p>
{{/if}}
Bu özelliği sepet kurtarma ve cross-sell maillerinde çok kullanıyorum. Müşteri segmentine göre farklı ürün önerileri veya indirim kodları gösteriyorum.
Gerçek Vaka: memuratamalari.com Günlük İlan Maili
memuratamalari.com projesi, kamu personel ilanlarını toplayan bir haber sitesi. Ben burada her sabah 08:00'de son 24 saatteki ilanları özetleyen bir mail gönderiyorum. Aylık 11.200 abone var, açılma oranı %42. Brevo SMTP + Cron Job kombinasyonu kullanıyorum.
Cron job, her sabah ilan.gov.tr API'sinden yeni ilanları çekiyor, HTML formatında mail içeriği oluşturuyor ve Brevo API ile toplu mail gönderiyor. Toplu mail için sendTransacEmail yerine sendSmtpEmail batch endpoint'ini kullanıyorum. Batch, tek request ile 50 farklı alıcıya mail gönderebiliyor.
Kod yapısı:
$subscribers = getSubscribers(); // Veritabanından 11.200 abone
$newJobs = fetchJobsFromAPI(); // ilan.gov.tr API
$htmlContent = generateEmailHTML($newJobs); // Template render
foreach (array_chunk($subscribers, 50) as $batch) {
$sendSmtpEmail['htmlContent'] = $htmlContent;
$sendSmtpEmail['subject'] = date('d.m.Y') . ' - Yeni Kamu İlanları';
$sendSmtpEmail['sender'] = array('name' => 'Memur Atamaları', 'email' => 'ilan@memuratamalari.com');
$sendSmtpEmail['to'] = array_map(function($sub) {
return array('email' => $sub['email'], 'name' => $sub['name']);
}, $batch);
$apiInstance->sendTransacEmail($sendSmtpEmail);
sleep(2); // Rate limit koruması
}
İlk ay 4 mail spam'e düştü, SPF ve DKIM kayıtlarını ekledikten sonra sorun çözüldü. Şu an spam oranı %0,8 (Gmail ve Outlook'ta sıfır, Yandex'te %3). Brevo'nun IP reputasyonu çok iyi, bu yüzden cold start sorunu yaşamadım.
Maliyet Analizi ve Plan Seçimi
Brevo'nun fiyatlandırması mail hacmine göre kademeli:
- Free: 300 mail/gün (9.000 mail/ay), sınırsız contact
- Starter: 25 EUR/ay, 20.000 mail, günlük limit yok
- Business: 65 EUR/ay, 60.000 mail, gelişmiş otomasyon
- Enterprise: Custom fiyat, 1M+ mail, dedicated IP
Ben FUTIA projelerinde genellikle Starter plan kullanıyorum. 20.000 mail, orta ölçekli bir e-ticaret için yeterli (günde 650 mail). Eğer CartBounty veya newsletter ekliyorsanız Business plana geçmeniz gerekebilir.
Alternatif olarak AWS SES var, 1.000 mail 0,10 USD. Ama SES'in kurulumu daha teknik, dedicated IP için 25 USD/ay ek ücret var. SendGrid'in ücretsiz planı 100 mail/gün ile çok düşük. Mailgun'ın fiyatları Brevo'dan %30 daha pahalı. Dolayısıyla Türkiye pazarında Brevo en dengeli seçenek.
Bir de dikkat edilmesi gereken nokta: Brevo'da marketing ve transactional mail kredileri ayrı. Eğer hem newsletter hem sipariş onayı gönderiyorsanız, iki ayrı hesap açmanızı öneririm. Transactional hesap daha yüksek önceliğe sahip, marketing hesabın spam oranı transactional'ı etkilemiyor.
Brevo SMTP kurulumu ve API entegrasyonu hakkında daha fazla detay için benimle iletişime geçebilirsiniz. WhatsApp: +90 532 491 17 05 veya info@futia.net. FUTIA olarak Hollanda'dan Türk markalarına site, otomasyon ve aylık bakım hizmeti veriyoruz. E-ticaret otomasyonları konusunda deneyim paylaşmaktan mutluluk duyarım.
Sıkça Sorulanlar
Brevo SMTP ve API arasındaki fark nedir?
SMTP, WordPress veya WooCommerce gibi hazır sistemlerde kullanılan klasik mail gönderme protokolü. WP Mail SMTP gibi eklentilerle kolayca entegre edilir. API ise daha esnek, custom kod entegrasyonu gerektirir. API ile template yönetimi, webhook takibi ve toplu mail gönderimi daha kolay. Ben WordPress projelerinde SMTP, custom SaaS projelerinde API kullanıyorum. Her ikisi de aynı mail limitini paylaşır, yani SMTP ile 100 mail gönderdiyseniz API'de kalan 200 mail hakkınız var (ücretsiz planda).
SPF ve DKIM kayıtlarını eklemeden mail gönderebilir miyim?
Teknik olarak evet, ama maillerin %60-70'i spam'e düşer. SPF ve DKIM, mailin gerçekten sizin domain'inizden geldiğini kanıtlayan DNS kayıtları. Gmail ve Outlook bu kayıtları kontrol eder, yoksa spam olarak işaretler. Ben diolivo.com.tr projesinde ilk hafta SPF eklemeden test ettim, 200 mailden 130'u spam'e düştü. SPF ve DKIM ekledikten sonra spam oranı %2'ye indi. Kayıtları eklemek 10 dakika sürüyor, mutlaka yapın.
Brevo ücretsiz planı e-ticaret için yeterli mi?
Günde 50-100 sipariş alan küçük bir e-ticaret için yeterli. Ücretsiz plan günde 300 mail veriyor, bu da 100 sipariş onayı + 100 sepet kurtarma + 100 şifre sıfırlama demek. Ama newsletter veya promosyon maili gönderemezsiniz. Ben ilk 3 ay ücretsiz planla başladım, günlük ortalama 180 mail gönderiyordum. Sepet kurtarma otomasyonu ekleyince limit dolmaya başladı, Starter plana geçtim. Eğer aylık 500+ sipariş alıyorsanız direkt Starter planla başlayın.
Brevo ile toplu mail gönderirken rate limit var mı?
Ücretsiz ve Starter planda saniyede 10 mail, Business'ta 100 mail, Enterprise'da 200 mail gönderebilirsiniz. Ben memuratamalari.com projesinde 11.200 aboneye sabah maili gönderirken 50'şer kişilik batch'ler halinde gönderiyorum, her batch arasında 2 saniye bekliyorum. Toplam süre 7-8 dakika. Rate limit aşarsanız HTTP 429 hatası alırsınız, bu durumda 1 dakika bekleyip tekrar deneyin. Brevo'nun dokümantasyonunda retry-after header'ı var, onu kullanarak otomatik retry mekanizması kurabilirsiniz.
Brevo webhook'ları nasıl test edebilirim?
Brevo dashboard'da Webhooks sayfasında Test butonuyla manuel event gönderebilirsiniz. Ama gerçek test için RequestBin veya Webhook.site kullanmanızı öneririm. Webhook URL olarak RequestBin adresinizi verin, Brevo'dan test maili gönderin, RequestBin'de gelen JSON payload'u inceleyin. Webhook handler kodunuzu yazdıktan sonra canlı URL'i Brevo'ya ekleyin. Ben genellikle ngrok ile local geliştirme yapıyorum, ngrok URL'ini Brevo'ya veriyorum, böylece local makinemde debug edebiliyorum.
Bu yazıdaki tekniklerden birini uygulamak ister misiniz? Kısa bir form doldurun, 48 saat içinde ücretsiz ön inceleme raporu mailinize düşsün.