Laravel 5 ve Sendgrid ile E-posta Gönderimi

Nelere dikkat etmelliyim?

1 yıl önce laravel etiketinde yazıldı.

22 Şubat 2016 tarihine kadar projelerimin e-posta gönderimi olanlarının çoğunda e-posta servisi olarak Mandrill kullanmayı tercih ettim. Mandrill bu tarihte deklare ettiği sözleşme değişikliği ile altmış gün içinde ücretli bir Mailchimp hesabın olmayan kullanıcıların hesabını durduracağını bildirdi.

Alternatif olarak bazı projelerimde ise Github Öğrenci Paketi‘nin hediyesi olan Sendrid’i kullandım. Sendgrid bize şu özellikte bir hizmet sunuyor: Öğrenci planı, eğer öğrenci iseniz aylık 15.000 ücretsiz e-posta veriyor (normalde günde 200 ücretsiz e-posta).

Sendgrid ile bir SMTP aracılığı ve 587 portu üzerinden Laravel ile e-posta gönderimi yapacağız, bu ise son derece kolay ve keyifli olacak.

Laravel 5 projenizin app/config/mail.php dosyasını incelediğinizde e-posta gönderimine ilişiklin yapılandırma dosyası için aşağıdakine benzer bir görüntü ile karşılaşacaksınız (makalede az yer kaplaması için yorum satırlarını çıkardım):

<?php

return [

    'driver'     => env('MAIL_DRIVER', 'smtp'),
    'host'       => env('MAIL_HOST', 'smtp.mailgun.org'),
    'port'       => env('MAIL_PORT', 587),
    'from'       => ['address' => env('MAIL_FROM'), 'name' => env('MAIL_NAME')],
    'encryption' => env('MAIL_ENCRYPTION', 'tls'),
    'username'   => env('MAIL_USERNAME'),
    'password'   => env('MAIL_PASSWORD'),
    'sendmail'   => '/usr/sbin/sendmail -bs',
    'pretend'    => false,

];

Sendgrid e-posta gönderimi yaparken kullanıcı adımızı ve şifremizi girmeyi gerektirir, ben ise geleneksel olarak şifrelerin dosyalara doğrudan yazılmasını yanlış bulurum, yani en azından açık olarak. Bu münasebetle çok basit bile olsa bir şifreleme ile şifremizi görünür olmaktan alıkoyacağız.

Base64 encode ve decode edilebilir son derece basit bir kripto yöntemidir. Biz burada şifremizi şifreleyecek ve php tarafından açılacak halini Sendgrid’e sunacağız. Öncelikle Base64 Decode and Encode - Online sitesinden ilk kutucuğa Sendgrid şifremizi yazalım ve > ENCODE < butonuna basalım. Ç0kKarma$Lkßir$ifre değişkeni için karşılık olarak w4cwa0thcm1hJExrw59pciRpZnJl değişkenini üretecek. Ardından e-posta yapılandırma dosyanızı aşağıdaki gibi güncelleyin.

<?php

return [
    'driver' => 'smtp',
    'host' => 'smtp.sendgrid.net',
    'port' => 587,
    'from' => array('address' => '[email protected]', 'name' => 'Gönderici İsmi'),
    'encryption' => 'tls',
    'username' => 'SendGrid Kullanıcı Adınız',
    'password' => base64_decode('w4cwa0thcm1hJExrw59pciRpZnJl'),
    'sendmail' => '/usr/sbin/sendmail -bs',
    'pretend' => false,
];

Laravel standart olarak bu yapılandırma anahtarlarını .env dosyasında alacağını varsayacak şekilde env(‘MAIL_DRIVER’, ‘smtp’) biçiminde ayarlanmıştır. Bu, şu demektir; MAIL_DRIVER değişkeni .env dosyasında tanımlı ise onu tercih et, yoksa smtp olarak tanımla. Biz ise burada bu tip tanımlamayı ezmiş olduk, siz dilerseniz kendinize uygun biçimde yapılandırabilirsiniz.

Sendgrid için gerekli olan tüm parametreleri yapılandırdık, uygulamamız şu anda e-posta gönderimine uygun. Basit bir rota yazarak e-posta gönderelim:

Route::get('/eposta', function() 
{
    $data = ['ad' => 'Tuana Şeyma', 'soyad' => 'Eldem'];

    Mail::send('emails.gunaydin', $data, function($message) use($data)
    {
        $message->to('[email protected]', $data['ad'])
        ->subject('Günaydın Kızım!')
        ->replyTo('[email protected]', 'Sinan Eldem');
    });
});

Burada Mail sınıfının send metoduna geçtiğimiz ilk parametre kullanılacak görünüm dosyasıdır (view), onu birazdan yapılandıracağız. İkinci parametre $data dizisidir ve bu e-posta görünüm dosyasına veri geçirmek için kullanılır. Üçüncü parametre anonim e-posta nesnesidir, gönderim işlemi burada gerçekleşir. Dördüncü parametre olan use ise tercihe bağlıdır, aşağıda Alıcının İsmi parametresini geçmek için kullandım.

$message->to('[email protected]', $data['ad'])

E-posta alıcısını tanımladığımız satır budur, ilk parametre Alıcı E-posta Adresi ikinici parametre ise tercihe bağlı Alıcı İsmi‘dir.

->subject('Günaydın Kızım!');

Satırı ile e-postamıza bir konu tanımlarız.

Son olarak e-posta göndericisi ile yanıtlayacak adresin farklı olması durumunda tercih edilecek replyTo seçeneğini de burada tanımlarız. Tercihe bağlıdır.

->replyTo('[email protected].tr', 'Sinan Eldem');

Burada replyTo metoduna geçtiğimiz Gönderici İsmi tercihe bağlıdır.

Buraya kadar her şey tamam, şimdi e-posta gönderimi için görünüm dosyamızı oluşturalım.

resources/views/emails/ dizininde gunaydin.blade.php dosyasını oluşturup içeriğini aşağıdaki gibi ayarlayın:

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>E-posta Denemesi</title>
    </head>

    <body>
        Günaydın Sevgili {{ $ad }} {{ $soyad }},
        <br>
             Gününün aydın olmasını dilerim.
        <br>
        Sevgiler,
        <br>
        -Baban
    </body>
</html>

Göreceğiniz üzere $data dizisi ile gönderdiğimiz değişkenler buraya doğrudan aktarıldı.

Artık projemiz e-posta gönderimine hazır, tarayıcınızı http://projenizinadr.esi/eposta adresine yönlendirin ve bekleyin. Bu işlem internet bağlantı hızınıza bağlı olarak birkaç saniye sürebilir.

Haydi e-posta istemcisini açıp mesajınızı denetleyin:

E-posta Önizleme

İşlem tamam!