PHP de Email Atma
Faydalı Linkler:
Problemler için
Öncelikle farklı yöntemler olduğunu belirtmek lazım. PHP nin kendi mail (https://www.php.net/manual/tr/function.mail.php) kütüphanesi mevcut fakat desteklenmediği için tercih edilmiyor. O yüzden başka kütüphaneler kullanılıyor. Bu arada işletim sisteminde smtp server olması gerekiyor. Kullanılan kütüthanelerden birisi de PHPMailer
.
Source : https://github.com/PHPMailer
Kurulum için html klasörünün içerisine girmek gerekmektedir.
> cd /var/www/html
Sistemde php kuruluysa; (https://www.yusufsezer.com.tr/composer/)
> curl -sS https://getcomposer.org/installer | php
> php -r "readfile('https://getcomposer.org/installer');" | php
ile composer kurulur. (root ile işleme devam edelim mi diye sorarsa Yes yapın.)
Sonra;
> mv composer.phar /usr/local/bin/composer
ve composer vasıtasıyla aşağıdaki komutla phpmailer kurulur.
> composer require phpmailer/phpmailer
Aşağıdaki linklerde bazı uygulamalarını görebiliriz.
https://packagist.org/packages/phpmailer/phpmailer
https://www.yusufsezer.com.tr/composer/ bu linkte daha detaylı işlemler var fakat yukarıdakiler bana yeterli oldu.
Yukarıdaki kurulumu /var/www/html
içinde yapınca /vendor içerisine phpmailer adında bir klasör ve bir sürü kütüphane dosyası oluşturur. /vendor altına autoload.php, /var/www/html altına composer.json ve composer.lock dosyaları da oluşturur. Dolayısıyla kodun içerisinden bazı dosyalar çağırmak gerekmektedir.
Dosyanın başına; (Aşağıdakini fonksiyon içerisinde çağırdım çalışmadı.)
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
ve istenirse başta istenirse fonksiyon içerisinde aşağıdaki kod ile kütüphane çağırılır.
require 'vendor/autoload.php';
Kodların da doğru yazıldığı halde bazı sorunlar ortaya çıktı.
Error: PHPMailer SMTP Error: Could not connect to SMTP host
Çözüm: Kodun içerisine aşağıdaki eklenir.
(https://netcorecloud.com/tutorials/phpmailer-smtp-error-could-not-connect-to-smtp-host/)
(https://stackoverflow.com/questions/3477766/phpmailer-smtp-error-could-not-connect-to-smtp-host)
$mail->SMTPOptions = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
)
);
Sonuç olarak aşağıdaki kod oluştu.
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
if (isset($_REQUEST['accountName']))
{
ValidateValues();
}
else if (isset($_REQUEST['accountNameDB']))
{
SendTestEmail();
}
else
echo "Page Error!!!";
function SendTestEmail()
{
//echo "accountNameDB = " . $_REQUEST['accountNameDB'];
if (filter_var($_REQUEST['receiverEmail'], FILTER_VALIDATE_EMAIL))
{
if ( $_REQUEST['emailHostAddressDB'] != "" )
{
if (filter_var($_REQUEST['accountNameDB'], FILTER_VALIDATE_EMAIL))
{
if( filter_var($_REQUEST['emailHostPortDB'], FILTER_VALIDATE_INT) )
{
//Load Composer's autoloader
require 'vendor/autoload.php';
$mail = new PHPMailer(true);
try {
//SMTP Sunucu Ayarları
$mail->SMTPDebug = 0; // DEBUG Kapalı: 0, DEBUG Açık: 2
$mail->isSMTP();
$mail->Host = $_REQUEST['emailHostAddressDB']; //'mail.domainadi.com'; // Email sunucu adresi.
$mail->SMTPAuth = $_REQUEST['authenDB']; //true; // SMTP kullanici dogrulama kullan
$mail->Username = $_REQUEST['accountNameDB']; //'[email protected]'; // SMTP sunucuda tanimli email adresi
$mail->Password = $_REQUEST['accountPasswordDB']; //'mailsifresi'; // SMTP email sifresi
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // SSL icin `PHPMailer::ENCRYPTION_SMTPS` kullanin. SSL olmadan 587 portundan gönderim icin `PHPMailer::ENCRYPTION_STARTTLS` kullanin
$mail->Port = $_REQUEST['emailHostPortDB']; //587; // Eger yukaridaki deger `PHPMailer::ENCRYPTION_SMTPS` ise portu 465 olarak guncelleyin. Yoksa 587 olarak birakin
$mail->SMTPOptions = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
)
);
$mail->setFrom($_REQUEST['accountNameDB'],$_REQUEST['senderNameDB']); //('[email protected]', 'Gonderen Ad Soyad'); // Gonderen bilgileri yukaridaki $mail->Username ile aynı deger olmali
//Alici Ayarları
$mail->addAddress($_REQUEST['receiverEmail'], ''); //('[email protected]', 'Alıcı Ad Soyad'); // Alıcı bilgileri
//$mail->addAddress('[email protected]'); // İkinci alıcı bilgileri
////$mail->addReplyTo('[email protected]'); // Alıcı'nın emaili yanıtladığında farklı adrese göndermesini istiyorsaniz aktif edin
////$mail->addCC('[email protected]');
////$mail->addBCC('[email protected]');
// Mail Ekleri
////$mail->addAttachment('https://cdn.domainhizmetleri.com/var/tmp/file.tar.gz'); // Attachment ekleme
////$mail->addAttachment('https://cdn.domainhizmetleri.com/tmp/image.jpg', 'new.jpg'); // Opsiyonel isim degistirerek Attachment ekleme
// İçerik
$mail->isHTML(true); // Gönderimi HTML türde olsun istiyorsaniz TRUE ayarlayin. Düz yazı (Plain Text) icin FALSE kullanin
$mail->CharSet = 'utf-8';
$mail->Subject = $_REQUEST['sendSubject']; //'Email Konusu';
$mail->Body = '<strong>' . $_REQUEST['sendMessage'] . '</strong>'; //'Bu bölüm mailin <b>HTML türde</b> içeriğidir';
$mail->send();
echo "Test Email Sent!";
} catch (Exception $e) {
echo "Ops! Email did not send! Error: {$mail->ErrorInfo}";
}
}
else
{
echo $_REQUEST['emailHostPortDB']." is not a valid port!";
}
}
else
{
echo $_REQUEST['accountNameDB']." is not a valid email address!";
}
}
else
{
echo "Email Host Address '" . $_REQUEST['emailHostAddressDB'] . "' must be like smtp.example.com!";
}
}
else
{
echo "Receiver Email Address '" . $_REQUEST['receiverEmail'] . "' must be like [email protected]!";
}
}
function ValidateValues() //database a yeni kayıt için.
{
//echo "authen = " . $_REQUEST['authen'];
// Remove all illegal characters from email
//$email = filter_var($email, FILTER_SANITIZE_EMAIL);
// Validate email
//echo $email;
if ( $_REQUEST['emailHostAddress'] != "" )
{
if (filter_var($_REQUEST['accountName'], FILTER_VALIDATE_EMAIL))
{
if( filter_var($_REQUEST['emailHostPort'], FILTER_VALIDATE_INT) )
{
// Create (connect to) SQLite database in file
$my_conn = new PDO('sqlite:upsDB.db');
// Set errormode to exceptions
$my_conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$ID = 0;
//UPDATE 'EMAIL_SENDER' SET 'AcountPass'= 'tafi12345', 'SenderName'='deneme';
$query = "UPDATE 'EMAIL_SENDER' SET 'EmailServer' = '" . $_REQUEST['emailHostAddress'] . "','EmailPort' = '" . $_REQUEST['emailHostPort'] . "','SenderName' = '" . $_REQUEST['senderName'] . "','Authen' = '" . $_REQUEST['authen'] . "','AcountName' = '" . $_REQUEST['accountName'] . "','AcountPass' = '" . $_REQUEST['accountPassword'] . "'";
//echo $query;
$sql=$my_conn->prepare($query);
$sql->execute();
echo "Database Updated!";
}
else
{
echo $_REQUEST['emailHostPort']." is not a valid port!";
}
}
else
{
echo $_REQUEST['accountName']." is not a valid email address!";
}
}
else
{
echo "Email Host Address " . $_REQUEST['emailHostAddress'] . " must be like smtp.gmail.com!";
}
}
?>
Çalıştırırken aşağıdaki kayıtları kullandım.
Email Host Address -> mail.tescom-ups.com
Email Host Port -> 587
Authentification -> true
Account Name -> [email protected]
Account Password -> 35elit.com
Gmail hesabı kullanarak mail atma
Burada bazı problemler çıkmaktadır.
Error: SMTP ERROR: Password command failed when send mail from my server
Çözüm:
Yukarıdaki linkleri okumam sonucu gmail de bazı ayarların yapılaması gerektiği ortaya çıkıyor.
Aşağıdakileri kullanabilmek için kendime basit bir gmail hesabı açtım.
Email Host Address -> smtp.gmail.com
Email Host Port -> 587
Authentification -> true
Account Name -> [email protected]
Account Password -> tescom1981
01.01.1981
- Google Hesabınıza erişim izni verme : https://accounts.google.com/b/0/DisplayUnlockCaptcha
- Daha az güvenli uygulama erişimi : https://myaccount.google.com/lesssecureapps?pli=1&rapt=AEjHL4N-xkoClakG7VqUNMugyI5gRLWvPalz75mTt97IJJCig35moPwMpjsmUteEpp96WR_qontKLuL9-7KdPlSNB7xvt47mcg
Bu erişimleri açınca gmail hesabı üzerinden de email atıldı.