PHPMailer Kullanımı ile SMTP Mail Gönderme (Gmail-Hotmail-Yandex-Özel)

PHPMailer Kullanımı ile SMTP Mail Gönderme (Gmail-Hotmail-Yandex-Özel)

PHPMailer, PHP ile mail gönderme amacıyla kullanılan en popüler açık kaynak kodlu PHP kütüphanelerinden birisi. İlk olarak 2001 yılında kullanıma sunuldu ve o zamandan beri PHP geliştiricileri tarafından mail gönderimi için sık sık kullanılmakta.

İlk olarak PHPMailer sınıfının normal PHP mail fonksiyonu kullanımı için neden alternatif olduğundan ve onun yerine kullanıldığından, avantajlarından bahsedelim;

  • İlk olarak PHP mail fonksiyonu kullanımı için dahili olarak bir mail sunucusuna ihtiyaç duyulurken, PHPMailer ile bu zorunluluk ortadan kalkıyor. Gmail, yandex, hotmail gibi mail sunucularında veya sitenize ait mail hesabınızın olması mail gönderebilmeniz için yeterli.
  • PHPMailer ile doğrulanmış bir eposta hesabıyla gönderilen e-postalara kıyasla normal mail fonksiyonu ile gönderilen maillerin spama düşme ihtimali daha fazladır.
  • Normal mail fonksiyonu web hosting hizmeti alınan şirketler tarafından genellikle kullanıma kapalıdır. Bunun sebebi, doğrulama olmaksızın mail gönderimi sağlayan normal mail fonksiyonu ile gönderilen mailler spama düşer ve fazla kullanımı neticesinde web sitenin barındığı sunucunun IP adresi karalisteye alınır.
  • PHPMailer sınıfı ile mail gönderimi yapılamadığı durumlarda, desteklediği 50′dan fazla dil üzerinden hata mesajları yayınlanabilir.
  • SSL ve TLS ile yetkilendirilmiş SMTP protokolü desteği ve kimlik doğrulaması
  • Sürekli güncellenen ve geliştirilen açık kaynak kodlu bir kütüphane olması.
  • WordPress başta olmak üzere akla gelebilecek PHP tabanlı birçok içerik yönetim sistemleri tarafından kullanılabiliyor olması.
  • Nesne Yönelimli Proğramlama (Object Oriented Programming) tabanlı çalışmakta.
  • Gönderilen mailleri şifreleyerek güvenli gönderim yapmak.
  • TLS ve SSL prokotol desteği.
  • Ek dosya gönderebilmek.

PHPMailer sınıfı ile Gmail veya Yandex Mail gibi mail sunucularını kullanabileceğiniz gibi, kendi sitenize ait web sunucunuzdaki mail hesabını da PHP ile mail gönderme amacıyla kullanabilirsiniz. Bu yazıda ayrıntılı olarak nasıl yapılabileceğini göreceksiniz.

Normal normal mail fonksiyonu kullanımına kıyasla ne gibi avantajları olduğunu yeterince gördük. Şimdi PHPMailer kullanımı konusuna giriş yapalım.

PHPMailer Kurulumu ve Kullanımı

PHPMailer kullanımı için SMTP destekli bir mail sunucusuna kayıtlı mail hesabı gerekiyor. Bu mail sunucusu gmail, hotmail, yandex gibi çok bilinen mail sunucusu olabileceği gibi sitenizin kendine ait mail sunucusu da olabilir.

Başlangıçta en bilinen mail sunucularına ait SMTP ayarları nelerdir görelim. Bu ayarlar doğrultusunda PHPMailer sınıfını kurabilir ve mail gönderebiliriz.

Gmail SMTP Mail Gönderme için Gerekli Gmail SMTP Ayarları 2020

Gmail SMTP mail gönderme işlemi için gerekli olan gmail smtp ayarları aşağıda bulunmakta. PHP gmail mail gönderme işlemi sırasında bilgileri sorunsuz girdiğiniz halde proğram içerisinde ′Username and Password not accepted′ şeklinde bir hata ortaya çıkarsa, bu muhtemelen hesabınızın güvenlik ayarlarıyla ilgilidir.

İlk olarak buradaki sayfaya girin ve açılan sayfada google hesabınızın ′Daha az güvenli uygulamalara izin ver′ seçeneğini aktif hale getirin. Sorun hala devam ediyorsa bu sayfadan da onay almanız gerekebilir. Bu konuda bu sayfadan daha detaylı bilgi alabilirsiniz.

