adsense

2 Mart 2019 Cumartesi

PHP ile Mail Gönderimi (SMTP) (Güncellendi)

PHP ile mail göndermenin birden çok tekniği olmasına rağmen en sık tercih edilen şekli "phpmailer" ile hazırlanandır. phpmailer açık kaynak lisansına sahiptir, rahatça kullanabilirsiniz.

Neler lazım?
Öncelikle Şu* adrese girip phpmailer 'in son versiyonunu indirin. Bu yazıyı yazdığım tarihteki son versiyonu 5.2.1 olarak görünüyor.
İndirdiğiniz dosya* paketinin içinde bir sürü kıvır zıvır mevcut. Size lazım olacak dosyaları resimde işaretledim.

* Burada verdiğim dosya kaynaklarının bir bölümü kaldırılmış bir bölümü de "güncelleme" adı altında daha karışık hale getirilmiş. Örnekte kullanılan dosyaları şuradan indirerek mail gönderimi işlemini rahatça yapabilirsiniz. Bugün (Mart 2019) hala bu yapıyı kullanmaktayım ve gayet güzel çalışmaktadır.







Bu dosyaları (class.phpmailer.php, class.smtp.php) iletişim formunuzun olduğu sayfanın (örneğin:iletisim.php) bulunduğu dizine kopyalayın.
Yani şöyle olacak;
Şimdi yapılması gereken iletisim.php dosyasını hazırlamak;

Tablosuyla, renkleriyle daha cancanlı halini zevkinize göre hazırlarsınız. Ben hızlıca bir iletişim formu tasarlıyorum.
Form kısmının kodu şu şekilde;
<form method="post">
<p>Ad Soyad<br /><input type="text" name="isim" /></p>
<p style="margin-top:20px;">E-Posta<br /><input type="text" name="eposta" /></p>
<p style="margin-top:20px;">Telefon<br /><input type="text" name="telefon" /></p>
<p style="margin-top:20px;">Mesajınız<br /><textarea rows="3" cols="50" name="mesaj"></textarea></p>
<p style="margin-top:20px;"><input type="submit" name="submit" value="Yolla Gitsin" /></p>
</form>
Görüntüsü şu şekilde;

Sayfamıza önce bir Mail Gönderme fonksiyonu yazıyoruz;
<?php
function mailgonder($kimden,$kime,$konu,$mesaj){
         require "class.phpmailer.php"; // PHPMailer dosyamızı çağırıyoruz 
         $mail = new PHPMailer();  
         $mail->IsSMTP();
         $mail->From     = $kimden; //Gönderen kısmında yer alacak e-mail adresi 
         $mail->Sender   = $kimden; 
         $mail->FromName = "SERHAT EYİŞEKERCİLER"; 
         $mail->Host     = "mail.sunucuadi.com"; //SMTP server adresi 
         $mail->SMTPAuth = true; 
         $mail->Username = "isim@mail.com"; //SMTP kullanıcı adı 
         $mail->Password = "Parolanız"; //SMTP şifre 
         $mail->Port = "587";
         $mail->CharSet = "utf-8";
         $mail->WordWrap = 50; 
         $mail->IsHTML(true); //Mailin HTML formatında hazırlanacağını bildiriyoruz. 
         $mail->Subject  = $konu; // Konu 
         //Mailimizin gövdesi: (HTML ile) 
         $body = $mesaj;
         // HTML okuyamayan mail okuyucularda görünecek düz metin: 
         $textBody = strip_tags($mesaj);
         $mail->Body = $body; 
         $mail->AltBody = $textBody; 
         $mail->AddAddress($kime); // Mail gönderilecek adresleri ekliyoruz. 
         //$mail->AddAddress("falan@filan.com");  //Başka mail ekleyecekseniz.
         return ($mail->Send())?true:false;     
         $mail->ClearAddresses(); 
         $mail->ClearAttachments();
}
?>
Sonra form gönderilirken gerekli kontrollerin yapılacağı kısmı hazırlıyoruz;
<?php
$hmesaji="";
if(isset($_POST["submit"])){
    $ad = (isset($_POST["isim"]))?$_POST["isim"]:"";
    $eposta = (isset($_POST["eposta"]))?$_POST["eposta"]:"";
    $telefon = (isset($_POST["telefon"]))?$_POST["telefon"]:"";
    $mesaj = (isset($_POST["mesaj"]))?$_POST["mesaj"]:"";
    if($ad == "" || $eposta == "" || $telefon == "" || $mesaj == "")
        $hmesaji = "Hata!";
    else
    {
        $mesajk = "<b>$ad</b> adıyla websiteniz üzerinden yeni bir mesaj bırakıldı.<hr />";
        $mesajk .= "Telefon: $telefon <br />";
        $mesajk .= "Eposta Adresi: $eposta <br />";
        $mesajk .= "Ziyaretçinin Mesajı: $mesaj <hr />";
        $mesajk .= "<span style='font-size:10px;color:#bbbbbb;'>Bu mesaj ". date('H:i:s d.m.Y') ." tarihinde gönderildi. | ARENAYAZILIM |</span>";

        if(mailgonder("kimden@mail.com","kime@mail.com","Ziyaretci Mesaji",$mesajk))
        {
            $hmesaji =  "Mail başarıyla Gönderildi.";
        }
        else
        {
            $hmesaji =  "Gönderilemedi.";
        }
    }
}
echo "<p>$hmesaji</p>";
?>
Anlayacağınız üzere kırmızı ile yazılmış alanları kendinize göre değiştirmeniz gerekiyor. Herşey yolundaysa mailiniz gider ve görüntü aşağıdaki gibi olur;


