PHP ile SMTP üzerinden mail gönderme

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
  1. serhat

    merhaba,
    faydalı yazınız için teşekkür ederim.

  2. Ramazan

    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ş

  3. mert

    bilgi için teşekkürler,
    peki bir web sayfasında listelenen e-mail adreslerine veya toplu listeye nasıl göndereceğiz?

  4. Muhittin Özer

    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.

  5. mustafa tavbatır

    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

  6. beytullah

    $mail->send(); fonksiyonunda sorun var sanırım. kod bu functiondan itibaren çalışmıyor.

  7. çağrı

    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.

  8. Muhittin Özer

    @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.

  9. hikmet

    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.

  10. Muhittin Özer

    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..

  11. Chaos TİME

    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

  12. Muhittin Özer

    @Chaos TİME:
    $mail->FromName = “PHP Mailer”;
    satırında “Kimden” kısmında görünecek isminizi yazabilirsiniz.

  13. viaria

    teşekürler, biraz zorlanarakta olsa başardım.

  14. bülent aydemir

    class.phpmailer.php dosyasını webserver da hangi dizine koyacağız?

  15. Muhittin Özer

    @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.

  16. ali

    ö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

  17. Halil Kaya

    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?

  18. Muhittin Özer

    @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.

  19. erdem

    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.

  20. Muhittin Özer

    @erdem:
    $mail->FromName = “PHP Mailer”;
    satırına görünmesini istediğin ismi yazabilirsin ;)

  21. ahmet

    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

  22. Fatih

    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.

  23. kumsal

    Gönder dediğim zaman, posta kutusuna boş içerik düşüyor bu nasıl çözülür?

  24. serdar

    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.

  25. Aytac GUL

    Script guzel fakat her zaman mail gonderisi yapmiyor. Bazen hata veriyor bazen gonderiyor. Bunun sebebi ne olabilir.

  26. Cihan

    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.

  27. Selcuk

    Paylaşımın için çok teşekkür ederim, çok fazla sitede aradım tek bu işe yaradı.

  28. Deniz Yeşilırmak

    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.

  29. Serhat

    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

  30. Muhittin Özer

    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/

  31. erdal

    Hocam merhabalar..

    SMTP Error: Could not connect to SMTP host. Mail gönderimi başarısız

    hatası alıyorum yardımcı olabilirmisiniz

  32. Muhittin Özer

    @erdal: SMTP bilgilerini tekrar kontrol edin, SMTP sunucusuna bağlanamıyor.

  33. erdal

    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

  34. curucafa

    Ç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

  35. soulpoint

    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

  36. Muhittin Özer

    @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.

  37. duck

    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?

  38. Muhittin Özer

    @duck: Dosyanın zip’li halini aşağıdaki linkten indirebilirsin.

    http://www.muhittinozer.com/dosyalar/smtp-mail.zip

  39. heyoo

    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.

  40. heyoo

    body alanının içine formdan gelen veriyi post etmek istiyorum. sorunla karışılaşıyorum. örnek verirmisin nasıl olacak

  41. Yusuf

    Mail gönderimi başarısız mesajı alıyorum bende. sıkıntı ne olabilir, ugrastim baya ama bulamadim sorunu.

  42. abdul

    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ı…

  43. mesut

    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.

  44. Kpss Rehber

    Arkadaşlar Class dosyalarını inderemiyorum.. Elinde olan varmı?

  45. şenol

    Muhittin bey acaba smtp sisteminde dosy göndermek nasıl olucak

  46. yusuf karsuyu

    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

Bir Cevap Yazın

E-posta adresiniz yayınlanmayacaktır. Lütfen adınızı, e-posta adresinizi ve yorumunuzu girin.

*

Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">