lostyazilim
tr.link

PHPMailer ile mail göndermek

7 Mesajlar 3.862 Okunma
acebozum
tr.link

Abdullahx Abdullahx MW Aracı Kullanıcı
  • Üyelik 03.04.2019
  • Yaş/Cinsiyet 29 / E
  • Meslek .
  • Konum Trabzon
  • Ad Soyad A** K**
  • Mesajlar 905
  • Beğeniler 393 / 395
  • Ticaret 3, (%100)
Selamlar değerli WM Aracı forumu üyeleri ve bu yazımı okuyan diğer internet gezginleri;

Foruma kayıt olmamdan bu yana çok da fazla süre geçmemiş olmasına rağmen "PHP ile mail gönderme hataları" ile ilgili hatrı sayılır miktarda gönderi paylaşıldığında şahit oldum. Bu konuda internette birçok makale ve paylaşım mevcut, amacım tekerleği yeni baştan icat etmek değil. Ama bu kadar paylaşım olduğuna göre demek ki hâlâ bir yerlerde eksik yapılan paylaşımlar var. Hatta birçoğu bu sınıfın (PHPMailer) eski sürümleri hakkında olduğu için geçerliliğini kaybetmiş durumda.
Ben de naçizane minimal bir seviyede bu sınıfın nasıl kullanılacağını örneklerle açıklamaya çalışacağım.

Öncelikle bu bağlantıya tıklayarak PHPMailer sınıfını bilgisayarımıza indirelim. Eğer ileride bir gün bağlantı geçersiz kalmış olursa sınıfın adresi burada.



Daha sonra örneklerimde kullanacak olduğum kütüphaneleri belirteyim;

1. Basit bir ekran görüntüsünden kurtulmak için minium seviyede kullanılacak olan Bootstrap 4.4.1 kütüphanesi
2. Görselliği ve etkileşimi artıracak olan sweetalert2 9.7.1 kütüphanesi
3. Yine minimal seviyede görsellik sağlayacak font-awesome 4.7.0 kütüphanesi
4. Ve son olarak nerdeyse artık her projenin olmazsa olmazı JQuery kütüphanesi

Öncelikle html sayfamızı oluşturup kütüphanelerimizi dahil edelim. Örnekte jquery ajax metodundan yararlanıp sayfa yenilenmeden basit bir iletişim formundan mail göndereceğiz.









<script></script>

<script></script>
PHPMailer ile mail gönderme




Sayfamıza gerekli kütüphaneleri de dahil ettikten sonra iletişim formunu da ekleyelim.




























































Ben biraz düzen takıntılı olduğum için kodlardaki ekstra bootstrap elemanlarına takılmaya fazla gerek yok :)
Formda önemli olan kısımlar input elemanlarının name değerleri.

Şimdi de javascript kısmına geçelim. Gördüğünüz gibi form elemanına bir action ve method tanımlamadım. Post gönderme işlemlerinin Javascript ile yani JQuery ajax ile yapacağız.

<script>
$(document).ready(function () {

$("#iletisim_formu").on("submit",function (e) { // id değeri ietisim_formu olan formun submit olayı gerçekleştiğinde
e.preventDefault(); //Gönder e basıldığında sayfanın yenilenmnesini önlüyoruz
$("#submit").hide(); //Göndere basıldığı anda bu butonu gizliyoruz
$("#loading").show(); //Göndere basıldığı anda gönder butonunun yerine lütfen bekleyin yazılı olan butonu açıyoruz. Font-awesome kütüphanesini de bu butonun içinde kullandık.
$.ajax({ //Ajax işlemimizi başlatıyoruz
url:'mail/send-mail.php', //Post edilecek php dosyası, indirdiğimiz PHPMailer sınıfının ana klasöründe bir send-mail.php adında dosya oluşturacağız
method:'POST', // Yöntem POST veya get
data: $("#iletisim_formu").serialize(), // id değeri iletisim_formu olan formun içeriğindeki bütün bilgileri alıyoruz
success: function (result) { // Gelen cevap
if(result=="Gönderildi") { //Eğer gelen cevap gönderildi ise (veya send-mail dosyasında mail gönderildiği zaman yazacak mesajı kendimiz de değiştirebiliriz)
Swal.fire({ //Sweetalert2 uyarı ekranını açıyoruz ve gönderimin başarılı olduğuna dair bildirimi ekrana yazıyoruz
title:'Başarılı',
icon:'success',
text:'Mesajınız başarıyla gönderildi!',
showConfirmButton: false,
timer: 2000
})
$("#submit").show(); // Gönder butonunu tekrar gösteriyoruz
$("#submit").prop("disabled",1); //Gönder butonunu pasif hale getiriyoruz
$("#loading").hide(); //Lütfen bekleyin butonunu gizliyoruz
} else { //Eğer gelen cevap gönderildi değilse demek ki hata mesajı gelmiştir
Swal.fire({ //Gelen hata mesajını yine sweetalert2 ile ekrana yazıyoruz.
title: 'Gönderilemedi!',
html: 'Ters giden bir şeylar var.
Hata mesajı: ' + result,
icon: 'error'
});
$("#submit").show(); // Gönder butonunu tekrar gösteriyoruz
$("#submit").val("Tekrar deneyin"); // Gönder butonunun yazısını tekrar deneyin diye değiştiriyoruz
$("#loading").hide(); //Lütfen bekleyin butonunu gizliyoruz
}
}
})
})
})

