Laravel ile Email Gönderimi 101

Makale İçerik Listesi

1. Konfigrasyon - Amazon SES

  1. Öncelikle Email servisi için Amazon SES kullanacağız ve onun konfigüre edilmesi lazım. Bunun için AWS console'umuza giriyoruz. link
  2. Burada sol taraftaki menü seçeneklerinden Verified Identities üzerinden hem domain hem de email doğrulaması yapmamız gerekecek.
  3. Create Identity diyerek Email ve Domain doğrulaması yapıyorum.
  4. Domain doğrulaması yaparken ilgili DKIM kodlarını hosting sağlayıcımda CNAME ve istersem TXT alanlarına belirtildiği şekilde ekliyorum.
  5. Doğrulandıktan sonra bir test maili gönderebilirsin. Senaryo tab'inde custom diyerek kendi belirlediğin bir mail adresine mail atabilirsin.
  6. Şimdi bu hesap için bir de IAM Kullanıcısı açmamız lazım - link adresinden Add User diyerek yeni kullanıcı oluşturuyorum.
  7. Kullanıcı adına domain_ses diyebilirim. Sonrasında alttaki Access Key - Programmatic Access seçeneğini işaretlemem lazım. Next: Permissions diyerek ilerliyorum.
  8. İzinler sayfasın üstte bulunan 3. seçenek olan Attach existiong policies directly e basıyorum ve AmazonSESFullAccess'i aratıyorum. Bunu seçiyorum ve Next -> Next diyerek ilerliyorum.
  9. Create User diyerek kullanıcıyı oluşturuyorum.
  10. Bu oluşturduğun kullanıcıyı Laravel App'te kullanacaksın. O yüzden Access ID ve Secret'ını Laravel uygulamasında ENV dosyasına eklemen lazım. 
    SES_KEY=A****
    SES_KEY_SECRET=X*****
  11. Domain'i verify ettiğin region'ı da ayrıca bu ENV'ye eklemen gerekiyor. 
    SES_REGION=eu-central-1

2. Konfigrasyon - Laravel App

  1. Bunu yaptıktan sonra Gmail emailini Laravel uygulamanda kullanmak için bir uygulama şifresi alman lazım. Onun nasıl alındığını şu makalede bulabilirsin.
  2. İlk olarak yapmamız gereken Guzzle HTTP kütüphanesini yüklememiz lazım. 
    composer require guzzlehttp/guzzle
  3. Amazon SES'i kullanmak için sonra Amazon AWS SDK for PHP kurulu olması lazım 
    composer require aws/aws-sdk-php
  4. Sonra config/mail.php içerisinde default seçeneğini ses olarak değiştir. 
    'default' => env('MAIL_MAILER', 'ses'),

    .env dosyasında da MAIL_MAILER'ı ses olarak belirt 

    MAIL_MAILER=ses
  5. config/mail.php'deki ses değerlerini aşağıdaki gibi olduğunu kontrol et
    'ses' => [
       'transport' => 'ses',
    ],
  6. config/services.php dosyasında da ses servisine gerekli olan access_id, secret ve region bilgileri olsun. 

    'ses' => [
        'key' => env('SES_KEY'),
        'secret' => env('SES_KEY_SECRET'),
        'region' => env('SES_REGION', 'us-east-1'),
    ],

    tabii bu değerlerin karşılığı env dosyasında olmalı

    SES_KEY=A*****
    SES_KEY_SECRET=B******
    SES_REGION=eu-***-9

3. Basit Email Oluşturma

  1. Laravel'de Mail oluşturmak için şu command kullanılır. ör. OrderShipped
    php artisan make:mail
  2. Ama PHP sınıfı + Markdown mail'i de eş zamanlı oluşturmak istersen şu şekilde yazman yeter 
    php artisan make:mail TryMail --markdown=emails.trymail
  3. Mailable class dosyasındaki en önemli yer build() metodu. Burada maili gönderirken şimdilik sadece bir de konu belirtelim. 
    public function build()
    {
        return $this->subject('Deneme 1 2 3')->markdown('emails.trymail');
    }
  4. Controller'dan mail göndermek ise en basit şekilde ekranda bir buton ile trigger edildiğini düşünürsek şöyle olur. Mesela index.blade.php'de şöyle bir formumuz var. 
    @if(session()->has('message'))
        <div class="alert alert-success">
            {{ session()->get('message') }}
        </div>
    @endif
    
    <form action="{{ route('mail') }}" method="post">
       @csrf
       <input type="submit" class="btn btn-danger" value="Email gönder">
    </form>

    burada belirtildiği gibi bir POST ROUTE'ımız olduğunu varsayarsak 

    Route::post('/email-deneme', [MainController::class, 'mail'])->name('mail');
  5. Buna göre Controller'da da şu şekilde Mail gönderme işlemini yaparız. 
    use Illuminate\Support\Facades\Mail;
    
    public function mail(Request $request)
    {
        Mail::to('[email protected]')->send(new TryMail());
    
        return back()->with('message', 'Email gönderildi.');
    }

Emailde Tablo ile gösterim

  1. @component('mail::table')
    | Öğrenci               | Table                 | Example                        |
    | --------------------- |:---------------------:| ------------------------------:|
    | {{ $student->name }}  | {{ $student->email }} | {{ $transaction->paid_price }} |
    @endcomponent
    

Referanslar

  1. Laravel 8 Docs for Mail - link
  2. Laravel Pre-Build components for Markdown Mailables - link
  3. Amazon SES ve Laravel Konfigrasyonu Responsive Email - link