Uzun süredir PHP yazısı yazmıyorum. Yazacak çok şey birikti aslında yavaştan yavaştan başlamak lazım dedim ve bugün PHP ile SMTP server üzerinden mail gönderme işlemini bir önceki yazımda bahsettiğim sitede bulduğum bir class’ı kullanarak nasıl yapabileceğimizi anlatacağım.
Öncelikle niçin PHP’nin hali hazırdaki mail() fonksiyonu ile değil de SMTP üzerinden mail gönderme işlemi yapacağız ona bir açıklama getireyim.
- Öncelikle direk gönderilen maillerin spam mail olarak algılanma olasılığının daha yüksek olduğu biliniyor,
- Bir çok hosting firması gerek güvenlik gerekse IP adreslerinin itibarı açısından PHP’nin mail gönderme fonksiyonunu devre dışı bırakıyor,
- Bazı mail okuyucular SMTP server tarafından imzalanmamış mailleri kabul etmemekte.
Kısaca bu şekilde özetledikten sonra şimdi işlemleri nasıl yapacağımıza geçelim..
Öncelikle PHP Classes sitesinden PHPMailer class’ını indiriyoruz.
İndirdiğimiz pakette class.phpmailer.php ve class.smtp.php adında 2 dosya olmalı. Biz işlemlerimizi yaparken sadece class.phpmailer.php dosyasını çağıracağız. Ayrıca paketin içerisinde yer alan ve sınıfın tüm özellik ve metodlarının açıklamalarının yer aldığı phpmailer_doc.html dökümanına göz atmayı unutmayın. Ben mail gönderirken kullanacağımız birkaç tanesini açıklayacağım. İşte mail göndereceğimiz kodlar:
// PHPMailer dosyamızı çağırıyoruz require("class.phpmailer.php"); // Sınıfımızı $mail değişkenine atadık $mail = new PHPMailer(); $mail->IsSMTP(); // Mailimizin SMTP ile gönderileceğini belirtiyoruz $mail->From = "user@domain.com"; //Gönderen kısmında yer alacak e-mail adresi $mail->Sender = "user@domain.com"; $mail->ReplyTo = "user@domain.com"; $mail->FromName = "PHP Mailer"; $mail->Host = "smtp.domain.com"; //SMTP server adresi $mail->SMTPAuth = true; //SMTP server'a kullanıcı adı ile bağlanılcağını belirtiyoruz $mail->Username = "user@domain.com"; //SMTP kullanıcı adı $mail->Password = "password"; //SMTP şifre $mail->WordWrap = 50; $mail->Subject = "Deneme Maili"; // Konu //Mailimizin HTML formatında hazırlanacağını bildiriyoruz. $mail->IsHTML(true); //Mailimizin gövdesi: (HTML ile) $body = "<strong>Bu mail</strong> bir deneme mailidir. SMTP server ile gönderilmiştir."; // HTML okuyamayan mail okuyucularda görünecek düz metin: $textBody = "Bu mail bir deneme mailidir. SMTP server ile gönderilmiştir."; $mail->Body = $body; $mail->AltBody = $text_body; // Mail gönderilecek adresleri ekliyoruz. $mail->AddAddress("muhittin@muhittinozer.com"); $mail->AddAddress("hedef@domain.com"); if ( $mail->Send() ) echo "Mail gönderildi"; else echo "Mail gönderimi başarısız"; $mail->ClearAddresses(); $mail->ClearAttachments();
İşlem bu kadardan ibaret. Kodlar üzerinde gerekli açıklamaları yaptım. Ancak ard arda çok fazla mail göndermek spam olarak algılanmasına neden olabilir hatta olur. Bunun için toplu gönderilecek bülten gibi maillerde fazla adres eklemek yerine aralıklarla gönderme işlemini yapmak daha mantıklı olacaktır. Bunu da kodları mail adresi ekleme işleminden sonrasını (26. satır) şu şekilde düzenleyerek yapabiliriz:
//maillerimizin $mails dizisinde olduğunu varsayıyorum $mails = array("muhittin@muhittinozer.com","hedef@domain.com","hedef2@domain.com"); foreach($mails as $mail) { $mail->AddAddress($mail); $mail->Send(); $mail->ClearAddresses(); $mail->ClearAttachments(); // 2 sn bekletiyoruz mail gönderme işlemi arasında.. sleep(2); }
Orjinal paketle birlikte buradaki örnek uygulamayı da içeren paketi buradan indirebilirsiniz.
Sizin de eklemek istedikleriniz varsa yorumlarınızı bekliyorum.

