Makale Başlıkları
- PHPMailer nedir?
- PHPMailer neden gerekli? mail() fonksiyonunun sorunu
- PHPMailer nasıl kurulur? İki yöntem
- PHPMailer ile adım adım e-posta gönderme
- Hata ayıklama: gönderim çalışmıyorsa
- Teslim edilebilirlik: maillerin gerçekten ulaşması için
- Güvenlik için birkaç önemli not
- Sıkça Sorulan Sorular
- Maillerinizin ulaşması için sağlam bir altyapı şart
Kisaca
PHPMailer, PHP uygulamalarindan SMTP uzerinden kimlik dogrulamali e-posta gondermeyi saglayan acik kaynakli bir kutuphanedir. PHP’nin kisitli mail() fonksiyonunun aksine TLS/SSL sifreleme, dosya eki, HTML govde ve ayrintili hata raporu sunarak teslim oranini yukseltir. Rehber, kurulumdan calisan bir iletisim formuna kadar adim adim ilerliyor.
- Kurulum iki yolla: composer require phpmailer/phpmailer (onerilen) ya da src klasorundeki PHPMailer.php, SMTP.php, Exception.php dosyalarini elle yukleme.
- Gonderim icin gercek bir e-posta hesabi sart; STARTTLS icin Port 587, SMTPS icin Port 465 kullanilir, ikisi karistirilmamali.
- Turkce karakterler icin CharSet = UTF-8; sorun cikarsa SMTPDebug ile sunucu konusmasi satir satir izlenebilir.
- Maillerin gelen kutusuna dusmesi icin alan adinizin DNS’ine SPF ve DKIM kayitlari eklenmelidir.
- Guvenlik: sifreleri koda gommeyin, kullanici girdisini temizleyin, surumu (6.10+) guncel tutun.
Bir iletişim formundan size ulaşan mesaj, bir e-ticaret sitesinde müşteriye giden sipariş onayı, kullanıcı kaydında gönderilen doğrulama bağlantısı… PHP ile yazılmış neredeyse her web uygulamasının bir noktada e-posta göndermesi gerekir. İşte bu işin bel kemiği, yıllardır PHP dünyasının fiili standardı haline gelmiş bir kütüphane: PHPMailer. Bu rehberde PHPMailer’in ne olduğunu, neden PHP’nin kendi mail() fonksiyonuna göre çok daha sağlıklı bir tercih olduğunu ve adım adım nasıl kuracağınızı gerçek örneklerle anlatıyoruz.
PHPMailer nedir?
PHPMailer, PHP ile yazılmış uygulamalardan e-posta göndermek için kullanılan açık kaynaklı bir kütüphanedir (PHP sınıfıdır). Belirlediğiniz bağlantı bilgileriyle bir mail sunucusuyla SMTP protokolü üzerinden haberleşir, sunucuda kimlik doğrulaması yapar ve mesajınızı uygun başlıklar, kodlama ve eklerle hazırlayıp gönderir. Kısacası, e-posta gönderiminin tüm karmaşık tarafını sizin için soyutlar.
Proje 2001’den beri geliştiriliyor ve bugün PHP ekosisteminin en yaygın kullanılan e-posta kütüphanelerinden biri. WordPress, Drupal, Joomla gibi birçok büyük projenin de arka planda kullandığı altyapı budur. Yazının hazırlandığı dönemde güncel kararlı sürüm 6.10 serisidir; PHP 5.5’ten PHP 8.4 ve sonrasına kadar geniş bir uyumluluk sunar. Yani modern bir PHP sürüm seçicisi olan hosting ortamında sürüm uyumu konusunda endişelenmenize gerek yoktur.
PHPMailer neden gerekli? mail() fonksiyonunun sorunu
PHP’nin standart e-posta gönderme fonksiyonu olan mail(), günümüzde çoğu paylaşımlı hosting servisinde -spam gönderimini önlemek amacıyla- ya tamamen kapalıdır ya da ciddi şekilde kısıtlanmıştır. Ancak bu, sunucu üzerinden mail gönderilemeyeceği anlamına gelmez. mail() fonksiyonunun temel sorunları şunlardır:
- Kimlik doğrulama yok: mail() doğrudan sunucunun lokal mail aracısını çağırır, SMTP üzerinden kimlik doğrulaması yapmaz. Bu da gönderici güvenilirliğini düşürür.
- Düşük teslim oranı: SPF, DKIM gibi kimlik doğrulama kayıtlarıyla eşleşmeyen gönderimler büyük ihtimalle spam klasörüne düşer ya da hiç ulaşmaz.
- UTF-8 ve ek desteği zayıf: Türkçe karakterler, HTML gövde ve dosya ekleri gibi konularda manuel başlık yönetimi gerektirir ve hataya çok açıktır.
- Hata yönetimi yok: mail() yalnızca true/false döndürür; gönderim neden başarısız oldu, anlamanız neredeyse imkânsızdır.
PHPMailer, sunucuyla SMTP protokolü aracılığıyla haberleşerek ve kimlik doğrulama yaparak tam da bu boşlukları doldurur. Sonuç: hem teslim edilebilirliği yüksek hem de hata ayıklaması mümkün, profesyonel bir gönderim altyapısı.
mail() ve PHPMailer karşılaştırması
| Özellik | PHP mail() | PHPMailer |
|---|---|---|
| SMTP kimlik doğrulama | Yok | Var |
| TLS / SSL şifreleme | Sınırlı | Tam destek (STARTTLS, SMTPS) |
| Dosya eki ekleme | Manuel ve zor | Tek satırla (addAttachment) |
| HTML gövde + düz metin alternatifi | Manuel başlık gerekir | Otomatik (isHTML, AltBody) |
| UTF-8 / Türkçe karakter | Sorunlu | CharSet ile sorunsuz |
| Hata raporlama | Yok | Ayrıntılı (ErrorInfo, SMTPDebug) |
| Teslim edilebilirlik | Düşük | Yüksek |
PHPMailer nasıl kurulur? İki yöntem
PHPMailer’i projenize dahil etmenin iki yolu var. Modern projeler için önerilen yöntem Composer’dır; ancak Composer’ın olmadığı klasik paylaşımlı ortamlarda dosyaları elle yükleyebilirsiniz.
Yöntem 1: Composer ile kurulum (önerilen)
Eğer sunucunuzda Composer kuruluysa, proje dizininizde tek komutla PHPMailer’i en güncel kararlı sürümüyle indirebilirsiniz:
composer require phpmailer/phpmailer
Bu komut, kütüphaneyi vendor/ dizinine indirir ve bir autoload.php dosyası oluşturur. Artık kodunuzun başına tek bir satır ekleyerek tüm sınıflara erişebilirsiniz. Composer yaklaşımının en büyük avantajı, güncellemeleri (örneğin güvenlik yamalarını) composer update ile tek komutta almanızdır.
Yöntem 2: Dosyaları elle yükleme
Composer kullanmıyorsanız, PHPMailer’i GitHub üzerinden indirip projenize ekleyebilirsiniz. github.com/PHPMailer/PHPMailer adresinden son sürümü ZIP olarak indirin; arşivin içindeki src klasörünü sitenizin dizinine yükleyin. Bu klasörde ihtiyacınız olan üç çekirdek dosya bulunur: PHPMailer.php, SMTP.php ve Exception.php. Bu yöntemde autoloader yerine bu dosyaları kendiniz require edersiniz; aşağıda her iki yaklaşımın kodunu da paylaşıyoruz.
PHPMailer ile adım adım e-posta gönderme
Şimdi pratik kısma geçelim. Aşağıdaki adımları takip ederek basit bir iletişim formu ve bu formdan gelen veriyi e-postaya dönüştüren bir işlem sayfası oluşturacağız.
1. Adım: Gerçek bir e-posta hesabı oluşturun
PHPMailer’in SMTP sunucusunda kimlik doğrulama yapabilmesi için gerçek bir e-posta hesabına ihtiyacı vardır. Hosting kontrol panelinizden (cPanel, Plesk veya DirectAdmin) ornek@alanadiniz.com gibi bir hesap oluşturun ve şifresini güvenli bir yere not edin. Bu hesabın bilgilerini birazdan kodda kullanacağız. İpucu: gönderim adresi olarak alan adınızla aynı domaine ait bir kutuyu kullanmak, SPF/DKIM uyumu sayesinde teslim oranınızı belirgin biçimde artırır.
2. Adım: İletişim formu sayfasını oluşturun
Ziyaretçinin bilgilerini gireceği basit bir HTML formu hazırlayalım. Bu kodu iletisim.php adında bir dosyaya kaydedin:
<?php header("Content-type: text/html; charset=utf-8"); ?>
<form action="sendmail.php" method="post">
<label for="name">İsim:</label><br>
<input type="text" name="name" id="name"><br>
<label for="mail">E-posta:</label><br>
<input type="email" name="mail" id="mail"><br>
<label for="subject">Konu:</label><br>
<input type="text" name="subject" id="subject"><br>
<label for="message">Mesajınız:</label><br>
<textarea name="message" cols="30" rows="10" id="message"></textarea><br><br>
<input type="submit" value="Gönder">
</form>
3. Adım: İşlem (gönderim) sayfasını oluşturun
Formdan gelen veriyi alıp e-postayı gönderen sendmail.php dosyasını oluşturun. Aşağıdaki örnek, modern PHPMailer (6.x) ve Composer autoload kullanımına göre yazılmıştır:
<?php
use PHPMailerPHPMailerPHPMailer;
use PHPMailerPHPMailerException;
// Composer kullanıyorsanız:
require 'vendor/autoload.php';
// Composer kullanmıyorsanız (manuel yükleme), yukarıdaki satır yerine:
// require 'src/Exception.php';
// require 'src/PHPMailer.php';
// require 'src/SMTP.php';
$mail = new PHPMailer(true);
try {
// Sunucu ayarları
$mail->CharSet = 'UTF-8'; // Türkçe karakterler için
$mail->isSMTP(); // SMTP kullan
$mail->Host = 'mail.alanadiniz.com'; // SMTP sunucusu
$mail->SMTPAuth = true; // SMTP doğrulaması
$mail->Username = 'ornek@alanadiniz.com'; // Mail kullanıcı adı
$mail->Password = 'SizinSifreniz'; // Mail şifresi
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // 'tls'
$mail->Port = 587; // TLS için 587, SSL için 465
// Gönderen ve alıcılar
$mail->setFrom('ornek@alanadiniz.com', 'İletişim Formu');
$mail->addAddress('ornek@alanadiniz.com'); // Mesajın size düşmesi için
$mail->addReplyTo($_POST['mail'], $_POST['name']); // Yanıt ziyaretçiye gitsin
// İçerik
$mail->isHTML(true);
$mail->Subject = 'İletişim Formu: ' . $_POST['subject'];
$mail->Body = nl2br(htmlspecialchars($_POST['message']));
$mail->AltBody = strip_tags($_POST['message']);
$mail->send();
echo 'Mesajınız başarıyla iletildi.';
} catch (Exception $e) {
echo 'Mesaj iletilemedi. Hata: ' . $mail->ErrorInfo;
}
?>
4. Adım: Ayarları kendi bilgilerinizle düzenleyin
Yukarıdaki koddaki birkaç satırı kendi ortamınıza göre değiştirmeniz yeterli:
- Host: SMTP sunucusunun adresi. cPanel veya Plesk kullanıyorsanız genellikle mail.alanadiniz.com şeklindedir.
- Username / Password: 1. adımda oluşturduğunuz gerçek e-posta hesabının adresi ve şifresi.
- SMTPSecure ve Port: Şifreleme yöntemi. STARTTLS (tls) için Port 587, SMTPS (ssl) için Port 465 kullanın. Bu ikisini karıştırmayın: 587 portunda SSL ya da 465 portunda TLS denemek bağlantının kurulmamasına yol açar.
- setFrom / addAddress: Gönderen adresi, alan adınızla aynı domaine ait olmalı. addAddress ise mesajın düşmesini istediğiniz kutudur.
5. Adım: Dosya eki ve birden çok alıcı (isteğe bağlı)
PHPMailer’in en sevilen yanlarından biri, ek ve çoklu alıcı işlemlerinin tek satıra inmesidir. send() çağrısından önce şu satırları ekleyebilirsiniz:
$mail->addAddress('ikinci@alanadiniz.com', 'İkinci Alıcı');
$mail->addCC('bilgi@alanadiniz.com');
$mail->addBCC('arsiv@alanadiniz.com');
$mail->addAttachment('/yol/dosya.pdf', 'Teklif.pdf');
Hata ayıklama: gönderim çalışmıyorsa
Mail gönderiminde sorun yaşıyorsanız panik yapmadan önce hata ayıklamayı (debug) açın. PHPMailer’in SMTPDebug özelliği, sunucuyla yapılan tüm konuşmayı satır satır ekrana yazar ve sorunu hızla bulmanızı sağlar. Bu satırı send() çağrısından önce, sunucu ayarlarının yanına ekleyin:
$mail->SMTPDebug = 2; // 0 = kapalı, 2 = istemci ve sunucu mesajları
Sık karşılaşılan hataları ve çözümlerini aşağıdaki tabloda topladık:
| Hata mesajı / belirti | Olası neden | Çözüm |
|---|---|---|
| SMTP connect() failed | Yanlış Host veya Port, ya da firewall engeli | Host adresini, 587/465 portunu ve şifreleme türünü kontrol edin |
| SMTP Error: Could not authenticate | Hatalı kullanıcı adı veya şifre | Kontrol panelinden e-posta şifresini doğrulayın |
| Türkçe karakterler bozuk görünüyor | CharSet ayarlanmamış | $mail->CharSet = ‘UTF-8’; satırını ekleyin |
| Mailler spam klasörüne düşüyor | SPF / DKIM kaydı eksik | Alan adınızın DNS kayıtlarına SPF ve DKIM ekleyin |
| SSL certificate problem / self signed | Sertifika doğrulaması başarısız | Sunucu sertifikasını ya da Host adresini gerçek FQDN ile eşleştirin |
Teslim edilebilirlik: maillerin gerçekten ulaşması için
Kodun çalışıyor olması, maillerinizin gelen kutusuna düşeceği anlamına gelmez. Spam klasörüne düşmemek için iki teknik kaydı mutlaka ayarlamalısınız: gönderim yetkisi olan sunucuları tanımlayan SPF ve maile dijital imza ekleyen DKIM. Bu kayıtlar alan adınızın DNS bölgesine eklenir; doğru yapılandırıldığında alıcı sunucular maili güvenilir kabul eder.
Burada altyapı tarafında çalıştığınız sağlayıcının kalitesi belirleyici olur. Alastyr’in kendi geliştirdiği, %100 KVKK uyumlu mail altyapısı; gelen ve giden tarafta antivirüs/antispam taraması yapar, Türkiye’nin en yüksek inbox (gelen kutusu) oranlarından birini sunar ve SPF/DKIM kurulumunu kolaylaştıran Türkçe bir arayüzle gelir. PHPMailer’i bu tür sağlıklı bir altyapıyla birlikte kullandığınızda, gönderdiğiniz formların ve bildirimlerin alıcıya ulaşma ihtimali ciddi şekilde artar.
Güvenlik için birkaç önemli not
- Şifreleri koda gömmeyin: Üretim ortamında SMTP şifresini doğrudan dosyaya yazmak yerine ortam değişkeni (environment variable) veya panel dışı bir yapılandırma dosyasında tutun.
- Kullanıcı girdisini temizleyin: Form alanlarını htmlspecialchars ve filter_var ile temizleyerek e-posta başlığı enjeksiyonu (header injection) saldırılarını önleyin.
- Sürümü güncel tutun: PHPMailer geçmişte ciddi güvenlik açıkları yaşadı; bu yüzden her zaman güncel kararlı sürümü (6.10 ve üzeri) kullanın. Composer ile güncelleme tek komut uzaklıkta.
- setFrom adresini sabitleyin: Gönderen adresini kullanıcının girdiği maile değil, kendi doğrulanmış kutunuza ayarlayın; yanıt için addReplyTo kullanın.
Sıkça Sorulan Sorular
PHPMailer nedir?
PHPMailer, PHP ile yazılmış uygulamalardan e-posta göndermek için kullanılan açık kaynaklı bir kütüphanedir. Belirlediğiniz bağlantı bilgileriyle bir mail sunucusuyla SMTP protokolü üzerinden haberleşir, kimlik doğrulaması yapar ve mesajınızı uygun başlık, kodlama ve eklerle hazırlayıp gönderir.
PHPMailer neden PHP mail() fonksiyonundan daha iyidir?
mail() fonksiyonu SMTP kimlik doğrulaması yapmaz, çoğu paylaşımlı hostingde kapalıdır ve teslim oranı düşüktür. PHPMailer ise SMTP üzerinden kimlik doğrular, TLS/SSL şifrelemesini destekler, dosya eki ve HTML gövdeyi kolayca yönetir ve ayrıntılı hata raporu verir. Bu yüzden maillerinizin gelen kutusuna ulaşma ihtimali çok daha yüksektir.
PHPMailer nasıl kurulur?
İki yöntem vardır. Önerilen yol Composer’dır: proje dizininizde composer require phpmailer/phpmailer komutunu çalıştırırsınız. Composer yoksa kütüphaneyi GitHub’dan ZIP olarak indirip içindeki src klasörünü sitenize yükler ve PHPMailer.php, SMTP.php, Exception.php dosyalarını require edersiniz.
PHPMailer hangi portu kullanmalı, 587 mi 465 mi?
Şifreleme yöntemine bağlıdır. STARTTLS (tls) için Port 587, SMTPS (ssl) için Port 465 kullanılır. Bu ikisini karıştırmayın; 587 portunda SSL ya da 465 portunda TLS denemek bağlantının kurulmamasına neden olur.
Türkçe karakterler bozuk geliyor, nasıl düzeltilir?
send() çağrısından önce $mail->CharSet = ‘UTF-8’; satırını eklemeniz yeterlidir. Bu ayar, gönderen adı, konu ve gövdedeki Türkçe karakterlerin doğru kodlanmasını sağlar.
PHPMailer ile gönderdiğim mailler neden spam klasörüne düşüyor?
En yaygın neden, alan adınızda SPF ve DKIM kayıtlarının eksik veya yanlış olmasıdır. Bu DNS kayıtları, alıcı sunuculara gönderimin yetkili olduğunu kanıtlar. Kayıtları doğru ayarlamak ve teslim oranı yüksek bir mail altyapısı kullanmak, gelen kutusuna ulaşma şansınızı belirgin biçimde artırır.
PHPMailer ile e-postaya dosya eki eklenebilir mi?
Evet. send() çağrısından önce $mail->addAttachment(‘/yol/dosya.pdf’, ‘Görünen-Ad.pdf’); satırını ekleyerek bir veya birden çok dosyayı maile iliştirebilirsiniz. Aynı şekilde addCC ve addBCC ile kopya ve gizli kopya alıcıları da tanımlayabilirsiniz.
PHPMailer’in güncel sürümü hangisi ve PHP 8 ile uyumlu mu?
Bu rehberin hazırlandığı dönemde güncel kararlı sürüm 6.10 serisidir ve PHP 5.5’ten PHP 8.4 ve sonrasına kadar uyumludur. Güvenlik yamalarını kaçırmamak için her zaman güncel kararlı sürümü kullanmanız önerilir.
PHPMailer kullanmak için gerçek bir e-posta hesabı şart mı?
Evet. PHPMailer SMTP üzerinden kimlik doğrulaması yaptığı için, hosting panelinizde oluşturduğunuz gerçek bir e-posta hesabının kullanıcı adı ve şifresine ihtiyaç duyar. Gönderen adresinin alan adınızla aynı domaine ait olması, teslim oranı açısından da önemlidir.
Maillerinizin ulaşması için sağlam bir altyapı şart
PHPMailer kodunuz ne kadar düzgün olursa olsun, gönderim yaptığınız mail altyapısı zayıfsa mesajlarınız gelen kutusuna düşmez. Alastyr’in kendi geliştirdiği, %100 KVKK uyumlu, antivirüs/antispam korumalı ve Türkiye’nin en yüksek inbox oranlarından birine sahip e-posta altyapısıyla formlarınız hep yerine ulaşsın.






yazı açıklayıcı fakat web sitene koyduğun sağ tık engeli yüzünden hiçbir işe yaramıyor. sadece zaman kaybı oldu benim için. bilmeni istedim. benim gibi hüsranla yorum bile yapmadan giden çok kişi vardır eminim. düzeltirsen bu durumu yorumlar da artar teşekkürler de. iyi çalışmalar
Merhaba Ahmet Bey, geri bildiriminiz için teşekkür ederiz. Sağ tık engelleme özelliği kalıcı olarak kapatılmıştır. İyi günler dileriz.
CLIENT: 220 smtp.gmail.com ESMTP v17-20020a170906293100b0077a11b79b9bsm3662325ejd.133 – gsmtp Bu hatayı alıyorum nedeni nedir acaba
Form çalışıyor anca mesaj kısımdan hariç bilgiler iletilmiyor. Yani isim, mail, konu filan iletilmiyor. Sebep?