13 Ocak 2017 Cuma

XAMPP + PhpMailer + Gmail Smtp (Localhost Mail Gönderme)

Xampp kullanıyorsanız ve local'de phpmailer kullanarak mail göndermek için çok uğraştım. Hatalar ve araştırmalar sonunda doğru yöntemi buldum çok şükür. Ve sizlerle paylaşmak istiyorum:

Özetle:
$mail->;smtpConnect([
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
]
]);
Bu kodları send komutundan hemen önceye eklerseniz sorun çözülüyor. Hepsi bu kadar.

Şimdi ayrıntılı anlatayım:
1. Php.ini üzerinde hiçbir değişiklik yapmanıza gerek yoktur. Ben bütün SMTP ayarlarını kapalı konuma getirdim. Çünkü adres ve port seçimlerini kod içinde belirtiyoruz.

2. https://github.com/PHPMailer/PHPMailer adresinden phpmailer'ı indirin.
3. İndirdiğiniz dosyalardan examples ve extras klasörleri işimize yaramayacağı için isterseniz bunları almayabilirsiniz. Diğer dosyaları (dosyaların hepsi ve language klasörü) phpmailer adında bir klasöre kopyalayarak bu klasörü root'a kopyalayın (veya root içinde istediğiniz klasöre).
4. Gmail SMTP ile mail göndermek için artık hazırsınız, maili gönderebiliriz. Yine root'da şu mail.php dosyasını oluşturun:

mail.php


function send_mail($email,$message,$subject) {
date_default_timezone_set("Europe/Istanbul");
require 'phpmailer/PHPMailerAutoload.php';
//Create a new PHPMailer instance
//Passing true to the constructor enables the use of exceptions for error handling
$mail = new PHPMailer(true);
if ( !PHPMailer::ValidateAddress($email) ){ // or !$mail->validateAddress($email)
return "E-posta adresi geçersiz!";
}
try {
$mail->SetLanguage("tr","phpmailer/language/");
$mail->CharSet  ="utf-8";

//Tell PHPMailer to use SMTP
$mail->isSMTP();
$mail->SMTPAuth = true;

//Enable SMTP debugging
// 0 = off (for production use)
// 1 = client messages
// 2 = client and server messages
$mail->SMTPDebug = 0;

//Ask for HTML-friendly debug output
$mail->Debugoutput = 'html';

//Set the hostname of the mail server
$mail->Host = 'smtp.gmail.com';
// use
// $mail->Host = gethostbyname('smtp.gmail.com');
// if your network does not support SMTP over IPv6

//Set the SMTP port number - 587 for authenticated TLS, a.k.a. RFC4409 SMTP submission
$mail->Port = 587; //ssl:465 tls:587

//Set the encryption system to use - ssl (deprecated) or tls
$mail->SMTPSecure = 'tls';

//Whether to use SMTP authentication
$mail->SMTPAuth = true;

//Username to use for SMTP authentication - use full email address for gmail
$mail->Username = "your_gmail_adrress";

//Password to use for SMTP authentication
$mail->Password = "your_gmail_password";

//Set who the message is to be sent from
$mail->setFrom('info@siteniz.com', 'Sitenizin Adı');

//Set an alternative reply-to address
$mail->addReplyTo('info@siteniz.com', 'Sitenizin Adı');

//Set who the message is to be sent to
$mail->addAddress($email, ''); //'email','first-last name'

//Set the subject line
$mail->Subject = $subject;

//Read an HTML message body from an external file, convert referenced images to embedded,
//convert HTML into a basic plain-text alternative body
//$mail->msgHTML(file_get_contents('contents.html'), dirname(__FILE__));
$mail->msgHTML($message);

//Replace the plain text body with one created manually
$mail->AltBody = 'This is a plain-text message body';

//Attach an image file
//$mail->addAttachment('images/phpmailer_mini.png');

//send the message
$mail->smtpConnect([
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
]
]);
$sonuc = $mail->send();
return $sonuc; //boolean
}
catch (phpmailerException $e) {
return $e->errorMessage(); //Pretty error messages from PHPMailer
}
catch (Exception $e) {
return $e->getMessage(); //Boring error messages from anything else!
}
}


$SONUC = $send_mail('gidecek_kisi@examples.com','Bu bir deneme mailidir...','Mesaj Konusu');

?>
5. Bu kadar. Denenmiştir ve Çalışmaktadır.

Açıklamalar
1. Ben burada tls (port 587)  ile gönderdim. Fakat ssl (port 465) ile de gönderebilirsiniz. İkisi de çalışıyor.
2. Aslında bu kod phpmailer/examples klasöründe gmail.phps dosyasında var. Fakat bu şekliyle çalışmıyor. Buradaki sıkıntıyı şu kodları ekleyerek çözdüm:
$mail->;smtpConnect([
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
]
]);

3. Bu kodu yazmadan önce aldığım hata mesajları şunlardı:

  • Warning: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in C:\xampp\htdocs\members\phpmailer\class.smtp.php on line 367
  • SMTP Error: Could not connect to SMTP host.