Laravel

Laravel Mail SMTP Ayarları Nasıl Yapılır?

Laravel mail SMTP yapılandırması; üyelik onayı, şifre sıfırlama, sipariş bildirimi ve iletişim formu gibi kritik e-postaların alıcıya ulaşmasını sağlayan temel altyapı adımıdır. Laravel 9 sürümünden itibaren mail katmanı SwiftMailer yerine Symfony Mailer üzerine kurulur; bu nedenle eski kaynaklardaki bazı ayar adları güncel projelerde karşılık bulmaz.

Bu rehberde SMTP gönderim zincirinin Laravel içinde nasıl işlediğini, .env ve config/mail.php dosyalarının doğru yazımını, port ve şifreleme seçimini, gönderim testini, kuyruk kullanımını ve en sık karşılaşılan SMTP hatalarının çözümünü adım adım ele alıyoruz. Yeni bir proje kuruyorsanız önce Laravel proje kurulum rehberini tamamlamanız, ardından bu yazıya dönmeniz en verimli yoldur.

Laravel’de mail SMTP nedir, gönderim zinciri nasıl işler?

Laravel mail gönderim zinciri: uygulama, Symfony Mailer ve SMTP sunucusu

SMTP (Simple Mail Transfer Protocol), e-postanın gönderici sunucudan alıcı sunucuya taşınmasını sağlayan protokoldür. Laravel tarafında zincir şu şekilde ilerler: uygulamanız bir Mailable sınıfı oluşturur, Mail facade’i bu sınıfı yapılandırdığınız mailer’a devreder, Symfony Mailer mesajı MIME formatına çevirir ve tanımladığınız SMTP sunucusuna kimlik doğrulayarak teslim eder.

Bu zincirde uygulamanız yalnızca teslim aşamasından sorumludur. Mesajın gelen kutusuna mı yoksa spam klasörüne mi düşeceği ise gönderen alan adının SPF, DKIM ve DMARC kayıtlarıyla, yani DNS tarafındaki itibar ayarlarıyla belirlenir. Bu yüzden “mail gidiyor ama ulaşmıyor” tablosunda sorun çoğunlukla Laravel’de değil, alan adı kayıtlarındadır.

Laravel mail sürücüleri (mailers) arasındaki fark

config/mail.php içinde birden fazla sürücü tanımlıdır ve her biri farklı bir senaryoya hizmet eder:

  • smtp: Kendi hosting hesabınızın veya kurumsal e-posta sağlayıcınızın sunucusuna bağlanır. En yaygın ve en taşınabilir seçenektir.
  • ses, postmark, resend, mailgun: API tabanlı gönderim servisleri. Yüksek hacimli gönderimlerde teslimat oranı ve raporlama açısından avantajlıdır.
  • sendmail: Sunucunun yerel sendmail ikilisini kullanır. Paylaşımlı hostingde çoğu zaman kısıtlıdır.
  • log ve array: Geliştirme ortamı içindir; gerçek gönderim yapmaz, mesajı log dosyasına veya bellek dizisine yazar.
  • failover ve roundrobin: Birden fazla sürücüyü sırayla ya da dönüşümlü kullanarak kesintiye karşı yedeklilik sağlar.

Paylaşımlı hosting üzerinde çalışıyorsanız sunucu tarafındaki e-posta hesabı ayarlarını da doğrulamanız gerekir; bu konuyu hosting SMTP ayarları rehberinde ayrıntılı anlattık.

Laravel mail SMTP ayarları: .env yapılandırması adım adım

Laravel .env dosyasında MAIL_MAILER, MAIL_HOST ve MAIL_PORT satırlarının yapılandırılması

Tüm SMTP bilgileri .env dosyasında tutulur; config/mail.php yalnızca bu değerleri okur. Ayar dosyasının mantığını hatırlamak isterseniz .env dosyası nedir ve nasıl ayarlanır yazısı iyi bir başlangıçtır.

1. .env dosyasına SMTP bilgilerini yazın

MAIL_MAILER=smtp
MAIL_HOST=mail.alanadiniz.com
MAIL_PORT=587
MAIL_USERNAME=bilgi@alanadiniz.com
MAIL_PASSWORD=guclu-bir-parola
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS="bilgi@alanadiniz.com"
MAIL_FROM_NAME="${APP_NAME}"

Laravel 11 ve sonrasında MAIL_ENCRYPTION yerine MAIL_SCHEME=smtps kullanımı da desteklenir. Parolada boşluk veya # gibi özel karakter varsa değeri çift tırnak içine almanız zorunludur; aksi hâlde satır yarıda kesilir ve kimlik doğrulama başarısız olur.

2. Doğru port ve şifreleme kombinasyonunu seçin

PortŞifrelemeKullanım durumu
587tls (STARTTLS)Önerilen standart. Modern sağlayıcıların tamamında desteklenir.
465ssl / smtpsBağlantı en baştan şifrelenir. cPanel tabanlı hostinglerde yaygındır.
25yok / tlsÇoğu sağlayıcı spam nedeniyle kapatır. Üretimde tercih edilmemelidir.
2525tls587 engelliyse alternatif. Mailtrap ve benzeri servisler destekler.

Port ve şifreleme uyumsuzluğu (örneğin 465 + tls) Laravel’de en sık görülen bağlantı hatasının kaynağıdır. 465 kullanıyorsanız şifreleme ssl, 587 kullanıyorsanız tls olmalıdır.

3. Yapılandırma önbelleğini temizleyin

php artisan config:clear
php artisan cache:clear
php artisan config:cache   # yalnızca üretim ortamında

Üretim sunucusunda config:cache çalıştırıldıysa .env dosyasındaki yeni değerler önbellek yenilenene kadar okunmaz. Bu adım atlandığında “ayarı değiştirdim ama eski sunucuya bağlanıyor” tablosu ortaya çıkar; konunun ayrıntısı için Laravel config cache hatası yazısına bakabilirsiniz.

4. Gönderen kimliğini alan adınızla uyumlu tutun

MAIL_FROM_ADDRESS değeri, SMTP kullanıcı adınızla aynı alan adına ait olmalıdır. Gmail’in SMTP sunucusundan @sirketiniz.com adresi adına gönderim yapmak, alan adı doğrulanmadığı sürece spam filtrelerine takılır. Gmail kullanacaksanız hesapta iki adımlı doğrulama açık olmalı ve normal hesap parolası yerine uygulama şifresi üretilmelidir.

Mail gönderimini test etme, kuyruğa alma ve loglama

Laravel tinker ile test maili gönderimi ve kuyruk üzerinden e-posta işleme

Hızlı test: tinker ile tek satırda gönderim

php artisan tinker
Mail::raw('Laravel SMTP test mesajı', function ($m) {
    $m->to('deneme@alanadiniz.com')->subject('SMTP Testi');
});

Komut hatasız tamamlanıyorsa Laravel mesajı SMTP sunucusuna teslim etmiştir. Hata alıyorsanız istisna metni doğrudan sorunun kaynağını gösterir; bu çıktıyı bir kenara not edin, aşağıdaki hata tablosunda karşılığını bulacaksınız.

Mailable sınıfı ile gerçek şablon gönderimi

php artisan make:mail SiparisOnayi --markdown=emails.siparis-onayi

Oluşan sınıfın envelope() ve content() metotlarında konu ve görünüm dosyasını tanımlar, ardından Mail::to($user)->send(new SiparisOnayi($order)); çağrısıyla gönderirsiniz.

Gönderimi kuyruğa alın

SMTP bağlantısı senkron çalıştığında istek süresine 1-3 saniye eklenir ve kullanıcı formun döndüğünü geç görür. Mailable sınıfınıza ShouldQueue arayüzünü eklemek bu yükü arka plana taşır. Kuyruk kurulumunu hiç yapmadıysanız Laravel queue sistemi rehberindeki adımları izleyin.

Geliştirme ortamında gerçek mail göndermeyin

Yerel ortamda MAIL_MAILER=log ayarı mesajı storage/logs/laravel.log dosyasına yazar; Mailpit veya Mailtrap ise gönderilen maili tarayıcıdan görüntülemenizi sağlar. Log dosyalarını okumayı ve seviyeleri ayırt etmeyi Laravel log dosyaları yazısında ele aldık.

Sık karşılaşılan Laravel SMTP hataları ve çözümleri

Hata mesajıOlası nedenÇözüm
Connection could not be established with host … stream_socket_client(): Unable to connectPort kapalı veya host adı yanlışSunucudan telnet mail.alanadiniz.com 587 ile bağlantıyı test edin, sağlayıcınızdan portun açılmasını isteyin
Expected response code 250 but got code 535, Authentication failedKullanıcı adı veya parola hatalı; Gmail’de uygulama şifresi kullanılmamışKullanıcı adını tam e-posta adresi olarak yazın, Gmail için uygulama şifresi üretin
SSL operation failed … certificate verify failedSunucu sertifikası ile host adı uyuşmuyorSağlayıcının verdiği tam sunucu adını kullanın; sertifika doğrulamasını kapatmayı son çare olarak değerlendirin
Connection timed out / 30 saniye sonra hataHosting firması giden SMTP trafiğini engelliyor2525 gibi alternatif portu deneyin veya API tabanlı bir gönderim servisine geçin
Mail gidiyor ama gelen kutusuna düşmüyorSPF, DKIM veya DMARC kaydı eksikDNS panelinden SPF ve DKIM kayıtlarını ekleyin, gönderen adresini alan adınızla eşleyin
Ayar değişti ama eski sunucuya bağlanıyorYapılandırma önbelleği güncellenmemişphp artisan config:clear çalıştırın, kuyruk çalışıyorsa queue:restart ekleyin

WordPress tarafında benzer bir sorun yaşıyorsanız belirtiler farklı görünse de kök neden çoğu zaman aynıdır; WordPress mail gönderme sorunu yazısındaki SMTP kontrol adımları da işinizi görecektir.

Yayına almadan önce SMTP kontrol listesi

  • .env içindeki host, port ve şifreleme üçlüsü sağlayıcının dokümanıyla birebir uyumlu mu?
  • Parola çift tırnak içinde mi ve özel karakterler doğru kaçırılmış mı?
  • MAIL_FROM_ADDRESS alan adı, SMTP hesabının alan adıyla aynı mı?
  • Üretim sunucusunda config:cache yenilendi mi, kuyruk worker’ları yeniden başlatıldı mı?
  • SPF ve DKIM kayıtları DNS üzerinde yayınlandı mı?
  • Şifre sıfırlama, kayıt onayı ve iletişim formu akışları gerçek bir adrese test edildi mi?
  • Gönderim hataları loglanıyor ve izleniyor mu?
  • SMTP parolası sürüm kontrolüne (git) sızmamış, .env dosyası .gitignore içinde mi?

Son maddeyi genişletmek isterseniz Laravel güvenlik kontrol listesi yazısındaki tüm başlıkları da bu aşamada gözden geçirmenizi öneririz.

Sıkça Sorulan Sorular

Laravel’de 587 mi 465 mi kullanmalıyım?
Modern standart 587 ve STARTTLS’tir; sağlayıcınız açıkça 465 belirtiyorsa şifrelemeyi ssl olarak ayarlayın. İkisini karıştırmak (465 + tls) bağlantı hatasının en yaygın sebebidir.

Gmail SMTP ile mail gönderemiyorum, neden?
Google, normal hesap parolasıyla SMTP erişimini kapattı. Hesapta iki adımlı doğrulamayı açıp uygulama şifresi üretmeniz ve bu şifreyi MAIL_PASSWORD alanına yazmanız gerekir.

.env dosyasını değiştirdim ama hiçbir şey değişmedi, sorun ne?
Yapılandırma önbelleği devrededir. php artisan config:clear komutunu çalıştırın; kuyruk kullanıyorsanız php artisan queue:restart ile worker’ların yeni ayarları okumasını sağlayın.

“Expected response code 250 but got code 535” hatası ne anlama gelir?
SMTP sunucusu kimlik doğrulamayı reddetmiştir. Kullanıcı adının kısa ad değil tam e-posta adresi olduğunu, parolanın doğru kopyalandığını ve hesabın SMTP gönderim yetkisine sahip olduğunu doğrulayın.

Mail gönderimi sayfayı yavaşlatıyor, nasıl hızlandırırım?
Mailable sınıfına ShouldQueue ekleyip gönderimi kuyruğa taşıyın. Böylece SMTP el sıkışması istek döngüsünden çıkar ve kullanıcı yanıtı anında alır.

Yerel geliştirmede gerçek mail göndermeden test edebilir miyim?
Evet. MAIL_MAILER=log ile mesajı log dosyasına yazdırabilir, Mailpit veya Mailtrap kullanarak gönderilen e-postayı biçimlendirilmiş hâlde tarayıcıda görüntüleyebilirsiniz.

Maillerim spam klasörüne düşüyor, Laravel tarafında ne yapabilirim?
Kod tarafında yapılacak çok az şey vardır: gönderen adresini alan adınızla eşleyin, yanıt adresi tanımlayın ve düz metin alternatifi ekleyin. Asıl çözüm DNS tarafında SPF, DKIM ve DMARC kayıtlarının doğru yayınlanmasıdır.

Kaynaklar

Sonuç

Laravel mail SMTP yapılandırması, doğru host-port-şifreleme üçlüsü, temiz bir .env dosyası ve önbellek yenileme adımı bir araya geldiğinde birkaç dakikada tamamlanır. Gerçek zorluk teslimat aşamasındadır: alan adı kayıtlarınız düzgün değilse teknik olarak “başarılı” gönderimler bile spam klasöründe kalır. Bu yüzden kurulumdan hemen sonra SPF ve DKIM kayıtlarını da tamamlayın.

İlgili rehberler:

ozgur

Özgür Bayram, WordPress, Laravel, yapay zekâ ve web performansı alanlarında çalışan bir yazılım geliştiricisidir. Bilim Meraklısı’nda teknoloji, yazılım, hosting, SEO ve dijital araçlar hakkında anlaşılır, uygulanabilir rehberler hazırlar. Amacı, teknik konuları sade bir dille anlatarak okuyucuların doğru kararlar vermesine ve sorunlarını güvenle çözmesine yardımcı olmaktır.

İlgili Makaleler

Bir yanıt yazın

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

Başa dön tuşu