Ayrıca PHP gmail mail gönderme işlemi esnasında PHPMailer sınıfında ″SMTPSecure″ özelliğini ′tls′ olarak seçerseniz ″Port″ özelliğine ′587′, ′ssl′ olarak seçerseniz ′465′ olarak belirtmeniz gerekir.

  • SMTP Sunucusu: smtp.gmail.com
  • SMTP Port: 587/465
  • SMTP Veri Gizliliği: tls/ssl

Yandex SMTP Mail Gönderme için Gerekli Yandex SMTP Ayarları 2020

Yandex SMTP mail gönderme işlemi için gerekli olan yandex smtp ayarları aşağıdaki gibidir. PHP yandex mail gönderme işlemi için bu bilgileri kullanacağız. Burada dikkat edilmesi gereken nokta, gmail SMTP ayarları içerisinde yapılan durumda olduğu gibi PHP yandex mail gönderme işlemi sırasında PHPMailer sınıfında ″SMTPSecure″ özelliğini ′tls′ olarak seçilmesi halinde ″Port″ özelliğine ′587′, ′ssl′ olarak seçilirse de ′465′ olarak belirtmeniz gerektiğidir.

  • SMTP Sunucusu: smtp.yandex.com
  • SMTP Port: 587/465
  • SMTP Veri Gizliliği: tls/ssl

Hotmail SMTP Ayarları 2020

  • SMTP Sunucusu: smtp.live.com
  • SMTP Port: 587
  • SMTP Veri Gizliliği: tls

Kendinize Ait SMTP Destekli Sunucu

Normalde hosting ve domain hizmeti alsanız bile hosting şirketinin size vereceği bir e-posta hizmeti bulunur. Web sunucunuzun ayarlar kısmında bu yapılandırma ayarlarına dair mail sunucu bilginiz, e-posta alımı için gerekli bağlantılar olan IMAP, POP3 portları ve SMTP portları belirtilir. Bu bilgileri kullanarak kendi sitenize ait mail adresinizi SMTP mail gönderimi için kullanabilirsiniz.

Başlıca web sunucularına ait SMTP yapılandırma ayarlarının neler olduğunu gördük. Kod tarafında bu bilgilerin nasıl tanımlanacağını görelim.

PHPMailer Kurulumu

PHPMailer kurulumu için gerekli dosyaları güncel haliyle github üzerinden indirebilirsiniz. Ayrıca açıklama satırlarında gerekli açıklamaları mevcut şekilde PHPMailer çalışır örneğini de yazının en altından indirebilirsiniz.

İndirilen dosyaların ne işe yaradığından ve gereklilik durumlarından bahsedelim;

  • İndirilen dosyada ′src′ klasörünün içerisindeki ′PHPMailer.php′ dosyası mail gönderimi için şart. Projeye bu dosyanın dahil edilmesi gerekiyor.
  • Aynı şekilde ′SMTP.php′ dosyası da mail gönderimi için şart.
  • ′Exception.php′ dosyası, mail gönderimi sırasında oluşabilecek hataların sebebini görmek için gereklidir. Mail gönderimi sırasında bir sorun çıkmadığı sürece bunu projenize dahil etmenize gerek yok. Ancak hata varsa ve fatal error vermesi halinde proğram tamamen duracağı için bunu da projenize ekleyin.
  • İndirilen dosyada aynı zamanda ′language′ klasörü bulunmakta. Bu klasörde bulunan dosyalar ile hata mesajlarının hangi dilde görüntülenmesi gerektiğini seçebilirsiniz. Projeye ′Exception.php′ dosyasını eklemiyorsanız projede bu klasörü tanımlamanıza gerek yok.
  • Diğer dosyalar isteğe bağlıdır. Bu yüzden PHP ile mail gönderme amacıyla bu dosyaları projeye dahil etmeniz şart değil.

Aşağıdaki şekilde bu dosyaları projeye dahil edebilir, PHPMailer sınıfını kullanıma hazır hale getirebilirsiniz.

require 'src/Exception.php';
require 'src/PHPMailer.php';
require 'src/SMTP.php';

use PHPMailerPHPMailerPHPMailer;
//use PHPMailerPHPMailerException;

PHPMailer kurulumu ve projeye eklemeyi tamamladık. Sırada PHPMailer kullanımı konusuna bakalım. İlk olarak PHPMailer sınıfını kuruyoruz.

$mail = new PHPMailer();

