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:

  1. https://stackoverflow.com/questions/21937586/phpmailer-smtp-error-password-command-failed-when-send-mail-from-my-server
  1. https://github.com/PHPMailer/PHPMailer/issues/1708

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

  1. Google Hesabınıza erişim izni verme : https://accounts.google.com/b/0/DisplayUnlockCaptcha
  1. 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ı.