PHP – PHPMailer İle E-Posta Gönderimi

18 Mayıs 2020 tarihinde Emre Can ÖZTAŞ tarafından paylaşıldı.

Klasik olarak PHP ortamında; mail() fonksiyonu ile mail gönderme işlemi gerçekleştirilir. mail() fonksiyonunun kullanımı da aşağıdaki gibidir.

mail(to, subject, message, headers, parameters);

Parametreler:

to: E-postanın kime gönderileceği belirtilir.

subject: E-postanın konusu.

message: E-postanın içeriği.

headers: From, Cc, Bcc gibi ek başlıklar eklemek için kullanılır.

parameters: E-posta gönderirken kullanılan programa komut satırı seçenekleri aktarmak için kullanılır.

Bu fonksiyonun dönüş değeri de; Boolean (true/false) cinsindendir.

Fakat artık mail() fonksiyonu sunucular tarafından desteklenmemektedir. Bunun nedeni de; mail() fonksiyonun güvenlik açığı oluşturmasıdır. Bunun yerine; SMTP (Simple Mail Transfer Protocol) kullanılmasıdır.

PHP ile SMTP üzerinden e-posta göndermek için çeşitli kütüphaneler mevcut. PHPMailer, Zend Mail, Swift Mailer ve ZetaComponents, PHP ile e-posta göndermek için kullanılabilecek bazı kütüphaneler. Bu yazıda; PHPMailer’ı anlatmaya çalışacağız.

Öncelikli olarak işe; PHPMailer’ı indirmekle başlayalım.

PHPMailer’ı indirmek için Composer kullanmamız gerekiyor. Composer’in bilgisayarınızda yerleşik olduğunu varsayarak, PHPMailer’ı indirmek istediğiniz dizindeyken komut satırından (CMD, Console veya Terminal):

$ composer require phpmailer/phpmailer

yazarak, PHPMailer’ın indirilmesini sağlayabilirsiniz.

Varolan bir composer.json dosyanız varsa, bu dosyaya:

"phpmailer/phpmailer": "~6.1"

satırını, bağımlılıklara ekleyerekte indirme işlemini gerçekleştirebilirsiniz.

İndirme işlemini tamamladıktan sonra; PHPMailer için gerekli dosyaları, kullanmak istediğiniz PHP dosyasına çağırabiliriz, artık.

<?php

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

Yukarıdaki satırlarımızda da görüldüğü üzere; PHPMailer, SMTP ve Exception kümelerini kullanmak istediğimizi, ilk olarak belirttik.

Composer’e ait olan ve vendor (eğer ismini değiştirmediyseniz, varsayılan olarak ‘vendor’ olarak isimlendirilir. vendor ismini değiştirme için buradaki yazımı inceleyebilirsiniz.) dizinindeki autoload.php dosyasını çağıralım.

require 'vendor/autoload.php';

PHPMailer sınıfına ait olan bir nesne oluşturalım.

$mail = new PHPMailer(true);

Yukarıda, true atamamızın nedeni; kodlarımızda herhangi bir hata durumunda bu hataların yakalanması içindir. Yani bir nevi kontrol mekanizması oluşturup, bu hataların oluşması durumunda bize bildirilmesini sağlamak.

Şimdi kodlarımıza geçelim ve satır satır açıklayarak gidelim.

Ayrıntılı hata ayıklama çıktısını etkinleştirelim. Bu sayede; oluşan hataların detaylı olarak çıktısı verilsin.

$mail->SMTPDebug = SMTP::DEBUG_SERVER;

SMTP’yi kullanacağımızı belirtelim (isSenmail() ve qMail() metotlarını da yine bu sistemlere yönelik kullabilirsiniz. Şayet normal bir e-posta gönderimi yapacaksanız; isSMTP() metodunu kullanabilirsiniz).

$mail->isSMTP();