Yukarıda bahsedildiği üzere Mail Sunucularının SMTP yapılandırma ayarlarının neler olduğunu görmüştük. Kod tarafında bu bilgilerin nasıl tanımlanacağını görelim.

$mail->Host = 'mail.ornekmailsunucusu.com'; 
$mail->Username = '[email protected]'; 
$mail->Password = 'gonderen_mail_hesabi_sifresi';
$mail->Port = 587; 
$mail->SMTPSecure = 'tls'; 

İlgili alanları maili gönderen size ait sunucu ve bu sunucuya ait hesap bilgileri ile değiştirmelisiniz. Ardından SMTP ile mail gönderimi yapılacağını ve hesap doğrulama işleminin bulunduğunu belirtiyoruz.

$mail->isSMTP(); 
$mail->SMTPAuth = true;

Gönderilen mail mesajınızda HTML etiketleri var ise bunun düz bir yazı olarak gönderilmesini haliyle istemeyiz. HTML etiketlerinin algılanmasını istiyorsak bunu aşağıdaki gibi aktifleştirmemiz gerekir.

$mail->isHTML(true);

Ayrıca SMTP mail gönderimi sırasında mail başlığı, konusu ve içeriğinde türkçe karakter sorunu oluşabilmekte. Bunu engelleyebilmek için ′CharSet′ özelliğini kullanmalıyız.

$mail->CharSet = "UTF-8";

Mesaj gönderimi sırasında oluşabilecek hatalarda türkçe hata mesajları görebilmek için ′setLanguage′ fonksiyonunu, mail gönderimi sürecini daha ayrıntılı görebilmek ve hataları daha net tespit edebilmek için ′SMTPDebug′ özelliğini kullanabiliriz.

$mail->setLanguage('tr', 'language/');
$mail->SMTPDebug  = 2;

Aşağıda ′SMTPDebug′ özelliğinin alabileceği değerleri görebiliriz;

  • 1 = Kullanıcı (client) tarafındaki süreci gösterir.
  • 2 = Hem client hem server (sunucu) tarafındaki süreci gösterir.
  • 3 = Client, server ve bağlantı sürecini gösterir.

Mail gönderimine dair ön tanımlamaları yaptık. Şimdi mail gönderimi ve içeriği kısmına girelim. Maili gönderen hesaba ait mail adresini belirtmek için ′setForm′ fonksiyonunu kullanıyoruz. İlk parametresi mail adresi, ikinci parametresi ise gönderenin isminin belirtildiği kısım. İsim yazılmazsa gönderilecek mailde gönderen kişi olarak mail adresi gösterilir.

Bu mail adresi aynı zamanda ′Username′ özelliğine girilen mail adresi ile aynı olmalı.

$mail->setFrom('[email protected]', 'Muhammed Yaman');

Gönderilmiş olan maili alan kullanıcı maili yanıtlamak isterse bu maile değil de başka maile yanıt verilmesi isteniyorsa ′addReplyTo′ fonksiyonu kullanılmalı. Bu fonksiyonu birden fazla sayıda kullanabiliriz.

$mail->addReplyTo('[email protected]', 'Muhammed Yaman');

Maili alacak kişinin mail adresini ′addAddress′ fonksiyonda belirtiyoruz. Maili birden fazla kişiye göndermek istiyorsak farklı mail adresleri içerecek şekilde bu fonksiyonu birden fazla çoğaltarak kullanabiliriz.

$mail->addAddress('[email protected]', 'Yaman Muhammed');
$mail->addAddress('[email protected]', 'Yaman Mert');

Böylelikle toplu mail atma işlemini de yapmış olursunuz. Sözü gelmişken PHP toplu mail gönderme konusunda da kısa bir dipnot geçmek istiyorum.

Yukarıdaki gibi ′addAddress′ fonksiyonunu çoğaltarak toplu mail gönderimi yapılabilir. Tüm kodları bir araya getirerek tek bir fonksiyonda toparlayıp, bu fonksiyonu döngü ile tekrar tekrar çağırarak toplu mail gönderimi de yapılabilir. Ancak bu konuda dikkat edilmesi gereken bazı durumlar var.

