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?

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

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 | Şifreleme | Kullanım durumu |
|---|---|---|
| 587 | tls (STARTTLS) | Önerilen standart. Modern sağlayıcıların tamamında desteklenir. |
| 465 | ssl / smtps | Bağlantı en baştan şifrelenir. cPanel tabanlı hostinglerde yaygındır. |
| 25 | yok / tls | Çoğu sağlayıcı spam nedeniyle kapatır. Üretimde tercih edilmemelidir. |
| 2525 | tls | 587 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

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 connect | Port 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 failed | Kullanı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 failed | Sunucu sertifikası ile host adı uyuşmuyor | Sağ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 hata | Hosting firması giden SMTP trafiğini engelliyor | 2525 gibi alternatif portu deneyin veya API tabanlı bir gönderim servisine geçin |
| Mail gidiyor ama gelen kutusuna düşmüyor | SPF, DKIM veya DMARC kaydı eksik | DNS 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ıyor | Yapı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
.enviç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_ADDRESSalan adı, SMTP hesabının alan adıyla aynı mı?- Üretim sunucusunda
config:cacheyenilendi 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ış,
.envdosyası.gitignoreiç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
- Laravel resmi dokümantasyonu — Mail
- Symfony Mailer dokümantasyonu
- Google Hesap Yardımı — Uygulama şifreleri
- RFC 8314 — E-posta gönderiminde TLS kullanımı
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:




