Laravel Incoming Emails

Herkese merhaba! Bu yazı da laravel içerisinde gelen emailleriniz nasıl handle edebileceğiniz inceleyeceğiz. Bunu için laravel'de BeyondCode tarafından açık kaynak olarak geliştirilmiş laravel-mailbox paketini kullanacağız.

Not: laravel-mailbox paketini kullanmadan önce bilmelisiniz ki paketin desteklediği servisler mailgun, postmark ve sendgrid servisleridir.

laravel-mailbox paketini laravel projenize eklemek için aşağıdaki komutu kullanabilirsiniz.

composer required beyondcode/laravel-mailbox

laravel-mailbox paketinin kullanımı ve konfigürsayon işlemleri için publish işlemi yapılması gerekiyor.

php artisan vendor:publish --provider="BeyondCode\Mailbox\MailboxServiceProvider" --tag="migrations"
php artisan vendor:publish --provider="BeyondCode\Mailbox\MailboxServiceProvider" --tag="config"

Ardından paket için gerekli tablonun oluşturulması için migration dosyasını çalıştırmanız gerekmektedir.

php artisan migrate

Paketin kurulumu bittikten sonra temel kullanımı inceleyelim.
Paket kullanımı için AppServiceProvider içerisine hangi email adresini hangi sınıf ile handle edeceğinizi belirtmeniz gerekmektedir.
Örnek:

use BeyondCode\Mailbox\InboundEmail;
use BeyondCode\Mailbox\Facades\Mailbox;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return  void
     */
    public function boot()
    {
        // when send email someone to [email protected], InboundEmailHandler class will working
        // InboundEmailHandler is a Invokable Class
        Mailbox::to('[email protected]', InboundEmailHandler::class);

            // You can use like this.
        Mailbox::to('[email protected]' function (InboundEmail $email) {
                // InboundEmail some available methods
                $id = $email->id();
                $date = $email->date();
                $html = $email->html();
                $text = $email->text();
                $subject = $email->subject();
                $from = $email->from();
                // Handle incoming email
        });
    }
}

laravel-mailbox paketini gerçek bir kullanımda inceleyelim.
Örneğin kullanıcı özelinde gelen emailler ile görev oluşturmak istiyor olalım.
Bunun için kullanıcıların her biri için ayrı email adresi olması gerekmektedir. Kullanıcılar için bunun isim - soyisim - rastgele bir değer (ahmet-korkmaz-adas76fa87dfa) olarak düşünelim. Bunun için users tablonuza yeni bir sütun oluşturmanız gerekmektedir. Bu durumun hazır olduğunu düşünerek mailbox ile ilgili kodlarımızı yazmaya başlayalım.

// AppServiceProvider.php

use BeyondCode\Mailbox\Facades\Mailbox;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return  void
     */
    public function boot()
    {
        // You can use userEmail as a variable in CreateTaskHandler invoke method.
        Mailbox::from('{userEmail}@domain.com', CreateTaskHandler::class);
    }
}
// app/InboundEmails/CreateTaskHandler.php

namespace App\InboundEmails;

use BeyondCode\Mailbox\InboundEmail;

class CreateTaskHandler {
        public function __invoke(InboundEmail $email, $userEmail)
        {
            $user = User::where('inbound_email', $userEmail)->first();

            if ($user) {
                $task = $user->tasks()->create([
                    'title' => $email->subject(),
                    'description' => $email->text(),
                ]);

                // $email->cc() return array and you can attach cc users to task users
                $task->users()->attach($email->cc());
            }
        }
}

Sonuç olarak, laravel-mailbox paketini kullanarak gelen emailleri handle etmek çok kolay. Buna ek olarak task oluşturduktan sonra kullanıcıya success maili reply edebilirsiniz.

13