Dikkat edilmesi gereken bir konu var. Her mail atılırken bir süre beklenilmesi gerekir. Çünkü seri bir şekilde mail atma işlemi şüpheli bir durumdur ve spam kutusuna düşme olasılığını artar. Daha fazla suistimal edilmesi durumunda mail adresi veya mailin atıldığı sunucu karalisteye alınabilir. Bunun için belli aralıklarla mail gönderimi yapılması daha sağlıklı sonuçlar verecektir. Ayrıca mail konu başlığı ve içerikleri aynı değil farklı olması gerekir. Örnek verirsek, Üye adı=necdet sizin için uygun olan makaleler, Üye adı= fikret beğenebileceğiniz a kategorili haftalık haberler vb. Abonelik maili gibi algılanıp işlerin normal gitmesine yardım eder.

Spama düşmeden PHP toplu mail gönderme işlemi başlı başına ayrı bir konu ve karışık. Bildiğim kadarıyla anlattım. Bu konuda daha fazla bilgisi olanlar yorumda paylaşabilirler. Ayrıca toplu mail gönderme programı ve siteler kullanılabilir. Böylelikle daha kolay, ölçeklendirilebilir ve sistemli bir şekilde toplu mail gönderme işlemi gerçekleştirilebilir.

Daha fazla arayı açmadan konumuza devam edelim.

Gönderilen mailin kim tarafından kime gittiğini ve nasıl bir mailin gittiğini bilmek isteyenler olabilir. Bu nedenle gönderilen mailden haberden olunması gereken mail adresleri ′addCC′ fonksiyonunda tanımlanabilir.

Böylece mail bu adreslere de gönderilecek ancak bilgi alan email hesapları olarak mail içerisinde belirtilerek gönderilecek. Yani maili gönderen, maili alan ve mailden haberi olan kişiler birbirlerinden haberdar olacaklar ancak gönderici, alıcı, bilgi alan kişiler olarak farklı nitelemeler ile mailde belirtilecekler.

Birden fazla mail adresi için kullanılabilir.

$mail->addCC('[email protected]', 'Mert');

Gönderilecek mailden haberdar olacak ancak mail içerisinde adresi gözükmeyecek mail adreslerini tanımlamak için ′addBCC′ fonksiyonu kullanılabilir. Yine bu özellik de birden fazla mail hesabı belirtmek için kullanılabilir.

$mail->addBCC('[email protected]', 'Ömer');

Mailin konusunu ′Subject′ özelliğine, mailin içeriğini ise ′Body′ özelliğine yazabiliriz.

$mail->Subject = 'Örnek mail konusu';
$mail->Body =
'

Test edilen mail mesaj içerikteki başlik yeni

 

Bu bir test mail icerigi.

 


	
';

Mail içerisinde ek dosya gönderimi yapmak istersek ′addAttachment′ fonksiyonunu kullanmalıyız. Gönderilecek olan dosya aynı sunucu üzerinde olması gerekir. Bu dosyalar maile yüklenir ve alıcıya gönderilir. İlk parametre dosya yolu, ikinci parametre ise istenilen bir dosya ismi. İkinci parametreyi kullanmazsanız dosyanın asıl ismi tanımlanır.

$mail->addAttachment('files/Dusk_on_the_Yangtze_River.jpg', 'resim_ismi.jpg'); 
$mail->addAttachment('files/dosya.rar', 'dosya_ismi.rar');

Artık maili gönderebiliriz. Maili göndermek için ′send′ fonksiyonunu kullanıyoruz.

$mail->send();

Mail gönderiminin başarılı olması halinde fonksiyondan geriye ′1′ değeri döner. Başarılı olmazsa herhangi bir değer dönmez. Fonksiyondan geriye dönen bu değeri bir değişkene atabilir, gerekli kontroller yapılabilir. Mail gönderimi sırasında bir hata meydana gelirse bu hatayı yazdırmak için ′ErrorInfo′ özelliği kullanılabilir.

echo $mail->ErrorInfo

Genel itibarıyla PHPMailer kurulumu ve kullanımı ile SMTP mail gönderme işlemi bu şekilde yapılabilir.

PHPMailer Kullanımı

Yukarıdaki kodları birleştirerek SMTP ile mail göndermek için gerekli örnek kodları aşağıda bir bütün halinde açıklama satırlarıyla birlikte görebilirsiniz.

require 'src/Exception.php'; //Mail gönderirken bir hata ortaya çıkarsa hata mesajlarını görebilmek için gerekli. Şart değil
require 'src/PHPMailer.php'; //Mail göndermek için gerekli.
require 'src/SMTP.php'; //SMTP ile mail göndermek için gerekli.