</script>




Üstte yazan kodların hepsini sırasıyla kopyalayıp iletisim.php şeklinde kaydedin.

Şimdi de asıl meseleye, PHPMailer ile mail gönderme kısmına gelelim;

İndirdiğimiz PHPMailer sınıfının olduğu klasörün adını üstteki kodlarda mail olarak belirleyip ona göre işlem yaptım, siz de o şekilde yazarsanız olası hatalardan kurtulmuş olursunuz.
Yine bu klasör içine send-mail.php adında bir dosya oluşturalım. Bu dosyaya iletisim.php dosyasından ajax ile post gönderdik. Bu dosyada da normal post yakalar gibi işlem yapacağız ve ekranımız yenilenmeden arka planda mail gönderme işlemi gerçekleşecek.

- send-mail.php içeriği


// Import PHPMailer classes into the global namespace
// These must be at the top of your script, not inside a function
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'src/Exception.php';
require 'src/PHPMailer.php';
require 'src/SMTP.php';
if($_POST) { // Eğer gelen bir post var ise
// Instantiation and passing `true` enables exceptions
$mail = new PHPMailer(true);

try {
//Server settings
// $mail->SMTPDebug = SMTP::DEBUG_SERVER; //Hata ayıklama seçenekleri
$mail->isSMTP();
$mail->CharSet = 'UTF-8'; //Krakter seti seçimi
$mail->Host = "xxx.xxx.xxx"; // Mail host seçimi, hangi servis üzerinden mail gönderecekseniz ona göre host seçimi yapmalısınız. Aşağıda bununla ilgili bilgi verilecektir
$mail->SMTPAuth = true;
$mail->Username = "xxx@xxx.com"; //Kullanacağımız mail servisinde kullanıcı adımız, yani e posta adresimiz
$mail->Password = "xxxxxx"; //E posta şifremiz
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587; //Mail servisinin kullandığı port numarası. Genellikle 587 ve 465 kullanılır

//Recipients
$mail->setFrom($mail->Username, $_POST['ad_soyad']); //Gönderen e posta kendi bilgilerimiz girdiğimiz e posta olsun. Gönderen ad soyad da posttan aldığımız ad soyad olsun
$mail->addAddress("abdullahkaya544@gmail.com", "Abdullah Kaya"); // alıcı posta da bizim başka bir e posta adresimiz olsun, üstte bilgilerini girdiğimiz posta olmasın. İkinci kısma da ad soyad da yazılabilir tercihe göre
/* $mail->addAddress('ikinci e posta adresi',"ikinci kişi adı"); //İsteğe bağlı olarak ikinci ve daha fazla kişiye aynı mail i göndermek istiyorsak buraya sırasıla mail adresini ve ad-soyad bilgilerini yazabiliriz. Hatta belki posttan aldığımız birden fazla e posta adresine döngü ile çoğaltıp da yollayabiliriz.
$mail->addReplyTo('info@example.com', 'Information');
$mail->addCC('cc@example.com');
$mail->addBCC('bcc@example.com'); */

// Content
$mail->isHTML(true); // Mail yollarken html tag ve özelliklerinden yararlanacağımızı belirityoruz
$mail->Subject = $_POST['konu']; //Mail konusunu posttan gelen konu olarak seçiyoruz
$mail->Body = '
İletişim formundan yeni bir mailiniz var.
Maili yollayan kişinin;
Adı Soyadı: '.$_POST['ad_soyad'].'
E-posta adresi: '.$_POST['e_posta'].'
Mesajı : '.$_POST['mesaj'].'
'; //Mailin ana mesaj kısmını istediğimiz gibi şekillendirebiliriz.
$mail->setLanguage('tr', 'language/'); //Olası hatalara karşılık hata mesajlarını Türkçe'ye çeviriyoruz. Diğer bütün dil destekleri PHPMailer ile gelen, bizim mail diye adlandırdığımız klasörün içindeki language klasöründe mevcut
$mail->send(); //Mailimizi yolluyoruz
echo 'Gönderildi'; //Başarıyla gönderilirse iletisim.php kısmındaki ajax işlemi sırasında yakaladğımız "Gönderildi" kelimesini yazdırıyoruz
} catch (Exception $e) {
echo "Mesaj gönderilemedi, Oluşan hata: {$mail->ErrorInfo}"; //Gönderilemzse oluşan hatayı yazdırıyoruz
}
}



Burda fark ettiğim önemli noktalardan bir tanesi if($_POST) {
koşulunu
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

ibarelerinden önce yazmamanız gerektiği, yoksa bu ifadelere erişemiyor.

Şimdi de bazı mail servislerinin kullandığı

$mail->Host
$mail->Port
değerlerine bakalım.

Gmail
Eğer gmail kullanarak mail göndermek istiyorsanız öncelikle Google ın bir güvenlik önlemini geçmeniz gerekiyor. BU adresten, daha az güvenli uygulamalara erişime izin vermelisiniz.
Sonrasında Gmail için yapılandırma ayarlarını şu şekilde ayarlayın;
Öncelikle Host olarak;

$mail->Host = "smtp.gmail.com";

seçmeniz lazım.
Localhost üzerinde çalışacaksanız ;

$mail->Port = 587;
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;

Sunucu üzerinde ssl ile çalışacaksanız da

$mail->Port = 465;
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;

olarak ayarlamanız gerekli.

Yandex
Maillerinizi yandex hesabınız üzerinden göndermek istediğinizde yine ufak değişiklikler yapmak durumundasınız;
Yine Host olarak;

$mail->Host = "smtp.yandex.com";

şeklinde seçilmeli.

Hem localhost hem de ssl sunucu için Port ve SMTPSecure ayarları aynı şekilde yapılınca mail sorunsuz gönderiliyor. Ayarlar da şu şekilde;

$mail->Port = 587;
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;


Outlook/Hotmail

$mail->Host = "smtp.live.com";
$mail->Port = 587;
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;

ayarlarıyla localhost üzerinden mail gönderebildim ama ssl sunucu üzerindeki denemelerim başarısız oldu. Nasıl ayarlandığını bilen varsa bana da söyleyebilir :)

Bunun dışında kendi sitenizin e posta adresiyle mail göndermek isterseniz de muhtemelen şu ayarlarla çalışacaktır.

$mail->Host = "mail.site.com";
$mail->Username = "adresiniz@site.com";
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;

Sitenizde ssl varsa

$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
$mail->Port = 465;

olarak da değişebilirsiniz.

Bütün bu denemelerim sonucunda en hızlı yanıt süresi kendi sitemiz üzerinden kendi mail adresimizle gönderdiğim mailde oldu.


Bazı bilgilendirmeler

--$mail->SMTPDebug için yapılandırmalar

1- $mail->SMTPDebug = SMTP::DEBUG_OFF; => Varsayılan değer, hata veya geri bildirim raporlarını göstermez.
2- $mail->SMTPDebug = SMTP::DEBUG_CLIENT; => İstemci tarafında oluşan komutları gösterir.
3- $mail->SMTPDebug = SMTP::DEBUG_SERVER; => İstemci tarafında oluşan komutları ve sunucu yanıtlarını gösterir.
4- $mail->SMTPDebug = SMTP::DEBUG_CONNECTION; => DEBUG_SERVER seçeneğine ek olarak bağlantı bilgilerini de gösterir.
5- $mail->SMTPDebug = SMTP::DEBUG_LOWLEVEL; => Düşük seviyeli veri çıkışı, tüm mesajları gösterir.

--$mail->SMTPSecure için yapılandırmalar

1- $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; => Bağlantının "tls" üzerinden olacağını belirtir
2- $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; => Bağlantının "ssl" üzerinden olacağını belirtir


Ekran Görüntüleri

Gmail için



Yandexiçin



Kendi web sitemiz için



Örnek ugulama dosyaları

Buraya kadar anlattığım her şey tek tek kontrol edip yaptığım şeylerdir. Eksik veya gereksiz bilgi vermiş olabilirim. Olduysa affola. Şurası şöyle değil şu şekil olacaktı diyenler olursa çekinmeden söyleyebilir düzeltiriz :)
Herkese iyi çalışmalar...
brown msain1536 ecloud

kişi bu mesajı beğendi.


wmaraci
reklam

Mustafaxu Mustafaxu WM Aracı Kullanıcı
  • Üyelik 06.12.2017
  • Yaş/Cinsiyet 35 / E
  • Meslek Ogrenci
  • Konum Erzurum
  • Ad Soyad M** A**
  • Mesajlar 240
  • Beğeniler 67 / 54
  • Ticaret 4, (%100)
faydali bir konu elinize saglik.
Abdullahx

kişi bu mesajı beğendi.

Abdullahx Abdullahx MW Aracı Kullanıcı
  • Üyelik 03.04.2019
  • Yaş/Cinsiyet 29 / E
  • Meslek .
  • Konum Trabzon
  • Ad Soyad A** K**
  • Mesajlar 905
  • Beğeniler 393 / 395
  • Ticaret 3, (%100)
Teşekkür ederim hocam. Mustafaxu
Mustafaxu

kişi bu mesajı beğendi.


RamazanSancar RamazanSancar WM Aracı Kullanıcı
  • Üyelik 16.07.2018
  • Yaş/Cinsiyet 24 / E
  • Meslek Full Stack Developer
  • Konum Manisa
  • Ad Soyad R** S**
  • Mesajlar 88
  • Beğeniler 18 / 12
  • Ticaret 0, (%0)
Elinize sağlık :)
Abdullahx

kişi bu mesajı beğendi.

wmaraci
wmaraci

Abdullahx Abdullahx MW Aracı Kullanıcı
  • Üyelik 03.04.2019
  • Yaş/Cinsiyet 29 / E
  • Meslek .
  • Konum Trabzon
  • Ad Soyad A** K**
  • Mesajlar 905
  • Beğeniler 393 / 395
  • Ticaret 3, (%100)
Teşekkür ederim :)
RamazanSancar

kişi bu mesajı beğendi.


msain1536 msain1536 grafikrin.com Kullanıcı
  • Üyelik 14.05.2014
  • Yaş/Cinsiyet 30 / E
  • Meslek Graphic Designer
  • Konum İstanbul Anadolu
  • Ad Soyad M** S**
  • Mesajlar 472
  • Beğeniler 143 / 174
  • Ticaret 4, (%100)
Çok güzel anlatım olmuş, ellerinize sağlık.
Abdullahx

kişi bu mesajı beğendi.

grafikrin.com | Stunning Ideas | Ücretsiz Grafik Tasarım Elementleri

Emirh4nY Emirh4nY bedelsizhosting.com Kullanıcı
  • Üyelik 15.10.2019
  • Yaş/Cinsiyet 23 / E
  • Meslek Bilgi Güvenliği Uzmanı
  • Konum Balıkesir
  • Ad Soyad E** Y**
  • Mesajlar 293
  • Beğeniler 1 / 51
  • Ticaret 0, (%0)
Elinize sağlık.
Abdullahx

kişi bu mesajı beğendi.

wmaraci
wmaraci
Konuyu toplam 1 kişi okuyor. (0 kullanıcı ve 1 misafir)
Site Ayarları
  • Tema Seçeneği
  • Site Sesleri
  • Bildirimler
  • Özel Mesaj Al