Laravel Imap ile Gelene Mailleri Listeleme

Laravel Imap ile Gelene Mailleri Listeleme

Laravel Imap ile Gelene Mailleri Listeleme

Bazen projelerimiz de domainimize ait açtığımız mail adresindeki posta kutusunu listelemek isteyebiliriz. Benim de son yapmış olduğum projemde böyle bir ihtiyaç oluştu ve araştırmaya başladım. Maalesef Türkçe kaynak bulmak çok zor, sadece bir sitede buldum ve o da Gmail üzerinden çalışıyordu. Bana lazım olan ise sunucunun bize sağlamış olduğu SMTP destekli maildi.


Laravel kütüphanelerini aratırken GitHub'ta Laravel/Webklex Imapkütüphanesiyle karşılaştım ve dokümanı okuduktan sonra projeme entegre etmeye başladım. Şimdi sizlerle de bu işlemleri nasıl yapacağız onu anlatacağım. İlk olarak yapmamız gereken composer kullanarak kütüphanemizi projemize dahil ediyoruz.


ADIM 1 : Projemize Kütüphaneyi Dahil Ediyoruz
composer require webklex/laravel-imap
ADIM 2 : Config Dosyamızda Providers ve Aliases Ayarlarımızı Giriyoruz
Webklex\IMAP\Providers\LaravelServiceProvider::class,
'Client' => Webklex\IMAP\Facades\Client::class,
ADIM 3 : Vendor İşlemimizi Yapıyoruz
php artisan vendor:publish --provider="Webklex\IMAP\Providers\LaravelServiceProvider"



Buraya kadar başarılı bir şekilde geldiysek bundan sonrası kütüphanedeki kodları kendimize göre değiştirip nasıl kullanacağımıza karar vermek. Ben projem gereği gelen mailleri oluşturmuş olduğum veri tabanına kayıt ettim. Böylece okundu, okunmadı bilgisini, gönderilen ve silinen mesajları aynı zamanda yanıtla ve ilet butonlarını koyarak gerçek bir mail alt yapısı oluşturmuş oldum. Sizler daha farklı şekilde farklı sistemler oluşturabilirsiniz.

ADIM 4 : Controller Oluşturuyoruz
php artisan make:controller MailBoxController
ADIM 5: Route Ayarlarımızı Yapıyoruz
// Mailbox Menüsü
      Route::group(['prefix' => 'mailbox'], function () {
        Route::match(['GET','POST'],'/','MailBoxController@gelenKutusu')->name('gelenKutusu'); 
    });
ADIM 6 : Controller Fonksiyonumuzu Yazıyoruz
 public function gelenKutusu()
    {
        $client = \Webklex\IMAP\Facades\Client::make([
            'host'          => 'mail.example.com',
            'port'          => 993,
            'encryption'    => 'ssl',
            'validate_cert' => true,
            'username'      => 'info@example.com',
            'password'      => 'eray1907',
            'protocol'      => 'imap'          
        ]);
        $client->connect();
        $folders = $client->getFolders();
        
        foreach($folders as $folder){            $messages = $folder->search()->since(\Carbon\Carbon::now()->subDays(14))->get();
            
            foreach ($messages as $message) {
               $id =   $message->getUid();
               $mailler = MailBoxModel::where('getUid',$id)->first();
               @$getUid = $mailler->getUid;
               if ($id == $getUid) {
                 $mailler = MailBoxModel::where('type','Gelen')->where('is_delete',0)->get();
               }               else {
                  $mailler = MailBoxModel::create([
                     'getUid' => $id,
                     'is_read' => 0,
                     'type' => "Gelen",
                     'getSubject' => $message->getSubject(),                     'getFrom' => $message->getFrom()[0]->mail,
                     'getAttachments' => $message->getAttachments()->count(),                     'getDate' => $message->getDate(),                     'getHtmlBody' =>  $message->getHtmlBody(),                 ]);
               }              
            }            return view('mailbox.gelen-kutusu',compact('mailler','okunmayanMesaj'));          
        }    }
  • IMAP tanımlarımızı kendi mail ayarlarımıza göre yaptıktan sonra mail sunucumuza bağlanıyoruz.
  • 2 kere foreach döngüsü kullanmamın sebebi yazının başında belirttiğim gibi veri tabanına kaydetmem. 2. döngüm bana gelen getUid değerinin veri tabanımda olup olmadığını sorguluyor böylece her seferinde veri tabanına kayıt atmamış oluyoruz. Sadece yeni gelen mailler ekleniyor ve oluşturduğumuz veri tablosuna kayıt ederken is_read değerini 0 vererek mesajın daha okunmadı bilgisini son kullanıcıya gösteriyoruz. Siz daha farklı sistemler oluşturabilirsiniz.