Bu iletişim formunun eksiği güvenlik anahtarı istemeden çalışmasıdır. Projenin dosyalarını şuradan indirebilirsiniz. Yorum alanını soru sormak için kullanabilirsiniz.
Saygılar.

20 yorum:

Adsız dedi ki...

paylaşımınız için teşekkür ederim, sorunumu sizin hazırladığınız örnek ile çözdüm.

Adsız dedi ki...

dostum allah razı olsun muhtesem anlatmıssın.ancak benım kafamda hala oturmadı bu olay :(şimdi burda sen lazım olan dosyaları gostermıssınve class.phpmailer.php dosyasını çağırmıssın.ama senın verdıgın ındırme lınkınde yanı https://github.com/Synchro/PHPMailer bu adreste ki örnekte ise adam PHPMailerAutoload.php dosyasını çağırmıs.bu fark neden kaynakla nıyor.birde bu senın yukardakı resımde lazım olan dosyalar bunlar dıye ıkı dosya gostermıssın.bu dosyaların işlevi nedir?Bir zahmet anlatıverde kafamda otursun şu olay.

Serhat Eyişekerciler dedi ki...

Merhaba, bu dosya (PHPMailerAutoload.php) daha önce yoktu. Şimdi içeriğine baktım ve anladığım kadarıyla mevcut classları senin yerine include ediyor. Yani projende sadece bu dosyayı eklemen yeterli. Altındaki class ları otomatik olarak ekleyecektir.

Bir de dil seçenekleri falan eklenmiş. Sayende incelemiş oldum. İlk müsait zamanımda bu yazıyı güncellemem lazım sanırım.

Mevcut yazıda anlattıklarımı ben hala kullanıyorum.
Anlatılan dosyalar şu adreste mevcut:
http://phpmailer.apache-extras.org.codespot.com/files/PHPMailer_5.2.1.tgz
Yani tercih edersen bu dosyaları bu anlatımla kullanabilirsin. Yenisini yazınca yine blogumda yayınlayacağım.

Değerli yorumun için teşekkürler.

osman dedi ki...

$mail->AddAddress($kime); // Mail gönderilecek adresleri ekliyoruz.
//$mail->AddAddress("falan@filan.com"); //Başka mail ekleyecekseniz.

Burada göndereceğimiz mail adresini gireceğiz ancak ben tüm mailleri veritabanında rezervasyon tablosunda email sütununda topluyorum.tüm emailleri spama düşmemesi için atıyorum 1 saat aralıklarla 500 adet 500 adet topluca göndermek için kodda nasıl bir düzenleme yapmalıyım.ayrıca

if(mailgonder("kimden@mail.com","kime@mail.com","Ziyaretci Mesaji",$mesajk))
{

buırada her gönderdiğim mailde tek tek ekleyecek miyim.burayıda topluca mail göndermek için nasıl düzenleyebilirim.kısacası bu verdiğin kodları ben belirli zaman aralıklarında belirleyeceğim limitler dahilinde topluca mail yollatacak şekilde nasıl düzenleyebilirim.yardımcı olursan minnettar kalırım.

Serhat Eyişekerciler dedi ki...

Belirli aralıklarla 500 şer adet mi göndereceksin?
Sanırım spam 'e düşecektir.

Soruna gelince evet, "$mail->AddAddress("falan@filan.com")" kısmını veritabanından çektiğin eposta adresleri içindeki döngüyle 500 kez çalıştırırsan kime bölümüne hepsini yerleştirir.
Aslında burada $mail->AddCC(") ve $mail->AddBCC("") seçeneklerini de kullanabilirsin. Böylece herkes herkesden haberdar olmamış olur.

10 yada 20 tamam ama 500 benim aklıma pek yatmadı. Deneyince bana da haber verirmisin.
Kolay gelsin.

osman dedi ki...

hergün 500 adet yollasam yine de spama düşer mi?amacım kendi müşterilerimize hizmetimizden memnun kaldınmız mı diye bir html maili yollamak.Ben veritabanından bahsettiğim tablonun sütununda yer alan mailleri oraya nasıl yerleştireceğim.kod bilgim zayıfta.

Serhat Eyişekerciler dedi ki...

Şimdi "hergün 500 adet"le "1 saatte 500 adet" arasında fark var. Hergün 500 adet gönderimde bir sıkıntı olmaz. Tabiki 500 adeti birden gönderirsen yine spam 'e düşersin. Ama dakikada 1 adet gönderirsen problem olmayacaktır.

Sunucuların kendi limitleri olduğu için bunu detaylı araştırmak lazım. Mesela hotmail, kullanıcılarına üyelik zamanının tarihine göre limitler koyuyor. İlk zamanlar günde 120 tane bir süre sonra 250 tane daha sonra da 350 tane gönderime izin veriyor sanırım. Rakamlar belki değişmiştir şimdi ama politikaları bu yönde. Yine google 'da günde 2000 adet 'e kadar izin veriyor. Senin sunucu günde kaç taneye kadar izin veriyor bunu öğrenmen lazım.

Gerçi kimisi de saatlik limit koyuyor. Mesela şimdi natroya baktım şöyle demiş:
"Her bir e-posta hesabı bir saat içinde 100 adetten fazla e-posta gönderemez." (http://www.natro.com/webHosting/)

Bu bilgileri öğrendikten sonra aslında kod bilmene de gerek yok. Bu işi yapan hazır yazılımlar mevcut. Belirlediğin zaman aralığında belirlediğin listeye mail gönderiyor. Google da "toplu mail programı" diye arama yapıp bakabilirsin.

İlla kendim bir program yapıcam diyorsan bu da mümkün ama kod bilgim zayıf demişsin. Ne kadar zayıf? Mesela cronJob hakkında hiç bilgin var mı?

osman dedi ki...

hazır scriptlere baktım ama entegre edemedim.bu sizin kodları tek tek mail yollatmayuı basarabildim.ama bu senin kodları hergün dakikada bir mail yollatacak şekilde toplu mail gönderebileceğim bir hale getiremezmiyiz.

osman dedi ki...

ben natro ile çalışıyorum oradaki hosta girdiğimde zamanlanmış görevler var.oradan gereken dosyayı secip günü seçip saati seçerek o saattte ve günde mail yollatmak herhalde bu cronjob.ayrca bu yukardaki koları toplu mail gönderebileceğim şekilde düzenleyebilir misin?inan cok işime yarayacak.program demişsin ama siteden göndermem gerekıyor.

Adsız dedi ki...

arkadaşlar iletişim kutusunda yazılanları mail adresime gelmesi için nerden ve nasıl yapmalıyım ??

Adsız dedi ki...

hocam kendi oluşturdugum html formda 15 e yakın veri giriş bolümü var ve bunu ne yaptıysam gönderemedim.bu konuda yardımcı olursanız sevinirim.şimdiden tşkler.

Adsız dedi ki...

outlook ile bağlantısını bir türlü yapamıyorum.
smtp.live.com diyorum ama gönderim sürekli başarısız oluyor. Ayarları nasıl yapmalıyım? :(

Serhat Eyişekerciler dedi ki...
Bu yorum yazar tarafından silindi.
Serhat Eyişekerciler dedi ki...

Şu fonksiyonu bir deneyin.
Hotmail mail gönderimi konusunda katı kurallara sahip. Göndermek için başka şeylerde yapmak gerekebilir.

function MailGonderGmailSMTP($kime,$konu,$mesaj)
{
require "class.phpmailer.php";
$mail=new PHPMailer();
$mail->IsSMTP();
$mail->SMTPDebug = 1;
$mail->SMTPAuth = true;
$mail->SMTPSecure = "ssl";
$mail->Host = "smtp.live.com";
$mail->Port = 465;
$mail->Username="kullaniciadi@hotmail.com";
$mail->Password="Parolaniz";
$mail->From="kullaniciadi@hotmail.com";
$mail->FromName="isim Soyisim";
$mail->CharSet="utf-8";
$mail->AddAddress($kime);
$mail->Subject=$konu;
$mail->IsHTML(true);
$mail->Body=$mesaj;
if($mail->Send()) return true;
else echo $mail->ErrorInfo;
}

Unknown dedi ki...

Hocam merhaba bir sorum olacaktı class.phpmailer.php dosyasının içindeki
- public $From = 'root@localhost';
- public $FromName = 'Root User';
-public $Host = 'localhost';

bu alanlara ne yazacağım yardım edebilirmisin?

Serhat Eyişekerciler dedi ki...

Merhaba Ömer,

Belirttiğin dosyada değişiklik yapmana gerek yok. Orası varsayılan değerlerin verildiği class dosyası. Kullanacağın fonksiyonun içerisinde:

$mail->From="kullaniciadi@mail.com";
$mail->FromName="isim Soyisim";

gibi alanları kendi bilgilerinle göre doldurman yeterlidir.

Adsız dedi ki...

5 2 1 olan kısmı çalışıyor arkadaşlar tavsiye edilir (en kolayı şuradan indirin kısmından indirin) iletisim php düzeltin diğerlerinde düzeltmenize gerek yok bu paylaşım için çok teşekkür ediyorum google bakmadığım yer kalmadı en iyi bu çalıştı sonuçta teşekkürler

gzr dedi ki...

http://mstsc.kriterbilgisayar.com/ bir sitem mevcut bu sitedeki girilen iletişim formundaki bilgilerin bana mail olarak gelmesini istiyorum ;

mail.php dosyasına aşağıdaki kodları girmeme rağmen mail düşmüyor nerde hata yapıyorum yardımcı olablir misiniz ?

";

if(mail($kime,$firma,$yetkili,$temsilci,$mesaj)
echo "Bilgiler basariyla gonderilmistir.";
else
echo "Malesef bilgiler gonderilemedi.";
}

?>

Kemal dedi ki...

Tam aradığım gibi. Sorunsuz çalışıyor telefonuma tanımlı kurumsal mail adresine mesaj gönderdim 1 dk. içinde geldi. Emeği geçenlere teşekkür ediyorum sorunsuz çalışan bir mesajlaşma sistemi.

Adsız dedi ki...

merhabalar önemli bir proje için mail kodu yazmam gerekiyordu burdan yazdım ancak sürekli gönderilemedi diyor kırmızı yerleri doldurduğumda kimden kısmı olsun istemiyorum onu dolduracak verim yok bana yardımcı olabilir misiniz?