PHP ile SMTP üzerinden mail gönderme için 47 cevap
serhat 12 Nisan 2009
merhaba,
faydalı yazınız için teşekkür ederim.
Ramazan 25 Nisan 2009
Yazı için ben de teşekkür ederim. Normalde smtp olarak değil de yazıda da bahsettiğiniz gibi mail fonksiyonuyla gönderiyordum. bilgilendirme güzel olmuş
mert 18 Haziran 2009
bilgi için teşekkürler,
peki bir web sayfasında listelenen e-mail adreslerine veya toplu listeye nasıl göndereceğiz?
Muhittin Özer 18 Haziran 2009
Bu soru bilinmeyenleri çok fazla bir soru.
Bir sayfadaki e-mail adreslerini okuma işlemini regexp fonksiyonlarıyla yapabilir ve o adreslere mail gönderebilirsiniz.
Toplu listeye ise listenizdeki e-mail adreslerini bir döngü ile okuyup gönderebilirsiniz. Ancak SPAM olma ihtimali yüksek olur.
mustafa tavbatır 06 Ağustos 2009
selamlar, makale çok güzel ancak anlatımınız dışında da olsa birkaç sorum olacak. bilgilendirirseniz çok sevinirim.
SMTP server adresi
SMTP kullanıcı adı
SMTP şifre
bunları nereden öğrenebilirim. açıkçası kullandığım linux sunucusunda smtp olup olmadığını bile bilmiyorum.
phpinfo ile sadece smtp ile ilgili bunları görebildim
SMTP localhost
smtp_port 25
beytullah 25 Ağustos 2009
$mail->send(); fonksiyonunda sorun var sanırım. kod bu functiondan itibaren çalışmıyor.
çağrı 21 Eylül 2009
makale ve bilgilendirme için çok teşekkür ederim. Ancak ne yaptıysam bir türlü mail gönderme işlemini gerçekleştiremedim. Port olarak 587 yi kullanıyorum 25i kullandığımda bağlantı “unable to connect to mail.ixirhc.com:25 (Bağlanılan uygun olarak belli bir süre içinde yanıt vermediğinden veya kurulan bağlantı bağlanılan ana makine yanıt vermediğinden bir bağlantı kurulamadı. ) in C:\xampp\htdocs\smtp-mail\class.smtp.php on line 89″ diye hata alıyorum. Yardımcı olursanız sevinirim.
Muhittin Özer 24 Eylül 2009
@Mustafa Tavbatır: SMTP bilgilerinizi hosting firmanızdan öğrenebilirsiniz.
@beytullah: bu fonksiyon mailin gönderildiği fonksiyondur. Hata varsa bilgilerde eksiklik veya hata var demektir. Hatayı sayfaya yazdırmak için
echo $mail->ErrorInfo;
kodunu kullanabilirsiniz.
@çağrı: SMTP bilgilerini hosting firmanızdan öğrenebilirsiniz. Bilgileri PHPMailer class’ında yer alan ayarlarla (port,ssl gibi) sınıfa tanıttığınızda mail göndermenizde sorun yaşamazsınız.
hikmet 04 Ocak 2010
arkadaşlar herkez smtp mail arayışında bende çok aradım ve müthiş bir çözüm buldum bunuda sizlerle sitemde paylaştım sadece girin ve indirin üyelik gerekmez ve takıldığınız yerde yardımcıda olurum emin olun kesim çözüm ve bu smtp mail php icinden kodu cekip okuycak tek yapman gereken iletişim formunda okuyucagı yeri gonder.php yapman ve rar içindeki 3 php yide sitenizin bulunduğu yere koymanız .
gonder.php icerisinde yapılması gereken değişikleri acıp baktığınızda anlıycaksınız.
Muhittin Özer 05 Ocak 2010
Arkadaşım amacımız hazır kod dağıtmak değil nasıl yapıldığını anlatmak google’da aradığınız zaman zaten 100′lerce script var bahsettiğin şeyi yapan..
Chaos TİME 10 Ocak 2010
s.a kardeş cok güzel anlatmışsın ben burda yaptım ve oldu yanlız şöle birşey var kimden bölümünde ben mail adresi değilde diyelim ChaosTime(mcmd@mc-md.net) olmasın istiyorum bunu nasıl yaparız bana yardım edersen sevinirim kal salıcakla..ellerine sağlık ustat..ajax delisi
Muhittin Özer 12 Ocak 2010
@Chaos TİME:
$mail->FromName = “PHP Mailer”;
satırında “Kimden” kısmında görünecek isminizi yazabilirsiniz.
viaria 04 Ağustos 2010
teşekürler, biraz zorlanarakta olsa başardım.
bülent aydemir 28 Ağustos 2010
class.phpmailer.php dosyasını webserver da hangi dizine koyacağız?
Muhittin Özer 29 Ağustos 2010
@bülent aydemir:
O dosyayı server’da uygulamanızın bulunduğu dizine veya başka bir dizine kaydedebilirsiniz. Önemli olan uygulamanızda bu dosyayı doğru dosya yolu ile çağırmanızdır.
ali 01 Eylül 2010
öncelikle paylaşım için teşekkürler. yukarıdaki kodu aynen uyguladım. ancak aşağıdaki hata mesajını alıyorum:
“Mail gönderimi başarısızLanguage string failed to load: connect_host”
sorun ne olabilir? nasıl çözebiliriz?
teşekkürler
Halil Kaya 30 Eylül 2010
Merhaba. Benim aldığım hata da şu:
SMTP Error: Could not authenticate
Gmail üzerinden göndermeye çalışıyorum fakat bu hatayı alıyorum. Yardımcı olabilir misiniz?
Muhittin Özer 23 Ekim 2010
@Halil Kaya:
Gmail’den gönderim yapmak için PHPMailer’ın son versiyonunu kullanmanız gerekmektedir. Yazıda kullanılan versiyonda Gmail desteği yoktu.
erdem 05 Kasım 2010
mail fonksiyonu ile
$title= “asd”;
$konu = “”.$kn.”";
$mesaj = ”.$msj.”;
$ustk = “From: “.$titl.”\\n”;
şeklinde title bölümünü header a eklediğimde, mail ulaştığı anda mesela msn açık yan tarafta bu title çıkıyor. yada maili açınca.
Ama smtp ile yolladığımda bilgilen…@….com çıkıyor.
Bazı mailler geldiğinde dikkat ediyorum
Grupanya yada Sadece R10 yazıyor bunu nasıl sağlıyoruz.
Teşekkürler.
Muhittin Özer 06 Kasım 2010
@erdem:
$mail->FromName = “PHP Mailer”;
satırına görünmesini istediğin ismi yazabilirsin
ahmet 07 Kasım 2010
acilçözülmesi gereken bi sorunum var sitelerim daha önce farklı bi sunucudaydı problem yasadık ve sunucu degıstırdık ama farkettım kı ıkı hafta gecmesıne rahmen sipariş alamadım site uzerınde ki beni ara butonuna basılınca hata verıyor sipariş alamıyorum yanı yardımcı olursanız sevinırım neyden kaynalanıyor problem anlamıyorum
Fatih 12 Aralık 2010
mail gönderimi başarısız.
Mesajı alıyorum.
class.phpmailer.php sayfasında değişiklik yapacağımız yerleri belirtebilirmisiniz. Ben sadece port:25 i (587) yaptım. birde ornek.php değişiklerini yaptım. Teşekkürler.
kumsal 16 Aralık 2010
Gönder dediğim zaman, posta kutusuna boş içerik düşüyor bu nasıl çözülür?
serdar 20 Aralık 2010
merhabalar bende bu class ı kullanıyorum.
Ama ne hata alıyorum nede mail gidiyor.
Acaba $mail->Send() kısmından dönen bir değer varmı bu değeri gösterebilirmiyim en azından hatayı görmek adına.
Aytac GUL 20 Aralık 2010
Script guzel fakat her zaman mail gonderisi yapmiyor. Bazen hata veriyor bazen gonderiyor. Bunun sebebi ne olabilir.
Cihan 13 Mayıs 2011
Teşekkürler, uzun zamandır aynı şekilde smtp’ye geçmek istiyordum bu güzel anlatım ve örnek ile geçmiş bulunuyorum. Eline sağlık.
Selcuk 28 Mayıs 2011
Paylaşımın için çok teşekkür ederim, çok fazla sitede aradım tek bu işe yaradı.
Deniz Yeşilırmak 20 Ağustos 2011
Merhaba.
Ben “Fatal error: Class ‘SMTP’ not found in C:\wamp\www\class.phpmailer.php on line 654″ hatası alıyorum. Bir fikriniz var mı? Teşekkürler.
Serhat 20 Ağustos 2011
Teşekkürler. Benim tek sıkıntım yine maillerin macarca gibi gelmesi.
Sistem gayet güzel çalışıyor. İçinde bir yerde “encode” bölümü mevcut 8859-1 olarak duruyor onu 8859-9 yaptım ama nafile.
Başka bir yöntem varmı bildiğiniz.
İyi çalışmalar
Muhittin Özer 22 Ağustos 2011
Arkadaşlar geciken cevaplar için kusura bakmayın.
@ahmet: Sorunun birçok farklı nedenden kaynaklanıyor olabilir. Kodu debug etmeyi dene kaynağını bulursun.
@Fatih: Değiştirilecek tüm ayarlar yazıda mevcut ekstra bir ayara lüzum kalmıyor.
@kumsal: Gönderdiğin mailin içeriğini bilmediğim için birşey söylemem mümkün değil. Örnekteki kodu aynen çalıştırıp sonucu iletirsen yardımcı olmaya çalışalım.
@serdar: Send() methodu eğer gönderme başarısızsa false değerini dönecektir. Bu durumda $mail->ErrorInfo değişkeniyle hata bilgisini alabilirsiniz.
@Aytaç Gül: $mail->ErrorInfo değişkeniyle dönen hatayı görebilirsiniz.
@Deniz Yeşilırmak: class.smtp.php dosyasının aynı dizinde olduğuna emin olun.
@Serhat: Dosyaların karakter kodlamasının, veritabanından çekilen değerlerin karakter kodlamasının, mailin header bilgilerindeki karakter kodlamasının aynı olduğuna emin olun. Türkçe karakter hataları ile ilgili daha geniş bilgi aşağıda linki olan makalemde mevcut:
http://www.muhittinozer.com/2008/07/21/php-ve-mysql%e2%80%99de-sik-yasanan-turkce-karakter-problemleri/
erdal 24 Eylül 2011
Hocam merhabalar..
SMTP Error: Could not connect to SMTP host. Mail gönderimi başarısız
hatası alıyorum yardımcı olabilirmisiniz
Muhittin Özer 03 Ekim 2011
@erdal: SMTP bilgilerini tekrar kontrol edin, SMTP sunucusuna bağlanamıyor.
erdal 03 Ekim 2011
Hocam ayarladım sağolun. İki problemim var..
1. si ReplyTo hatası :
Fatal error: Cannot access protected property PHPMailer::$ReplyTo
2. si ReplyTo kodunu kaldırdığımda mesaj gönderiliyor ama spama düşüyor
Teşekküler
curucafa 21 Ekim 2011
Çalışmaması çok normal çünkü ssl doğrulaması yapması gerekiyor ve bu yüzden mail gönderimi başarısız oluyor..
Örnek olarak ;
$mail->IsSMTP(); // telling the class to use SMTP
$mail->Mailer = “smtp”;
$mail->Host = “ssl://smtp.gmail.com”;
$mail->Port = 465;
$mail->SMTPAuth = true; // turn on SMTP authentication
$mail->Username = “xxxxx@gmail.com”; // SMTPkullanıcı adı
$mail->Password = “xxxxx”; // SMTPşifresi
bu şekilde deneyebilirsiniz
soulpoint 28 Kasım 2011
Hocam merhaba,
web sitemde iletişim ve başvuru formu bulunmakta.. bu iki formda gayet güzel çalışıyordu fakat şimdi “gönder” e tıklandığında aşağıdaki iletiyi alıyorum.
Sunucuyla iletişime geçtim port 25 i 465 yap dedi iyide benim php sayfamda portla alakalı bişey yokki…
Ne yapmam konusunda yardımcı olursanız sevinirim.
Warning: mail() [function.mail]: Failed to connect to mailserver at “localhost” port 25, verify your “SMTP” and “smtp_port” setting in php.ini or use ini_set() in C:\Inetpub\vhosts\tmmotivasyon.com\httpdocs\ik_gonder.php on line 95
Warning: Cannot modify header information – headers already sent by (output started at C:\Inetpub\vhosts\tmmotivasyon.com\httpdocs\ik_gonder.php:95) in C:\Inetpub\vhosts\tmmotivasyon.com\httpdocs\ik_gonder.php on line 96
Warning: Cannot modify header information – headers already sent by (output started at C:\Inetpub\vhosts\tmmotivasyon.com\httpdocs\ik_gonder.php:95) in C:\Inetpub\vhosts\tmmotivasyon.com\httpdocs\ik_gonder.php on line 97
Muhittin Özer 04 Aralık 2011
@soulpoint:
PHP’nin doğal mail() fonksiyonu mail göndermek için 25 portunu kullanır. Ancak Türk Telekom birkaç yıl önce mail gönderimi için 587 portunu tahsis etti. mail() fonksiyonunun bu portu kullanabilmesi için server konfigürasyonunun buna göre yapılandırılması gerekmektedir.
duck 08 Aralık 2011
merhaba,
ekteki rar dosyasını bir tek ben mi download edemiyorum? karakterleri bozuk bir txt dosyası geliyor? :S (mac ve safari kullanıyorum)
çalışan örneği başka bir yerden bulup download etmem mümkün mü acaba?
Muhittin Özer 12 Aralık 2011
@duck: Dosyanın zip’li halini aşağıdaki linkten indirebilirsin.
http://www.muhittinozer.com/dosyalar/smtp-mail.zip
heyoo 20 Aralık 2011
26. satırda
$mail->AddAddress(“muhittin@muhittinozer.com”); // Mail gönderilecek adresleri ekliyoruz.
sqlimden mail adresi çektim.
“muhittin@muhittinozer.com” yerine veritabanından veriyi çekerek o kişiye mail atmak istiyorum. ancak bir türlü beceremedim hata veriyor.
bu alanı nasıl düzenlemem gerekiyor. echo ile içine bastıramıyorum değeri.
şimdiden teşekkür ederim.
heyoo 16 Ocak 2012
body alanının içine formdan gelen veriyi post etmek istiyorum. sorunla karışılaşıyorum. örnek verirmisin nasıl olacak
Yusuf 16 Ocak 2012
Mail gönderimi başarısız mesajı alıyorum bende. sıkıntı ne olabilir, ugrastim baya ama bulamadim sorunu.
abdul 18 Ocak 2012
arkadaşlar burada bir sorun var…
sunucumdan bu mesaj geliyor…
Destek kayıtlarınızda bildirildiği gibi smtp portunu 587 olarak güncellemenizi rica ederiz.
587 port bu formun neresine güncellenecek bilen var mı…
mesut 19 Ocak 2012
valla ellerin dert görmesin düşüncen için tebrik etmek gerekir hazır kod dagıtmak değilde ögretmek en güzeli ve bu kadar kişiyi önemseyip cevap vermen cok etkileyici yorumların bir kacını okudum ve toplu mail göönderecek arkadasa bir önerim olacak mail adreslerini veritabanından cekeceksen bilgileri cekip dizin halinde gidecek olan adrese tanımlaman ve sleep i 10 yapman senin açından güzel olacaktır hem 10 saniye arayla gönderecek spam sayılma ihtimali azalacaktır hemde listelettiğin adreslere mailin gidecektir.
Kpss Rehber 28 Ocak 2012
Arkadaşlar Class dosyalarını inderemiyorum.. Elinde olan varmı?
şenol 30 Ocak 2012
Muhittin bey acaba smtp sisteminde dosy göndermek nasıl olucak
yusuf karsuyu 04 Şubat 2012
ellerinize sağlık muhyittin bey güzel yazı olmuş açıkcası kaç gündür yaşadığım sorunu hallettim hostingim smtp çalışıyormuş bende mail neden gitmiyor diyordum hem daha güzel oldu böylece gereksiz kutusunada mail göndermemiş oluyoruz . yanlız bir ricam olucak muhyittin bey
$mail->From = “user@domain.com”; //Gönderen kısmında yer alacak e-mail adresi
$mail->Sender = “user@domain.com”;
$mail->ReplyTo = “user@domain.com”;
$mail->FromName = “PHP Mailer”;
gönderen kısmında yer alıcak demişsiniz kullanıcı formda mail yazıyorken email adresını yazıyorya bu onumu ifade eediyor
bunların 4 dünü tanımlamanız mümkünse sevinirim yok tanımlıyamam dersenizde canınız saolsun bu kadarını yaptınız.o bile önemli