PHP ile SMTP’den Mail Gönderimi – PHPMailer
Açıklama:
Nasıl yapılır kısmına geçmeden önce PHPMailer sınıfı ve özellikleri ile alakalı ufak bir girizgah yapıyorum, ilgisini çekmeyenler yapılandırma kısmına geçebilir.
PHPMailer, bir web sunucusundan PHP kodu aracılığıyla mailleri güvenli ve kolay bir şekilde göndermek için oluşturulmuş olan bir kod kitaplığıdır. PHP uygulamanıza mail işlevselliği eklemek söz konusu olduğunda, PHPMailer en iyi seçim olacaktır. PHP frameworklerinin çoğu ile uyumlu olmak ile beraber içerik yönetim sistemi olarak adlandırılan (CMS) bir çok açık kaynak kodlu projelerde de kullanılmıştır (WordPress, Drupal, 1CRM, SugarCRM, Yii, Joomla ve diğerleri…). PHPMailer, eklerle HTML e-mailleri oluşturmak ve bunları birden çok alıcıya göndermek için güçlü işlevsellik sağlar.
Özellikleri:
- SMTP kimlik doğrulaması
- Güvenli / MIME şifreleme
- TLS ve SSL protokolleri desteği
- Düz metinle birlikte HTML desteği
- Bir veya birden fazla ek ve gömülü görüntü desteği
- Birden çok Alıcı, CC, BCC ve Yanıt adresi içeren e-postalar
- UTF-8 içeriği ve 8 bit, base64, ikili ve alıntılı yazdırılabilir kodlamalar için destek
- E-posta adreslerini otomatik olarak doğrular
- Başlık ekleme saldırılarına karşı koruma
- 50 farklı dilde hata mesajları
- PHP 5.5 ve üst versiyonlar ile uyumlu
- Ve daha fazlası…
Yapılandırma:
Bu yazıyı yazarken PHPMailer’in son kararlı versiyonu 6.1.8 idi. Aşağıdaki linkten PHPMailer’i direkt bilgisayarınıza indirebilir ya da güncel sürüm kontrolü yapmak için github sayfasına göz atabilirsiniz.
Büyük olasılıkla, e-posta bildiriminizi tasarlamak için HTML kullanacaksınız. Öyleyse, HTML yöntemlerini ve özelliklerini kullanmaya ilişkin bazı örnekleri inceleyelim.
Ben burada Composer ile değil de direkt olarak PHPMailer’ın kaynak kodunu indirip projeme dahil ediyorum. Zipten çıkarmış olduğum PHPMailer-6.1.8 isimli klasörümün adını basit olması açısından PHPMailer olarak değiştirip kullanacağım. Kütüphaneleri projemin başına dahil ettim. Dilerseniz yazının sonundaki örnek proje dosyasını indirebilirsiniz.
require 'PHPMailer/src/Exception.php'; require 'PHPMailer/src/PHPMailer.php'; require 'PHPMailer/src/SMTP.php'; use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use PHPMailer\PHPMailer\Exception;
Son durum aşağıdaki gibi olmalıdır. İlgili class’a ait kullanım örneklerin açıklamalarını yorum satırı olarak belirttim. Kullanmadığınız kısımları kaldırabilir ya da true değerinden false değerine çevirebilirsiniz.
<?php // PHPMailer sınıflarını global namespace alanına içe aktarın require 'PHPMailer/src/Exception.php'; require 'PHPMailer/src/PHPMailer.php'; require 'PHPMailer/src/SMTP.php'; use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use PHPMailer\PHPMailer\Exception; $mail = new PHPMailer(true); // Eğer bir hata ile karşılaşırsak yakalamak için // Kodlarımızı try catch blogunda yazıyoruz. try { //Sunucu ayarları $mail->SMTPDebug = SMTP::DEBUG_SERVER; // Hata ayıklamak için debug etkin $mail->isSMTP(); // SMTP kullanarak gönderim $mail->Host = 'smtp1.ornek.com'; // SMTP sunucusu $mail->SMTPAuth = true; // SMTP kimlik doğrulaması etkin $mail->Username = '[email protected]'; // SMTP kullanıcısı $mail->Password = 'smtp şifre'; // SMTP şifre $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // TLS ile şifreleme etkin $mail->Port = 587; // SMTP port //Karakter ayarları $mail->CharSet ="utf-8"; //Türkçe karakter sorununun önüne geçecektir. $mail->Encoding="base64"; // Alıcılar $mail->setFrom('[email protected]', 'Mailer'); $mail->addAddress('[email protected]', 'Ahmet'); // Alıcı $mail->addAddress('[email protected]'); // Ad kısmı opsiyoneldir. $mail->addReplyTo('[email protected]', 'Bilgi'); $mail->addCC('[email protected]'); $mail->addBCC('[email protected]'); // Ekler $mail->addAttachment('/var/tmp/file.tar.gz'); // Ek kısmı $mail->addAttachment('/tmp/image.jpg', 'new.jpg'); // Ek ismi opsiyoneldir. // İçerik $mail->isHTML(true); // Mail HTML formatında olacaktır. $mail->Subject = 'Mailin Konusu'; $mail->Body = 'Burası mesajın gövdesidir. <b>burası bold!</b>'; $mail->AltBody = 'non-HTML mail istemcileri için mesaj gövdesidir.'; $mail->send(); echo 'Mesajınız gönderildi'; } catch (Exception $e) { echo "Mesajınız gönderilemedi. Mailer Hata: {$mail->ErrorInfo}"; } ?>
PHPMailer varsayılan olarak İngilizce’dir ancak karşılaşabileceğiniz PHPMailer hata mesajlarının birçok çevirisini language klasöründe bulabilirsiniz. Örneğin Türkçe dilini belirtmek için, PHPMailer’a aşağıdaki şekilde söylemeniz gerekir:
$mail->setLanguage('tr', 'PHPMailer/language/phpmailer.lang-tr.php');
Test:
phpMailer.php’yi çalıştırdığımda $mail->SMTPDebug = SMTP::DEBUG_SERVER; aktif olduğundan dolayı mail gönderimin başarılı olup olmadığını ve gönderim aşamalarını aşağıdaki gibi göreceksiniz. Dilerseniz bu satırı kod bloğundan kaldırıp debug’ı kapatabilirsiniz. Unutmayın ki test sırasında debug açılması sizin için faydalı olacaktır.
2020-11-13 19:57:24 SERVER -> CLIENT: 220-srvc70.turhost.com ESMTP Exim 4.93 #2 Fri, 13 Nov 2020 22:56:44 +0300 220-We do not authorize the use of this system to transport unsolicited, 220 and/or bulk e-mail. 2020-11-13 19:57:24 CLIENT -> SERVER: EHLO localhost 2020-11-13 19:57:24 SERVER -> CLIENT: 250-turhost.com Hello localhost []250-SIZE 52428800250-8BITMIME250-PIPELINING250-AUTH PLAIN LOGIN250-STARTTLS250 HELP 2020-11-13 19:57:24 CLIENT -> SERVER: STARTTLS 2020-11-13 19:57:24 SERVER -> CLIENT: 220 TLS go ahead 2020-11-13 19:57:24 CLIENT -> SERVER: EHLO localhost 2020-11-13 19:57:24 SERVER -> CLIENT: 250-.turhost.com Hello localhost []250-SIZE 52428800250-8BITMIME250-PIPELINING250-AUTH PLAIN LOGIN250 HELP 2020-11-13 19:57:24 CLIENT -> SERVER: AUTH LOGIN 2020-11-13 19:57:24 SERVER -> CLIENT: 334 VXNlcm5hbWU6 2020-11-13 19:57:24 CLIENT -> SERVER: [credentials hidden] 2020-11-13 19:57:24 SERVER -> CLIENT: 334 UGFzc3dvcmQ6 2020-11-13 19:57:24 CLIENT -> SERVER: [credentials hidden] 2020-11-13 19:57:24 SERVER -> CLIENT: 235 Authentication succeeded 2020-11-13 19:57:24 CLIENT -> SERVER: MAIL FROM:<[email protected]> 2020-11-13 19:57:24 SERVER -> CLIENT: 250 OK 2020-11-13 19:57:24 CLIENT -> SERVER: RCPT TO:<[email protected]> 2020-11-13 19:57:24 SERVER -> CLIENT: 250 Accepted 2020-11-13 19:57:24 CLIENT -> SERVER: DATA 2020-11-13 19:57:24 SERVER -> CLIENT: 354 Enter message, ending with "." on a line by itself 2020-11-13 19:57:24 CLIENT -> SERVER: Date: Fri, 13 Nov 2020 19:57:24 +0000 2020-11-13 19:57:24 CLIENT -> SERVER: To: Serdar KURT <[email protected]> 2020-11-13 19:57:24 CLIENT -> SERVER: From: Mailer <[email protected]> 2020-11-13 19:57:24 CLIENT -> SERVER: Reply-To: Reply To <[email protected]> 2020-11-13 19:57:24 CLIENT -> SERVER: Subject: Mailin Konusu 2020-11-13 19:57:24 CLIENT -> SERVER: Message-ID: <yCjgKC8bBIIt85ezgYNFzvkSXCDXa0fNEPYMcLr5sjY@localhost> 2020-11-13 19:57:24 CLIENT -> SERVER: X-Mailer: PHPMailer 6.1.8 (https://github.com/PHPMailer/PHPMailer) 2020-11-13 19:57:24 CLIENT -> SERVER: MIME-Version: 1.0 2020-11-13 19:57:24 CLIENT -> SERVER: Content-Type: multipart/alternative; 2020-11-13 19:57:24 CLIENT -> SERVER: boundary="b1_yCjgKC8bBIIt85ezgYNFzvkSXCDXa0fNEPYMcLr5sjY" 2020-11-13 19:57:24 CLIENT -> SERVER: Content-Transfer-Encoding: 8bit 2020-11-13 19:57:24 CLIENT -> SERVER: 2020-11-13 19:57:24 CLIENT -> SERVER: This is a multi-part message in MIME format. 2020-11-13 19:57:24 CLIENT -> SERVER: 2020-11-13 19:57:24 CLIENT -> SERVER: --b1_yCjgKC8bBIIt85ezgYNFzvkSXCDXa0fNEPYMcLr5sjY 2020-11-13 19:57:24 CLIENT -> SERVER: Content-Type: text/plain; charset=utf-8 2020-11-13 19:57:24 CLIENT -> SERVER: Content-Transfer-Encoding: 8bit 2020-11-13 19:57:24 CLIENT -> SERVER: 2020-11-13 19:57:24 CLIENT -> SERVER: non-HTML mail istemcileri için mesaj gövdesidir. 2020-11-13 19:57:24 CLIENT -> SERVER: 2020-11-13 19:57:24 CLIENT -> SERVER: --b1_yCjgKC8bBIIt85ezgYNFzvkSXCDXa0fNEPYMcLr5sjY 2020-11-13 19:57:24 CLIENT -> SERVER: Content-Type: text/html; charset=utf-8 2020-11-13 19:57:24 CLIENT -> SERVER: Content-Transfer-Encoding: 8bit 2020-11-13 19:57:24 CLIENT -> SERVER: 2020-11-13 19:57:24 CLIENT -> SERVER: Burası mesajın gövdesidir. <b>burası bold!</b> 2020-11-13 19:57:24 CLIENT -> SERVER: 2020-11-13 19:57:24 CLIENT -> SERVER: 2020-11-13 19:57:24 CLIENT -> SERVER: --b1_yCjgKC8bBIIt85ezgYNFzvkSXCDXa0fNEPYMcLr5sjY-- 2020-11-13 19:57:24 CLIENT -> SERVER: 2020-11-13 19:57:24 CLIENT -> SERVER: . 2020-11-13 19:57:25 SERVER -> CLIENT: 250 OK id=1kdfBc-000SFR-P9 2020-11-13 19:57:25 CLIENT -> SERVER: QUIT 2020-11-13 19:57:25 SERVER -> CLIENT: 221 turhost.com closing connection Mesajınız gönderildi
PHPMailer ile göndermiş olduğum test maili, posta kutuma başarılı bir şekilde gelmiş bulunmaktadır: