10 Eylül 2012 Pazartesi

PHP, phpmailer ve Gmail alt yapısını kullanan SMTP Mail Formu

PHP ile mail gönderme işlemini daha önce şurada anlatmıştım. Şimdi aynı şeyi Gmail alt yapısını kullanarak nasıl yapıyoruz ondan bahsedeceğim.
Öncelikle şunu belirteyim; Vereceğim fonksiyonu gmail.com uzantılı maillerinizde kullanabileceğiniz gibi Google 'ın Apps hizmetlerinden faydalanıyorsanız da aynı şekilde kullanabilirsiniz. Google Apps le ilgili ayrıntılı bilgi için şuraya, fiyat listesi için de şuraya tıklayıp inceleyebilirsiniz. 10 kullanıcıya kadar ücretsiz bir hizmet (şimdilik)*.




Mail gönderme fonksiyonumuz şu şekilde:

function MailGonderGmailSMTP($kime,$konu,$mesaj)
    {
       require "class.phpmailer.php";
       $mail=new PHPMailer();
       $mail->IsSMTP();
       $mail->SMTPDebug = 1;
       $mail->SMTPAuth = true;
       $mail->Host = "ssl://smtp.gmail.com";
       $mail->Port = 465;
       $mail->Username="kullaniciadi@gmail.com";
       $mail->Password="Parolaniz";
       $mail->From="kullaniciadi@gmail.com";
       $mail->FromName="SERHAT EYİŞEKERCİLER";
       $mail->CharSet="utf-8";
       $mail->AddAddress($kime);
       $mail->Subject=$konu;
       $mail->IsHTML(true);
       $mail->Body=$mesaj;
       if($mail->Send()) return true;
          else echo $mail->ErrorInfo;
    }
Şimdi diyorsunuz ki; tamam kırmızı alanları anladık, oraları kendi bilgilerimize göre değiştireceğiz de değişik renkli alan ne için?

Bu fonksiyonu kullanırken iki sorunla karşılaştım: Birincisi Gmail sunucusuna kullanıcıadımı ve şifremi doğru olarak göndermeme rağmen nedense beni pek tınlamıyordu. İkincisi ise gmail SSL ile çalıştığı için sunucuda açık olması gereken bir ayarın kapalı olduğunu farkedene kadar baya cebelleştim.

1. Problem: Gmail sunucusuna kimlik bilgilerim ulaşmıyor:
Aslında şu anda yazdığım fonksiyonda bu problem yaşanmıyor. Ama belki karşılaşırsınız diye paylaşmak istiyorum. Bende sizin gibi bu fonksiyonu sağdan soldan baya araştırdım. Bundan çok az farklı olan bir fonksiyon web sitelerinde dönüp duruyor. Tek farklı kısmı şurası:
 $mail->SMTPSecure = "ssl";
 $mail->Host = "smtp.gmail.com";
Şimdi burada gördüğünüz gibi pek bir fark yok. SMTPSecure diye bir özelliğe "ssl" şeklinde değer atanmış. İşin ilginç yanı bu böyle de çalışıyor :) Ama sadece yerel de (localhost) çalışıyor. Benim gibi Cloud server üzerine atarsanız şöyle bir hata çıktısı veriyor:
SMTP -> ERROR: HELO not accepted from server:
SMTP -> ERROR: AUTH not accepted from server:
SMTP Error: Could not authenticate
Çözüm: Fonksiyonu verdiğim şekliyle kullanırsanız problem yaşamazsınız.

2. Problem: Gmail 'in SSL kullanıyor olması:
Madde başlığını Gmail 'in SSL kullanıyor olması sanki problemmiş gibi yazmışım:)
Bu fonksiyonun normal kullandığınız mail gönderme fonksiyonundan farklı olduğunu zaten yukarıda da görüyorsunuz. SSL devreye girmiş, haliyle port 465 olarak değişmiş.
phpinfo(); çıktısında aşağıdaki ifadeyi görebiliyorsanız problem yok demektir:
Ama phpinfo(); çıktısı şu şekilde ise: (En alt satıra dikkat!)

O zaman bir ayar yapmanızın zamanı gelmiş demektir.
Çözüm: Eğer ulaşabiliyorsanız kendiniz, hosting firmanız sizin müdahalenize izin vermiyorsa da onlardan şunu yapmalarını isteyin:
php.ini dosyasının açılıp
;extension=php_openssl.dll
Satırının aktif hale getirilmesi gerekiyor. Yani başındaki ; işaretinin kaldırılması gerekiyor.
Dosya içinde bu satır kaçıncı satıra denk geliyor bilmiyorum. Küçük bir arama (Ctrl+F) yapıp hemen bulabilirsiniz.

"Ben bunları yaptım ama hâlâ gmail sunucusunu kullanan, php üzerindeki mail formum çalışmıyor" diyorsan yorum alanını kullanıp bunu dile getir. Bakalım çözebiliyor muyuz?

Kolay gelsin.

* Google Apps Artık Ücretli

6 yorum:

Yasin Gümüş dedi ki...

Bu kodu kullandım 500 internal server hatası veriyor

Serhat Eyişekerciler dedi ki...

Yasin Bey, biraz daha detaylı karşılaştığınız hatayı açıklayabilirseniz belki yardımcı olabilirim.

Mahmut dedi ki...

merhaba buradakileri aynen uyguladım
could not connect to SMPT .... Server(s) şeklinde bir hata veriyor.
gmail kullanıcı adı ve şifrem doğru
ayarlarımıda yaptım

Adsız dedi ki...

SMTP -> ERROR: Failed to connect to server: Unable to find the socket transport "ssl" - did you forget to enable it when you configured PHP? (30917472)
The following From address failed: *@gmail.com : Called Mail() without being connected The following From address failed: *@gmail.com : Called Mail() without being connected
hatası alıyorum çok fazla kod denedim ama bulamadım yardımcı olursanız sevinirim

Serhat Eyişekerciler dedi ki...

Merhaba siz "class.phpmailer.php" class ını eklediniz mi. http://yazilimnotum.blogspot.com/2012/09/php-ile-mail-gonderimi-smtp.html bölümünde bu konuya değinmiştim.

Serhat Eyişekerciler dedi ki...

Hala aynı hatayı alıyor musunuz? iletisim.php dosyanızı s.eyisekerciler@gmail.com adresine incelemem için gönderebilirsiniz.