E-posta sunucunun adını belirtelim. Sunucunun ismi; mail, smtp vs. gibi isimlendirelebilir. Bunu panelinizden öğrenebilirsiniz. En doğrusu da kullandığınız hosting sağlayıcısından öğrenmenizdir.

$mail->Host = 'mail.emrecanoztas.com';

SMTP kimlik doğrulamasını etkinleştirelim.

$mail->SMTPAuth = true;

E-posta göndereceğimiz tanımlı adresi yazalım (Örneğin: me@emrecanoztas.com, emrecanoztas@outlook.com gibi).

$mail->Username = 'me@emrecanoztas.com';

E-postamıza ait olan şifremizi girelim.

$mail->Password = 'YOUR PASSWORD';

TLS şifrelemesini etkinleştirelim (E-postamızın güvenliği açısından kullanıyoruz).

$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;

TCP (Transmission Control Protocol) portunu yazalım (Port numaraları kullanılan e-posta sunucuya göre farklılık göstermektedir. 25, 465, 587 ve 2525 olabilmektedir.  Bu port numaralarının kullanılmalarının çeşitli nedenleri var. Bu konuda detaylı bilgi için buradaki sayfayı inceleyebilirsiniz. Varsayılan olarak; 587 port numarası, günümüzde kullanılmaktadır.).

$mail->Port = 587;

PHPMailer için gerekli ayarları yaptıktan sonra; e-posta gövde ve içeriğini oluşturmaya başlayabiliriz.

E-postanın kimin gönderdiğini belirtelim (Burada ikinci parametre isteğe bağlıdır. Bir isim belirtmenize gerek yoktur.).

$mail->setFrom('me@emrecanoztas.com');
// veya
$mail->setFrom('me@emrecanoztas.com', 'ÖZTAŞ, Emre Can');

E-postanın kime gönderileceğini belirtelim (setFrom() metodunda olduğu gibi ikinci parametre isteğe bağlıdır. Dilerseniz, göndereceğiniz kişinin adını belirtmeye bilirsiniz.).

$mail->addAddress('emrecanoztas@outlook.com');
// veya
$mail->addAddress('emrecanoztas@outlook.com', 'ÖZTAŞ, Emre Can');

E-postaya cevap verileceği adresi belirtelim. Yani; gönderen e-posta adresi yerine başka bir adres de verebiliriz.

$mail->addReplyTo('iletisim@emrecanoztas');
// veya
$mail->addReplyTo('iletisim@emrecanoztas', 'Geri Bildirim');

CC (Carbon Copy) yani e-postanın başka hangi adreslere de ileteceğini belirtelim. Buraya ekleyeceğiniz adresler e-posta gönderilen kişiler tarafından da görülebilir. İkinci parametre isteğe bağlıdır.

$mail->addCC('cc@emrecanoztas.com');
// veya
$mail->addCC('cc@emrecanoztas.com', 'ÖZTAŞ, Emre Can');

BCC (Blind Carbon Copy), CC ile benzer mantıktadır fakat BCC’ye ekleyeceğiniz e-posta adresleri, e-posta gönderilenlere gösterilmez. İkinci parametre isteğe bağlıdır.

$mail->addBCC('bcc@emrecanoztas.com');
// veya
$mail->addBCC('bcc@emrecanoztas.com', 'ÖZTAŞ, Emre Can');

Buraya kadar olan kısımda; PHPMailer ile ilgili genel ayarlamaları yaptık. Ayrıca; e-posta gönderici / alıcı düzenlemelerini de gerçekleştirdik. Şimdi gelelim alıcıya bir dosya gönderme işlemine.

E-postanızla birlikte kullanıcıya bir dosya da gönderebilirsiniz.

$mail->addAttachment('./docs/belgeler.zip');
// veya
$mail->addAttachment('./images/profil-resmi.jpg', 'yeni-profil-resmi'); // dosya ismini yeniden düzenleyebilirsiniz.

Şimdi de e-postamızın içeriğini oluşturmaya başlayalım.

