Laravel Incoming Emails
Tags: laravel, istanbulphp, php
Published: 2021-12-20 11:36:22

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](https://github.com/beyondcode/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.

```bash
composer required beyondcode/laravel-mailbox
```

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

```bash
php artisan vendor:publish --provider="BeyondCode\Mailbox\MailboxServiceProvider" --tag="migrations"
```
```bash
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.
```bash
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:
```php
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 sender@domain.com, InboundEmailHandler class will working
		// InboundEmailHandler is a Invokable Class
		Mailbox::to('sender@domain.com', InboundEmailHandler::class);
        
	        // You can use like this.
		Mailbox::to('sender@domain.com' 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.
```php
// 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);
    }
}
```

```php
// 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.