PHP Mail Gönderme Nasıl Yapılır? PHPMailer ve mail() Kullanımı
PHP ile geliştirilen web sitelerinde en sık ihtiyaç duyulan işlemlerden biri e-posta göndermedir. İletişim formları, sipariş bildirimleri, üyelik doğrulama e-postaları, şifre sıfırlama bağlantıları ve sistem uyarıları genellikle PHP üzerinden e-posta olarak gönderilir.
PHP ile mail gönderimi için temel olarak iki farklı yöntem kullanılabilir:
PHP’nin yerleşik
mail()fonksiyonunu kullanmakSMTP destekli PHPMailer kütüphanesini kullanmak
Basit testler ve düşük öneme sahip bildirimler için mail() fonksiyonu yeterli olabilir. Ancak gerçek projelerde, özellikle iletişim formu, e-ticaret bildirimi, üyelik sistemi veya kurumsal web sitesi kullanımlarında PHPMailer ile SMTP üzerinden mail göndermek daha güvenilir ve profesyonel bir çözümdür.
SEO Bilgileri
SEO Başlığı: PHP Mail Gönderme Nasıl Yapılır? PHPMailer ve mail() Kullanımı
Meta Açıklama: PHP ile mail gönderme işlemini öğrenin. PHPMailer SMTP ayarları, PHP mail() fonksiyonu, iletişim formu mail gönderimi ve güvenli kod örnekleri.
URL Slug: php-mail-gonderme-phpmailer-mail-kullanimi
Odak Anahtar Kelime: PHP mail gönderme
Yardımcı Anahtar Kelimeler: PHPMailer kullanımı, PHP mail fonksiyonu, SMTP mail gönderme, PHP iletişim formu mail gönderme, PHP e-posta gönderme
PHP Mail Gönderme Nedir?
PHP mail gönderme, web siteniz üzerinden belirli bir alıcıya e-posta iletme işlemidir. Bu işlem; iletişim formundan gelen mesajları yönetici e-posta adresine ulaştırmak, müşterilere sipariş durumu göndermek veya kullanıcılara sistem bildirimleri iletmek için kullanılabilir.
PHP’de e-posta göndermek için iki temel yöntem vardır:
mail()fonksiyonuPHPMailer gibi SMTP destekli kütüphaneler
mail() fonksiyonu PHP içinde yerleşik olarak gelir. Ek kütüphane gerektirmez. Ancak SMTP kimlik doğrulaması, HTML mail, ek dosya gönderimi ve teslim edilebilirlik açısından sınırlıdır.
PHPMailer ise SMTP sunucusu üzerinden kullanıcı adı ve şifre ile doğrulanmış e-posta gönderimi sağlar. Bu nedenle daha güvenli, daha esnek ve daha profesyonel bir çözümdür.
PHP mail() Fonksiyonu Nedir?
mail() fonksiyonu, PHP’nin yerleşik e-posta gönderme fonksiyonudur. PHP 4, PHP 5, PHP 7 ve PHP 8 sürümlerinde kullanılabilir.
Temel kullanımı şu şekildedir:
mail(
string $to,
string $subject,
string $message,
array|string $additional_headers = [],
string $additional_params = ""
);
En basit haliyle alıcı e-posta adresi, konu ve mesaj içeriği verilerek e-posta gönderilebilir.
Ancak burada önemli bir nokta vardır: mail() fonksiyonunun true dönmesi, e-postanın alıcıya kesin olarak ulaştığı anlamına gelmez. Bu sadece sunucunun e-postayı gönderim için kabul ettiğini gösterir.
Sunucuda mail() Fonksiyonu Aktif mi?
Bazı hosting sağlayıcıları güvenlik veya spam önleme amacıyla PHP mail() fonksiyonunu kapatabilir. Sunucunuzda mail() fonksiyonunun aktif olup olmadığını aşağıdaki kod ile kontrol edebilirsiniz:
<?php
if (function_exists('mail')) {
echo 'mail() fonksiyonu aktif.';
} else {
echo 'mail() fonksiyonu devre dışı.';
}
Eğer mail() fonksiyonu devre dışıysa PHPMailer ile SMTP üzerinden mail göndermek daha doğru bir çözüm olacaktır.
PHP mail() ile Basit E-posta Gönderme
Aşağıdaki örnek, PHP mail() fonksiyonu ile basit bir e-posta gönderimi yapar:
<?php
$to = '[email protected]';
$subject = 'PHP Mail Testi';
$message = 'Merhaba, bu PHP mail() fonksiyonu ile gönderilen test e-postasıdır.';
$headers = [
'From' => '[email protected]',
'Reply-To' => '[email protected]',
'Content-Type' => 'text/plain; charset=UTF-8',
'X-Mailer' => 'PHP/' . phpversion()
];
$success = mail($to, $subject, $message, $headers);
if ($success) {
echo 'E-posta gönderim için kabul edildi.';
} else {
echo 'E-posta gönderilemedi.';
}
Bu yöntem basit kullanım için uygundur. Fakat profesyonel projelerde doğrudan mail() kullanmak her zaman sağlıklı sonuç vermez. Çünkü e-postalar spam klasörüne düşebilir, SMTP doğrulaması yapılamaz ve gelişmiş mail özellikleri sınırlı kalır.
mail() Fonksiyonunun Avantajları
PHP mail() fonksiyonunun bazı avantajları şunlardır:
Ek kütüphane kurulumu gerektirmez.
Basit kullanıma sahiptir.
Küçük test işlemleri için hızlıdır.
PHP içinde yerleşik olarak gelir.
mail() Fonksiyonunun Dezavantajları
mail() fonksiyonunun önemli dezavantajları vardır:
SMTP kimlik doğrulaması doğal olarak desteklenmez.
HTML e-posta ve ek dosya yönetimi zordur.
Spam klasörüne düşme ihtimali yüksektir.
Toplu mail gönderimleri için verimli değildir.
Sunucuda mail servisi doğru yapılandırılmamışsa çalışmayabilir.
Güvenlik açısından ekstra dikkat gerektirir.
Bu nedenle canlı web sitelerinde ve ticari projelerde PHPMailer kullanımı daha doğru bir tercihtir.
PHPMailer Nedir?
PHPMailer, PHP ile SMTP üzerinden güvenli ve profesyonel e-posta göndermek için kullanılan popüler bir kütüphanedir.
PHPMailer ile şu işlemler yapılabilir:
SMTP sunucusu üzerinden kimlik doğrulamalı mail gönderimi
HTML formatında e-posta gönderimi
Düz metin alternatif içerik ekleme
Dosya eki gönderme
Birden fazla alıcı, CC ve BCC ekleme
UTF-8 karakter desteği
TLS veya SSL ile güvenli bağlantı
Hata yönetimi ve debug işlemleri
Kurumsal web siteleri, e-ticaret sistemleri, üyelik panelleri ve iletişim formları için PHPMailer daha sağlıklı bir mail gönderme yöntemidir.
PHPMailer Kurulumu
PHPMailer kurulumu için önerilen yöntem Composer kullanmaktır.
Sunucunuzda Composer varsa proje dizininde şu komutu çalıştırabilirsiniz:
composer require phpmailer/phpmailer
Kurulumdan sonra PHPMailer dosyaları vendor klasörü altında yer alır. PHP dosyanızda Composer autoload dosyasını çağırarak kullanabilirsiniz:
require __DIR__ . '/vendor/autoload.php';
Composer kullanamıyorsanız PHPMailer dosyalarını manuel olarak indirip projeye dahil edebilirsiniz. Ancak güncelleme ve bakım kolaylığı açısından Composer kullanımı daha sağlıklı bir yöntemdir.
PHPMailer ile SMTP Üzerinden Mail Gönderme
Aşağıdaki örnek, PHPMailer ile güvenli SMTP bağlantısı kullanarak e-posta gönderir.
<?php
declare(strict_types=1);
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require __DIR__ . '/vendor/autoload.php';
$mail = new PHPMailer(true);
try {
// SMTP sunucu ayarları
$mail->CharSet = 'UTF-8';
$mail->isSMTP();
$mail->SMTPDebug = 0;
$mail->Host = 'mail.domain.com';
$mail->SMTPAuth = true;
$mail->Username = '[email protected]';
$mail->Password = 'SMTP_SIFRENIZ';
// 587 için STARTTLS kullanılır
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;
// Gönderen ve alıcı bilgileri
$mail->setFrom('[email protected]', 'Web Sitesi');
$mail->addAddress('[email protected]', 'Alıcı Adı');
$mail->addReplyTo('[email protected]', 'Web Sitesi');
// Mail içeriği
$mail->isHTML(true);
$mail->Subject = 'PHPMailer Test E-postası';
$mail->Body = '<h2>Merhaba</h2><p>Bu e-posta PHPMailer ile SMTP üzerinden gönderilmiştir.</p>';
$mail->AltBody = 'Merhaba, bu e-posta PHPMailer ile SMTP üzerinden gönderilmiştir.';
$mail->send();
echo 'E-posta başarıyla gönderildi.';
} catch (Exception $e) {
echo 'E-posta gönderilemedi. Hata: ' . $mail->ErrorInfo;
}
465 SSL ve 587 TLS SMTP Ayarları
SMTP gönderimlerinde en sık kullanılan iki port vardır:
// 587 STARTTLS
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;
// 465 SSL / SMTPS
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
$mail->Port = 465;
Genellikle modern SMTP yapılandırmalarında 587 portu ve STARTTLS kullanılır. Ancak hosting firmanız 465 portu sağlıyorsa SSL / SMTPS ayarı da kullanılabilir.
SMTP bilgileriniz genellikle hosting panelinizde veya e-posta hesabı ayarlarında yer alır. Aşağıdaki bilgileri doğru şekilde girmeniz gerekir:
SMTP sunucu adresi
SMTP portu
E-posta kullanıcı adı
E-posta şifresi
Güvenlik türü: TLS veya SSL
PHP İletişim Formu ile PHPMailer Kullanımı
Aşağıdaki örnekte, bir iletişim formundan gelen ad, e-posta ve mesaj bilgileri doğrulanarak site yöneticisine gönderilir.
HTML Form Örneği
<form method="post" action="send-mail.php">
<label for="name">Adınız</label>
<input type="text" id="name" name="name" required maxlength="80">
<label for="email">E-posta Adresiniz</label>
<input type="email" id="email" name="email" required maxlength="120">
<label for="message">Mesajınız</label>
<textarea id="message" name="message" required maxlength="3000"></textarea>
<button type="submit">Gönder</button>
</form>
send-mail.php Örneği
<?php
declare(strict_types=1);
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require __DIR__ . '/vendor/autoload.php';
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
http_response_code(405);
exit('Geçersiz istek.');
}
$name = trim($_POST['name'] ?? '');
$email = trim($_POST['email'] ?? '');
$message = trim($_POST['message'] ?? '');
if ($name === '' || $email === '' || $message === '') {
exit('Lütfen tüm alanları doldurun.');
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
exit('Lütfen geçerli bir e-posta adresi girin.');
}
if (mb_strlen($name) > 80 || mb_strlen($email) > 120 || mb_strlen($message) > 3000) {
exit('Form alanları izin verilen uzunluğu aşıyor.');
}
$safeName = htmlspecialchars($name, ENT_QUOTES, 'UTF-8');
$safeEmail = htmlspecialchars($email, ENT_QUOTES, 'UTF-8');
$safeMessage = nl2br(htmlspecialchars($message, ENT_QUOTES, 'UTF-8'));
$mail = new PHPMailer(true);
try {
$mail->CharSet = 'UTF-8';
$mail->isSMTP();
$mail->SMTPDebug = 0;
$mail->Host = 'mail.domain.com';
$mail->SMTPAuth = true;
$mail->Username = '[email protected]';
$mail->Password = 'SMTP_SIFRENIZ';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;
// Maili kendi kurumsal adresinizden gönderin
$mail->setFrom('[email protected]', 'Web Sitesi İletişim Formu');
// Mesaj site yöneticisine gider
$mail->addAddress('[email protected]', 'Site Yöneticisi');
// Cevapla denildiğinde formu dolduran kişiye cevap gider
$mail->addReplyTo($email, $name);
$mail->isHTML(true);
$mail->Subject = 'Yeni İletişim Formu Mesajı';
$mail->Body = "
<h2>Yeni İletişim Formu Mesajı</h2>
<p><strong>Ad:</strong> {$safeName}</p>
<p><strong>E-posta:</strong> {$safeEmail}</p>
<p><strong>Mesaj:</strong></p>
<p>{$safeMessage}</p>
";
$mail->AltBody = "Yeni iletişim formu mesajı\n\n"
. "Ad: {$name}\n"
. "E-posta: {$email}\n\n"
. "Mesaj:\n{$message}";
$mail->send();
echo 'Mesajınız başarıyla gönderildi.';
} catch (Exception $e) {
error_log('PHPMailer Hatası: ' . $mail->ErrorInfo);
echo 'Mesajınız gönderilemedi. Lütfen daha sonra tekrar deneyin.';
}
Bu örnekte formdan gelen kullanıcı e-posta adresi doğrudan gönderen adres olarak kullanılmaz. Bunun yerine kurumsal e-posta adresi gönderen olarak belirlenir. Formu dolduran kişinin e-posta adresi ise Reply-To alanına eklenir. Bu yöntem teslim edilebilirlik açısından daha sağlıklı bir yaklaşımdır.
SMTP Şifresini Kod İçinde Saklamayın
Canlı projelerde SMTP şifresini doğrudan PHP dosyası içine yazmak önerilmez. Bunun yerine .env dosyası veya sunucu ortam değişkenleri kullanılabilir.
Basit bir örnek:
$mail->Host = getenv('SMTP_HOST');
$mail->Username = getenv('SMTP_USER');
$mail->Password = getenv('SMTP_PASS');
$mail->Port = (int) getenv('SMTP_PORT');
Bu yapı sayesinde şifreler kod dosyasında görünmez. Ayrıca proje farklı sunuculara taşındığında SMTP bilgilerini yönetmek daha kolay olur.
SMTPDebug Değeri Ne İşe Yarar?
PHPMailer’da SMTPDebug değeri, mail gönderiminde yaşanan sorunları analiz etmek için kullanılır.
$mail->SMTPDebug = 0;
Canlı sitelerde 0 kullanılmalıdır. Çünkü debug çıktıları SMTP sunucu bilgilerini ve hata detaylarını kullanıcıya gösterebilir.
Test sırasında geçici olarak şu değerler kullanılabilir:
$mail->SMTPDebug = 1;
$mail->SMTPDebug = 2;
Test tamamlandıktan sonra debug değeri mutlaka tekrar 0 yapılmalıdır.
SSL Doğrulamasını Kapatmalı mıyım?
Bazı eski örneklerde şu tarz kodlar görülebilir:
$mail->SMTPOptions = [
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
]
];
Bu yapı SSL sertifika doğrulamasını devre dışı bırakır. Canlı projelerde önerilmez. Eğer SMTP bağlantısında SSL hatası alıyorsanız öncelikle şu kontroller yapılmalıdır:
SMTP sunucu adı doğru mu?
Kullanılan port doğru mu?
TLS / SSL ayarı doğru mu?
Sunucuda geçerli SSL sertifikası var mı?
Hosting sağlayıcısının verdiği SMTP bilgileri doğru mu?
SSL doğrulamasını kapatmak sadece geçici test amacıyla düşünülmelidir. Kalıcı çözüm olarak kullanılmamalıdır.
PHPMailer ve mail() Karşılaştırması
| Özellik | PHP mail() | PHPMailer |
|---|---|---|
| Kurulum | Ek kurulum gerekmez | Composer veya manuel kurulum gerekir |
| SMTP desteği | Sınırlı | Güçlü SMTP desteği vardır |
| Kimlik doğrulama | Zayıf | SMTP kullanıcı adı ve şifre ile doğrulama yapılır |
| HTML mail | Zor yönetilir | Kolay kullanılır |
| Ek dosya | Manuel uğraştırır | Kolay destekler |
| Spam riski | Daha yüksek olabilir | Doğru SMTP ile daha düşüktür |
| Hata yönetimi | Sınırlıdır | Daha detaylıdır |
| Profesyonel kullanım | Önerilmez | Önerilir |
PHP Mail Gönderiminde Dikkat Edilmesi Gerekenler
PHP ile mail gönderirken şu noktalara dikkat edilmelidir:
Form verileri mutlaka doğrulanmalıdır.
E-posta adresi
filter_var()ile kontrol edilmelidir.Kullanıcıdan gelen içerik HTML çıktısında güvenli hale getirilmelidir.
SMTP şifresi kod içinde açık şekilde tutulmamalıdır.
Canlı ortamda debug çıktısı kapalı olmalıdır.
Mail gönderiminde kurumsal e-posta adresi kullanılmalıdır.
SPF, DKIM ve DMARC kayıtları doğru yapılandırılmalıdır.
Toplu mail gönderimi için özel e-posta servisleri tercih edilmelidir.
İletişim formlarında spam koruması kullanılmalıdır.
WordPress Sitelerde Mail Sorunu
Eğer siteniz WordPress altyapısı ile hazırlanmışsa PHP dosyaları üzerinden manuel mail ayarı yapmak yerine SMTP eklentileri kullanılabilir.
WordPress sitelerde mail gönderim sorunlarının en yaygın nedenleri şunlardır:
Hosting sunucusunda
mail()fonksiyonunun kapalı olmasıSMTP ayarlarının yapılmamış olması
SPF, DKIM veya DMARC kayıtlarının eksik olması
Gönderen e-posta adresinin domain ile uyumsuz olması
E-postaların spam filtrelerine takılması
Bu durumda WordPress SMTP ayarlarını yapılandırarak e-postaların daha sağlıklı gönderilmesi sağlanabilir.
Sonuç
PHP ile e-posta göndermek için mail() fonksiyonu kullanılabilir. Ancak bu yöntem daha çok basit testler ve düşük öneme sahip işlemler için uygundur.
Gerçek projelerde, özellikle iletişim formları, sipariş bildirimleri, üyelik sistemleri ve kurumsal web siteleri için PHPMailer kullanmak daha güvenilir bir çözümdür. PHPMailer sayesinde SMTP kimlik doğrulaması yapılabilir, HTML e-posta gönderilebilir, hata yönetimi daha sağlıklı şekilde yapılabilir ve mail teslim edilebilirliği artırılabilir.
Kısaca özetlemek gerekirse:
Basit test için
mail()kullanılabilir.Profesyonel projeler için PHPMailer tercih edilmelidir.
SMTP ayarları doğru yapılmalıdır.
Güvenlik için form verileri doğrulanmalıdır.
Canlı ortamda SMTP şifreleri kod içinde saklanmamalıdır.
Doğru yapılandırılmış bir PHPMailer sistemi ile PHP tabanlı web sitenizde güvenli, düzenli ve profesyonel e-posta gönderimi sağlayabilirsiniz.