Şayet; e-posta içeriğimizi HTML ile oluşturacaksak, bunu belirtelim. Sadece içerik olacaksa; e-postanızı HTML ile işaretlemenize gerek yoktur.

$mail->isHTML(true);

E-postamıza bir başlık (konu) ekleyelim.

$mail->Subject = 'E-Posta Başlığı';

E-postamızın içeriğini yazalım.

$mail->Body = 'E-Posta İçeriği';
// HTML içerik olabilir.
$mail->Body = '<h1>E-Posta İçeriği</h1>';

HTML olmayan e-posta alıcıları için bir alt içerik yazabiliriz.

$mail->AltBody = 'E-Posta Alt Başlık';

Buraya kadar olan kısımlarda gerekli olan her şeyi yaptık şimdi e-postamızı gönderelim.

$mail->send();

Yukarıda; hata ayıklama işlemini aktif ettiğimiz için eposta gönderiminden herhangi bir hata olması durumunda bu hata mesajı ekrana yazdırılır. Herhangi bir uyarı gelmediği zaman e-postamız gönderilmiş demektir.

E-posta gönderimini daha iyi kontrol etmek için aşağıdaki bir kullanım daha iyi olacaktır.

$status = @$mail->send();
($status) ? echo($status); : var_dump($status);

Buraya kadar satır satır anlattığımız kısımları birleştirelim ve bir tam örnek yapalım. Örneğimiz aşağıdaki gibi olacaktır.

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php';

$mail = new PHPMailer(true);

try {
    // Sunucu ayarları.
    $mail->SMTPDebug = SMTP::DEBUG_SERVER;
    $mail->isSMTP();
    $mail->Host = 'mail.emrecanoztas.com';
    $mail->SMTPAuth = true;
    $mail->Username = 'me@emrecanoztas.com';
    $mail->Password = 'YOUR PASSWORD';
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
    $mail->Port = 587;
    
    // Alıcılar ve gönderen.
    $mail->setFrom('me@emrecanoztas.com', 'ÖZTAŞ, Emre Can');
    $mail->addAddress('emrecanoztas@outlook.com', 'ÖZTAŞ, Emre Can');
    $mail->addReplyTo('iletisim@emrecanoztas', 'Geri Bildirim');
    $mail->addCC('cc@emrecanoztas.com', 'ÖZTAŞ, Emre Can');
    $mail->addBCC('bcc@emrecanoztas.com', 'ÖZTAŞ, Emre Can');
    
    // Dosyalar.
    // $mail->addAttachment('./docs/belgeler.zip');
    // // veya
    // $mail->addAttachment('./images/profil-resmi.jpg', 'yeni-profil-resmi'); // dosya ismini yeniden düzenleyebilirsiniz.
    
    // İçerik.
    $mail->isHTML(true);
    $mail->Subject = 'E-Posta Başlığı';
    $mail->Body = '<h1>E-Posta İçeriği</h1>';
    
    // Gönderim.
    $status = @$mail->send();
    
    // Gönderim kontrol.
    ($status) ? echo($status) : var_dump($status);    
} catch (Exception $e) {
    echo("Mesaj gönderilemedi! Hata: {$mail->ErrorInfo}";
}

Yukarıdaki örneğimizle beraber; PHPMailer ile bir e-postanın nasıl gönderildiği konusunu anlatmaya çalıştık. PHPMailer’ın yapabildikleri bunlarla sınırlı olmamakla beraber değinmediğimiz daha pek çok önemli yetenekleri var. Fakat biz, normal bir kullanım için gerekli olanlara değindik.

PHPMailer hakkında daha detaylı bilgilere ulaşmak isterseniz, size tavsiyem; src dizinindeki PHPMailer.php dosyasını açıp incelemeniz yönünden olacaktır. Kod yapısı oldukça basit ve anlaşılır.

Kategoriler: [PHP] Etiketler: #e-posta #mail() #phpmailer

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*

*
*

This site uses Akismet to reduce spam. Learn how your comment data is processed.