use PHPMailerPHPMailerPHPMailer; //Kullanılacak sınıfın (PHPMailer) yolu belirtiliyor ve projeye dahil ediliyor
//use PHPMailerPHPMailerException;

$mail = new PHPMailer(); //PHPMailer sınıfı kuruluyor

$mail->Host = 'mail.ornekmailsunucusu.com'; //SMPT mail sunucusu. Ornek: smtp.yandex.com (YANDEX MAIL), smtp.gmail.com (GOOGLE/GMAIL), smtp.live.com (HOTMAIL), mail.ornekmailsunucusu.com (SITENIZE OZEL MAIL SUNUCU)
$mail->Username = '[email protected]'; //Tanımlanan web sunucusuna ait mail hesabı kullanıcı adı. Ornek: [email protected], [email protected]
$mail->Password = 'gonderen_mail_hesabi_sifresi'; //Mail hesabı şifre
$mail->Port = 587; //Mail sunucu mail gönderme portu. Ornek: 587, 465
$mail->SMTPSecure = 'tls'; //Veri gizliliği yöntemi. Örnek: tls, ssl

$mail->isSMTP(); //SMPT kullanarak mail gönderilecek
$mail->SMTPAuth = true; //SMPT kimlik doğrulanmasını etkinleştir

$mail->isHTML(true); //Mail içeriğinde HTML etiketlerinin algılanmasına izin vermek. False olarak seçilirse ve mail içeriğinde HTML içerikleri varsa etiketler algılanmaksızın normal düz yazı olarak içerikte belirecek

$mail->CharSet = "UTF-8"; //Mail başlık, konu ve içerikte türkçe karakter desteği mevcut
$mail->setLanguage('tr', 'language/'); //hata mesajlarını tr dili ile yazdır. 'language' isimli klasörden dil ayarları çekilir. Varsayılan olarak ingilizce seçilidir
$mail->SMTPDebug  = 2; //işlem sürecini göster. Hataları belirlemenizi kolaylaştırır

$mail->setFrom('[email protected]', 'Muhammed Yaman'); //Tanımlanan web sunucusuna ait bir gönderen mail adresi ve isim. Username kısmında belirtilen mail adresi ile aynı olmalı. Ornek: [email protected], [email protected]
//$mail->addReplyTo('[email protected]', 'Muhammed Yaman'); //Mailin gönderildiği kişi maili yanıtlamak isterse buradaki mail adresine mail gönderilmesi gerektiği belirtilir
$mail->addAddress('[email protected]', 'Yaman Muhammed'); //Gönderilecek mail adresi ve isim. İsim yazılmazsa gönderilen kişi kısmında gönderilen kişinin mail adresi yazar. Ornek: [email protected]
//$mail->addCC('[email protected]', 'Mert'); //Gönderilecek mail bu adrese de gidecek. Aynı zamanda bu adrese gittiği de mail mesajında belirtilecek.
//$mail->addBCC('[email protected]', 'Ömer'); //Gönderilecek mail bu adrese de gidecek. Ancak bu adrese gittiği mail mesajında belirmeyecek.

$mail->Subject = 'Örnek mail konusu'; //Mail konusu
$mail->Body = //Mail mesaj içeriği
'

Test edilen mail mesaj içerikteki başlik yeni

 

Bu bir test mail icerigi.

 


	
';
$mail->addAttachment('files/Dusk_on_the_Yangtze_River.jpg', 'resim_ismi.jpg'); //Mail içerisinde ek dosya gönderimi sağlar. Bu kodların çalıştığı klasör içerisindeki files dosyasındaki Dusk_on_the_Yangtze_River.jpg isimli dosyayı seç. Mail içerisinde bu dosyanın ismi 'resim_ismi.jpg' şeklinde gözüksün. İsim girilmezse dosyanın asıl ismi gözükecek
$mail->addAttachment('files/dosya.rar', 'dosya_ismi.rar');

$mail_gonder = $mail->send(); //Maili gönder ve sonucu değişkene aktar
if($mail_gonder){ //Mail gönderildi mi
	echo 'Mail başarıyla gönderildi';
}else{
	echo 'Mail gönderilemedi. Mail hata mesajı: '.$mail->ErrorInfo; //Mail gönderilemezse sebebini belirten hata mesajını ekrana yazdır
}

Bu sayfada anlatılan konuya dair örnek dosyayı PHPMailerKullanımı adlı dosyayı indirerek ulaşabilirsiniz.

Yorum Yap
0 Yorum yapan