آموزش کار با ایمیل در لاراول

آموزش لاراول وبلاگ وبلاگ آموزشی

آموزش کار با ایمیل در لاراول

با سلام ، امروز با یک آموزش کاربردی برای لاراول در خدمت شما هستیم. اگر شماهم مثل خود بنده به لاراول علاقه داشته باشید پس این آموزش رو دنبال کنید!…

توسط علی مسعودخواه
-- آخرین بروزرسانی : ۱۷-۰۴-۱۳۹۸
-- بازدیدها : ۲۱
اشتراک گذاری در :
امتیازدهی به مطلب :
2+

با سلام ، امروز با یک آموزش کاربردی برای لاراول در خدمت شما هستیم. اگر شماهم مثل خود بنده به لاراول علاقه داشته باشید پس این آموزش رو دنبال کنید! ما در این آموزش نجوه کار با ایمیل و ارسال ایمیل در لاراول را به شما خواهیم آموخت.

لاراول یک API ساده و روان مبتنی بر کتابخانه محبوب SwiftMailer همراه با درایورهای SMTP، Mailgun، SparkPost، Amazon SES و sendmail ارائه می‌کند که به شما این امکان را می‌دهد تا بتوانید به صورت سریع ایمیل خود را از طریق سرویس محلی یا سرویس ابری بسته به انتخاب خود ارسال کنید.

پیش نیازهای درایور ارسال ایمیل در لاراول


درایورهای مبتنی بر API مانند Mailgun و SparkPost اغلب ساده‌تر و سریع‌تر از سرورهای SMTP هستند. در صورت امکان، شما باید از یکی از این درایورها استفاده کنید. همه درایورهای API نیاز به کتابخانه HTTP Guzzle دارند که می‌توانید از طریق مدیر پکیج‌های کامپوزر آن را نصب کنید:

composer require guzzlehttp/guzzle

 

درایور Mailgun


برای استفاده از درایور Mailgun ابتدا باید Guzzle را نصب کنید. سپس، گزینه driver را در فایل پیکربندی config / mail.php خود را به mailgun تنظیم کنید. پس از آن، مطمئن شوید که فایل پیکربندی config/services.php شامل گزینه‌های زیر است:

'mailgun' => [
'domain' => 'your-mailgun-domain',
'secret' => 'your-mailgun-key',
],

اگر از منطقه US” Mailgun” استفاده نمی‌کنید، می‌توانید منطقه خود را در فایل پیکربندی services تعریف کنید:

'mailgun' => [
'domain' => 'your-mailgun-domain',
'secret' => 'your-mailgun-key',
'endpoint' => 'api.eu.mailgun.net',
],

 

درایور SparkPost


برای استفاده از درایور SparkPost، ابتدا Guzzle را نصب کنید. سپس، گزینه driver را در فایل پیکربندی config / mail.php خود را به sparkpost تنظیم کنید. پس از آن، مطمئن شوید که فایل پیکربندی config/services.php شامل گزینه‌های زیر است:

'sparkpost' => [
'secret' => 'your-sparkpost-key',
],

در صورت لزوم، شما می‌توانید مشخص کنید که از کدام API endpoint باید استفاده شود:

'sparkpost' => [
'secret' => 'your-sparkpost-key',
'options' => [
'endpoint' => 'https://api.eu.sparkpost.com/api/v1/transmissions',
],
],

درایور SES


برای استفاده از درایور Amazon SES ابتدا باید Amazon AWS SDK را برای PHP نصب کنید. می‌توانید این کتابخانه را با اضافه کردن خط زیر به قسمت require در فایل composer.json خود و اجرای دستور c omposer update نصب کنید:

"aws/aws-sdk-php": "~3.0"

سپس، گزینه driver را در فایل پیکربندی config/mail.php خود را به ses تنظیم کنید و مطمئن شوید که فایل پیکربندی config/services.php شما شامل گزینه‌های زیر است:

'ses' => [
'key' => 'your-ses-key',
'secret' => 'your-ses-secret',
'region' => 'ses-region', // e.g. us-east-1
],

اگر در هنگام اجرای درخواست SendRawEmail در SES نیاز به گزینه‌های اضافی بیشتری داشته باشید، می‌توانید یک آرایه options را در پیکربندی ses خود تعریف کنید:

'ses' => [
'key' => 'your-ses-key',
'secret' => 'your-ses-secret',
'region' => 'ses-region', // e.g. us-east-1
'options' => [
'ConfigurationSetName' => 'MyConfigurationSet',
'Tags' => [
[
'Name' => 'foo',
'Value' => 'bar',
],
],
],
],

 

ایجاد Mailables برای ارسال ایمیل در لاراول


در فریم ورک لاراول، هر نوع ایمیل ارسال شده توسط برنامه شما به عنوان یک کلاس”mailable” نمایش داده می‌شود. این کلاس‌ها در دایرکتوری app/Mail ذخیره می‌شوند. در صورتی که این پوشه را در برنامه خود مشاهده نمی‌کنید، نگران نباشید، زیرا این دایرکتوری زمانی که اولین بار کلاس makeable خود را با استفاده از دستور make:mail ایجاد می‌کنید در برنامه شما ایجاد خواهد شد:

php artisan make:mail OrderShipped

 

نوشتن Mailables


تمام پیکربندی کلاس Mailable در متد build انجام می‌شود. در این متد، می‌توانید متدهای مختلفی از قبیل from ، subject ، view و attach را جهت پیکربندی ارائه و تحویل ایمیل‌های خود فراخوانی کنید.

پیکربندی فرستنده (Sender)


با استفاده از متد from

ابتدا، اجازه دهید پیکربندی فرستنده ایمیل (sender) را انجام دهیم. در واقع، می‌خواهیم از طریق “from” مشخص کنیم که چه کسی این ایمیل را فرستاده است. دو متد برای پیکربندی فرستنده ایمیل وجود دارد. متد اول این است که شما می‌توانید از متد from درون متد build در کلاس mailable خود استفاده کنید:

/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->from('example@example.com')
->view('emails.orders.shipped');
}

 

استفاده از یک آدرس from عمومی

اگر برنامه شما از یک آدرس‌ “from” برای تمام ایمیل‌های خود استفاده می‌کند، فراخوانی متد from از هر کلاس Mailable که تولید می‌کنید، می‌تواند کمی مشکل باشد. به جای آن، می‌توانید آدرس عمومی “from” را در فایل پیکربندی  config/mail.php خود مشخص کنید. این آدرس در صورت استفاده نکردن از آدرس دیگری در داخل کلاس mailable مورد استفاده قرار می‌گیرد:

'from' => ['address' => 'example@example.com', 'name' => 'App Name'],

علاوه بر این، شما می‌توانید یک آدرس “reply_to” عمومی را نیز در فایل پیکربندی config / mail.php خود تعریف کنید:

'reply_to' => ['address' => 'example@example.com', 'name' => 'App Name'],

 

پیکربندی View


در متد build کلاس mailable، می‌توانید از متد view استفاده کنید تا بتوانید از طریق آن مشخص کنید که کدام قالب در هنگام رندر کردن محتویات ایمیل مورد استفاده قرار گیرد. معمولا هر ایمیل از قالب Blade برای رندر کردن محتویات خود استفاده می‌کند. در صورت استفاده از موتور قالب ساز Blade، در زمان ایجاد HTML ایمیل خود، قدرت و راحتی کار بیشتری خواهید داشت.

/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('emails.orders.shipped');
}

ممکن است بخواهید یک دایرکتوری resources/views/emails ایجاد کنید تا تمام قالب‌های ایمیل خود را در آن قرار دهید؛ با این حال، می‌توانید آن‌ها را در هر جایی که درون دایرکتوری resources/views خود قرار دهید.

ایمیل‌های متن ساده (Plain Text)


اگر بخواهید یک نسخه ساده (plain-text) ایمیل خود را تعریف کنید، می‌توانید از متد text استفاده کنید. مانند متد view، متد text یک نام قالب را که برای رندر کردن محتویات ایمیل استفاده می‌شود را می‌پذیرد. شما می‌توانید هم HTML و هم نسخه متن ساده (plain-text) پیام خود را تعریف کنید:

/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('emails.orders.shipped')
->text('emails.orders.shipped_plain');
}

مشاهده داده‌ها (View Data)


از طریق خصوصیات عمومی

گاهی اوقات، ممکن است بخواهید برخی از داده‌ها را به ویوی خود منتقل کنید که می‌توانید از آن‌ها در هنگام رندر کردن HTML ایمیل خود استفاده کنید. دو متد برای انتقال داده‌ها به view وجود دارد. متد اول این است که هر پراپرتی عمومی که در کلاس mailable تعریف شده است به صورت خودکار در view قابل دسترسی خواهد بود. بنابراین به عنوان مثال، شما می‌توانید داده‌ها را به سازنده کلاس mailable خود منتقل کنید و این داده‌ها را به خصوصیات عمومی تعریف شده در کلاس تنظیم کنید:

<?php

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class OrderShipped extends Mailable {
    use Queueable, SerializesModels;

    /**
     * The order instance.
     *
     * @var Order
     */
    public $order;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct( Order $order ) {
        $this->order = $order;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build() {
        return $this->view( 'emails.orders.shipped' );
    }
}

زمانی که داده‌ها به عنوان یک خصوصیت عمومی تنظیم شد، به صورت خودکار در ویو شما قابل دسترسی خواهد بود. بنابراین، شما می‌توانید مانند هر داده دیگری در قالب Blade به آن دسترسی داشته باشید:

<div>
    Price: {{ $order->price }}
</div>

از طریق متد with


اگر بخواهید فرمت داده‌های ایمیل خود را پیش از ارسال به قالب خود سفارشی کنید، می‌توانید داده های خود را به صورت دستی و از طریق متد with به view منتقل کنید. در حالت معمول، شما همچنان داده‌های خود را از طریق سازنده کلاس “mailable” منتقل می‌کنید؛ با این حال، باید این داده‌ها را به خصوصیات protected یا private تنظیم کنید تا داده‌ها به صورت خودکار در قالب قابل دسترسی نباشند. سپس، در زمان فراخوانی متد with، آرایه‌ای از داده‌هایی را که می‌خواهید درون قالب قابل دسترسی باشند را منتقل کنید:

<?php

namespace App\Mail;

use App\Order;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class OrderShipped extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * The order instance.
     *
     * @var Order
     */
    protected $order;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct(Order $order)
    {
        $this->order = $order;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('emails.orders.shipped')
                    ->with([
                        'orderName' => $this->order->name,
                        'orderPrice' => $this->order->price,
                    ]);
    }
}

زمانی که داده‌های شما به متد with انتقال داده می‌شوند، به صورت خودکار در ویو شما قابل دسترس خواهند بود. بنابراین، شما می‌توانید مانند هر داده دیگری در قالب Blade به آن دسترسی داشته باشید:

افزودن پیوست (attachment)


برای افزودن پیوست به یک ایمیل، می‌توانید از متد attach در داخل متد build کلاس mailable استفاده کنید. متد attach مسیر کامل فایل را به عنوان اولین آرگومان دریافت می‌کند:

هنگام attach کردن فایل‌ها به یک پیام، می‌توانید نام نمایشی (display name) یا نوع MIME را با انتقال یک آرایه به عنوان آرگومان دوم به متد attach، مشخص کنید:

/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('emails.orders.shipped')
->attach('/path/to/file', [
'as' => 'name.pdf',
'mime' => 'application/pdf',
]);
}

پیوست فایل ها از دیسک


اگر شما یک فایل در یکی از دیسک‌های سیستم فایل خود ذخیره کرده‌اید، می‌توانید با استفاده از متد attachFromStorage آن را به ایمیل پیوست کنید:

/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('email.orders.shipped')
->attachFromStorage('/path/to/file');
}

در صورت لزوم، می‌توانید نام فایل پیوست شده و گزینه‌های اضافی را از طریق آرگومان‌های دوم و سوم به متد attachFromStorage منتقل کنید:

/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('email.orders.shipped')
->attachFromStorage('/path/to/file', 'name.pdf', [
'mime' => 'application/pdf'
]);
}

اگر نیاز به یک دیسک ذخیره سازی دیگر به غیر از دیسک پیش‌فرض خود دارید، می‌توانید از متد attachFromStorageDisk استفاده کنید:

/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('email.orders.shipped')
->attachFromStorageDisk('s3', '/path/to/file');
}

پیوست داده‌های خام


از متد attachData می‌توانید برای پیوست یک رشته خام از بایت‌ها به عنوان یک ضمیمه استفاده کنید. به عنوان مثال، اگر شما یک PDF را در حافظه ایجاد کرده‌اید، می‌توانید بدون نوشتن آن بر روی دیسک از طریق این متد آن را به ایمیل پیوست کنید. متد attachData بایت‌های داده خام را به عنوان اولین آرگومان، نام فایل را به عنوان آرگومان دوم و آرایه‌ای از گزینه‌‌ها را به عنوان آرگومان سوم خود دریافت می‌کند:

/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('emails.orders.shipped')
->attachData($this->pdf, 'name.pdf', [
'mime' => 'application/pdf',
]);
}

پیوست های درون خطی (Inline Attachment)


معمولا Embedding یا قرار دادن تصاویر به صورت inline در ایمیل‌ها کمی مشکل است؛ با این حال، لاراول یک راه حل مناسب برای پیوست تصاویر به ایمیل شما و بازیابی CID مناسب ارائه می‌کند. جهت قرار دادن یک تصویر inline، می‌توانید از متد embe d در متغیر $message در قالب ایمیل خود استفاده کنید. لاراول به صورت خودکار متغیر $message را در تمام قالب‌های ایمیل شما در دسترس قرار می‌دهد، بنابراین لازم نیست نگران انتقال آن به صورت دستی باشید:

<body>
    Here is an image:

    <img src="{{ $message->embed($pathToImage) }}">
</body>

متغیر message$ در پیام‌های markdown قابل دسترسی نیست.

embed کردن پیوست‌های داده خام


اگر در حال حاضر یک رشته داده خام دارید که می‌خواهید در قالب ایمیل خود قرار دهید (embed کنید)، می‌توانید از متد embedData در متغیر $ message خود استفاده کنید:

<body>
    Here is an image from raw data:

    <img src="{{ $message->embedData($data, $name) }}">
</body>

سفارشی کردن پیام SwiftMailer


متد withSwiftMessage کلاس پایه Mailable به شما امکان می‌دهد که یک فراخوان را ثبت کنید که با پیام SwiftMailer خام قبل از ارسال پیام فراخوانی می‌شود. این به شما امکان می‌دهد که پیام را قبل از تحویل سفارشی کنید:

/**
* Build the message.
*
* @return $this
*/
public function build()
{
$this->view('emails.orders.shipped');

$this->withSwiftMessage(function ($message) {
$message->getHeaders()
->addTextHeader('Custom-Header', 'HeaderValue');
});
}

استفاده از Markdown Mailables برای ارسال ایمیل در لاراول


پیام‌های Markdown mailable به شما امکان می‌دهند که از قالب‌های پیش ساخته و کامپوننت‌های اعلان ایمیل در mailableهای خود استفاده کنید. از آنجا که پیام‌ها در Markdown نوشته می‌شوند، لاراول قادر خواهد بود که قالب‌های HTML زیبا و پاسخگو را برای پیام‌ها رندر کند که به صورت خودکار یک plain-text متقابل تولید می‌کنند.

ایجاد Mailables Markdown

می‌توانید برای ایجاد یک mailable با یک قالب Markdown مربوط به آن از گزینه --markdown در دستور آرتیسان make:mail استفاده کنید:

php artisan make:mail OrderShipped --markdown=emails.orders.shipped

سپس، در هنگام پیکربندی Mailable درون متد build آن، به جای متد view متد markdown را فراخوانی کنید. متد markdown نام قالب Markdown و یک آرایه اختیاری از داده‌هایی که درون قالب قابل دسترسی خواهند بود را دریافت می‌کند:

/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->from('example@example.com')
->markdown('emails.orders.shipped');
}

نوشتن پیام های Markdown


Markdown mailableها از ترکیبی از کامپوننت‌های Blade و سینتکس Markdown استفاده می‌کنند که به شما امکان می‌دهد به راحتی پیام‌های ایمیل خود را در حین استفاده از کامپوننت‌های پیش ساخته لاراول ایجاد کنید:

@component('mail::message')
# Order Shipped

Your order has been shipped!

@component('mail::button', ['url' => $url])
View Order
@endcomponent

Thanks,

{{ config('app.name') }}
@endcomponent

هنگام نوشتن ایمیل‌های Markdown از نشانه‌های اضافی استفاده نکنید، زیرا ممکن است به عنوان بلاک‌های کد رندر شوند.

کامپوننت Button

کامپوننت Button یک لینک دکمه مرکزی را رندر می‌کند. این کامپوننت دو آرگومان می‌پذیرد، یک آرگومان URL و یک آرگومان color اختیاری. رنگ‌های پشتیبانی شده توسط این کامپوننت شامل primary ، success و error هستند. شما می‌توانید هر تعداد کامپوننت button که بخواهید را به یک پیام اضافه کنید:

@component('mail::button', ['url' => $url, 'color' => 'success'])
View Order
@endcomponent

کامپوننت Panel

کامپوننت panel بلوک مشخصی از متن را در یک پانل رندر می‌کند که رنگ آن کمی متفاوت از رنگ پس زمینه بقیه پیام است. این کامپوننت به شما این امکان را می‌دهد تا توجه خاصی به یک قسمت مشخص از متن داشته باشید:

@component('mail::panel')
This is the panel content.
@endcomponent

کامپوننت Table

کامپوننت Table این امکان را می‌دهد که بتوانید یک جدول Markdown را به یک جدول HTML تبدیل کنید. کامپوننت، جدول Markdown را به عنوان محتوای خود دریافت می‌کند. ترازبندی ستون جدول با استفاده از دستورالعمل پیش‌فرض جدول Markdown پشتیبانی می‌شود:

@component('mail::table')
| Laravel | Table | Example |
| ------------- |:-------------:| --------:|
| Col 2 is | Centered | $10 |
| Col 3 is | Right-Aligned | $20 |
@endcomponent

سفارشی کردن کامپوننت‌ها


شما می‌توانید تمام کامپوننت‌های ایمیل Markdown را جهت سفارشی کردن به برنامه خود ارسال کنید. برای ارسال کامپوننت از دستور آرتیسان vendor:publish برای پابلیش کردن laravel-mail تگ asset استفاده کنید.

php artisan vendor:publish --tag=laravel-mail

این دستور، کامپوننت‌های ایمیل Markdown را به دایرکتوری resources/views/vendor/mail پابلیش می‌کند. دایرکتوری mail شامل یک دایرکتوری html و یک دایرکتوری markdown است که هر کدام کامپوننت‌های قابل دسترس خود را ارائه می‌کنند. کامپوننت‌های موجود در دایرکتوری html برای تولید نسخه HTML ایمیل شما مورد استفاده قرار می‌گیرند و کامپوننت های موجود در دایرکتوری markdown برای تولید نسخه ساده متن (plain-text ) ایمیل مورد استفاده قرار می‌گیرند. شما می‌توانید این کامپوننت‌ها را هر صورت که بخواهید سفارشی کنید.

سفارشی کردن CSS

پس از ارسال کامپوننت‌ها، دایرکتوری resources / views / vendor / mail / html / themes دارای یک فایل default.css خواهد بود. در این فایل می‌توانید CSS خود را سفارشی کنید؛ در این صورت، استایل‌های شما به صورت خودکار در نمایش‌های HTML پیام‌های Markdown شما قرار می‌گیرند.

اگر بخواهید یک تم کاملا جدید برای کامپوننت‌های Markdown ایجاد کنید، یک فایل CSS جدید در داخل دایرکتوری html / themes بنویسید و گزینه theme را از فایل پیکربندی mail خود تغییر دهید.blockquote>

ارسال ایمیل در لاراول 


برای ارسال پیام ایمیل باید از متد to در facade Mail. استفاده کنید. متد to آدرس ایمیل، یک نمونه کاربر (user) یا یک مجموعه از کاربران را دریافت می‌کند. اگر یک شی یا مجموعه‌ای از اشیا (objects) را منتقل کنید، mailer به صورت خودکار از خصوصیات email و name آن‌ها در زمان تنظیم گیرنده‌های ایمیل استفاده می‌کند، پس مطمئن شوید که این خصوصیات در اشیاء شما موجود هستند. زمانی که گیرنده‌های خود را مشخص کردید، می‌توانید یک نمونه از کلاس mailable خود را به متد send ارسال کنید:

<?php

namespace App\Http\Controllers;

use App\Order;
use App\Mail\OrderShipped;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
use App\Http\Controllers\Controller;

class OrderController extends Controller
{
    /**
     * Ship the given order.
     *
     * @param  Request  $request
     * @param  int  $orderId
     * @return Response
     */
    public function ship(Request $request, $orderId)
    {
        $order = Order::findOrFail($orderId);

        // Ship order...

        Mail::to($request->user())->send(new OrderShipped($order));
    }
}

البته، در هنگام ارسال پیام شما فقط محدود به مشخص کردن گیرندگان با “to” نیستید. شما می‌توانید گیرنده‌های “to”، “cc” و “bcc” را نیز در فراخوانی متد به صورت زنجیره‌ای تنظیم کنید:

Mail::to($request->user())
->cc($moreUsers)
->bcc($evenMoreUsers)
->send(new OrderShipped($order));

رندر Mailables


گاهی اوقات، ممکن است بخواهید محتوای HTML یک mailable را بدون ارسال آن، دریافت کنید. برای انجام این کار، می‌توانید متد render را از mailable فراخوانی کنید. این متد محتویات ارزیابی شده mailable را به عنوان یک رشته باز می‌گرداند:

$invoice = App\Invoice::find(1);

return (new App\Mail\InvoicePaid($invoice))->render();

نمایش Mailableها در مرورگر

هنگام طراحی یک قالب mailable، بهتر است که بتوانید پیش نمایش ایمیل ارسال شده خود را مانند یک قالب Blade معمولی در مرورگر مشاهده کنید. به همین دلیل، لاراول به شما این امکان را می‌دهد که بتوانید هر mailable را مستقیما از یک route Closure یا یک کنترلر بازگردانید. زمانی که یک mailable باز گردانده می‌شود، رندر شده و در مرورگر نمایش داده می‌شود. این قابلیت به شما اجازه می‌دهد که بتوانید سریعا پیش نمایش قالب طراحی شده خود را بدون نیاز به ارسال آن به آدرس ایمیل واقعی مشاهده کنید:

Route::get('/mailable', function () {
$invoice = App\Invoice::find(1);

return new App\Mail\InvoicePaid($invoice);
});

صف بندی پیام‌های ایمیل در لاراول

از آنجا که ارسال پیام‌های ایمیل می‌تواند به صورت چشم‌گیری زمان پاسخ برنامه شما را افزایش دهد، بسیاری از توسعه دهندگان پیام‌های ایمیل را صف بندی می‌کنند تا در پس زمینه فرستاده شوند. لاراول این کار را با استفاده از unified queue API از پیش ساخته شده خود آسان می‌کند. برای صف کردن یک پیام ایمیل، پس از مشخص کردن گیرندگان پیام، باید از متد queue در facade Mail  استفاده کنید:

Mail::to($request->user())
->cc($moreUsers)
->bcc($evenMoreUsers)
->queue(new OrderShipped($order));

این متد به صورت خودکار مراقب قرار دادن یک job در صف است تا پیام در پس‌ زمینه ارسال شود. البته قبل از استفاده از این ویژگی باید صف‌های خود را پیکربندی کنید.

صف بندی پیام‌هایی که باید با تاخیر ارسال شوند

اگر بخواهید تحویل یک پیام ایمیل موجود در صف را به تاخیر بیاندازید، می‌توانید از متد later استفاده کنید. متد later به عنوان اولین آرگومان، یک نمونه DateTime را دریافت می‌کند که مشخص می‌کند که این پیام چه زمانی باید ارسال شود:

$when = now()->addMinutes(10);

Mail::to($request->user())
->cc($moreUsers)
->bcc($evenMoreUsers)
->later($when, new OrderShipped($order));

قرار دادن پیام‌ها در صف‌ های خاص

از آنجا که تمام کلاس‌های mailable ایجاد شده با استفاده از دستور آرتیسان make: mail از ویژگی Illuminate\Bus\Queueable استفاده می‌کنند، می‌توانید متدهای onQueue و onConnection را در هر نمونه کلاس mailable فراخوانی کنید که به شما اجازه می‌دهد که کانکشن و نام صف را برای پیام مشخص کنید:

$message = (new OrderShipped($order))
->onConnection('sqs')
->onQueue('emails');

Mail::to($request->user())
->cc($moreUsers)
->bcc($evenMoreUsers)
->queue($message);

صف بندی پیام های ایمیل به صورت پیش فرض

اگر کلاس‌های mailableای دارید که می‌خواهید همواره در صف قرار بگیرید، می‌توانید کنتراکت ShouldQueue را در کلاس پیاده سازی کنید. در حال حاضر، حتی اگر متد send را در زمان ارسال فراخوانی کنید، mailable همچنان در صف قرار می‌گیرد، زیرا این کنتراکت پیاده سازی شده است:

use Illuminate\Contracts\Queue\ShouldQueue;

class OrderShipped extends Mailable implements ShouldQueue
{
//
}

بومی سازی mailable برای ارسال ایمیل در لاراول


لاراول به شما این امکان را می‌دهد که بتوانید mailableهای خود را در یک زبان غیر از زبان فعلی ارسال کنید و حتی اگر این ایمیل در صف باشد نیز عملیات بومی سازی (Localizing) را انجام می‌دهد.

برای انجام این کار، facade Mail  یک متد locale را برای تعیین زبان مورد نظر ارائه می‌دهد. زمانی که mailable در حال فرمت شدن است و پس از فرمت کامل به زبان قبلی باز می‌گردد، برنامه می‌تواند زبان (locale) را تغییر دهد:

Mail::to($request->user())->locale('es')->send(
new OrderShipped($order)
);

ذخیره Localeهای دلخواه کاربر


برنامه‌ می‌تواند localeدلخواه کاربر را ذخیره کنند. با پیاده سازی کنتراکت HasLocalePreference در یک یا چند مدل برنامه خود، می‌توانید به لاراول بگویید که از این locale ذخیره شده در هنگام ارسال ایمیل استفاده کند:

use Illuminate\Contracts\Translation\HasLocalePreference;

class User extends Model implements HasLocalePreference
{
/**
* Get the user's preferred locale.
*
* @return string
*/
public function preferredLocale()
{
return $this->locale;
}
}

زمانی که این رابط را اجرا می‌کنید، لاراول به صورت خودکار در هنگام ارسال mailableها از این locale استفاده کرده و یک نوتیفیکیشن به مدل ارسال می‌کند. بنابراین، هنگام استفاده از این رابط، نیازی به فراخوانی متد locale نیست:

Mail::to($request->user())->send(new OrderShipped($order));

ارسال ایمیل در توسعه محلی لاراول


ممکن است در زمان ساخت یک برنامه کاربردی که عمل ارسال ایمیل را انجام می‌دهد، نخواهید ایمیل را به یک آدرس ایمیل واقعی ارسال کنید. لاراول چند روش برای غیر فعال کردن یا “disable” ارسال واقعی ایمیل در طول توسعه محلی ارائه می‌کند.

درایور Log

به جای ارسال ایمیل، درایور ایمیل log همه پیام‌های ایمیل را در فایل‌های Log خود برای بازرسی می‌نویسد. برای کسب اطلاعات بیشتر در مورد پیکربندی برنامه خود در محیط، لطفا مستندات پیکربندی در این زمینه را مطالعه نمایید.

ارسال عمومی (Universal)

یکی دیگر از راه‌حل‌های ارائه شده برای انجام این کار توسط لاراول این است که یک گیرنده عمومی یا universal برای تمام ایمیل‌های ارسال شده توسط فریم ورک تنظیم کنید. به این ترتیب، تمام ایمیل‌های ایجاد شده توسط برنامه شما به جای آدرس واقعی که هنگام ارسال پیام ایمیل مشخص می‌شود، به آدرس خاصی که تنظیم کرده‌اید ارسال ‌می‌شوند. این کار را می‌توانید از طریق گزینه‌ to در فایل پیکربندی config / mail.ph p خود انجام دهید:

'to' => [
'address' => 'example@example.com',
'name' => 'Example'
],

Mailtrap

در آخر، شما می‌توانید از یک سرویس مانند Mailtrap و درایور smtp را برای ارسال پیام‌های ایمیل خود به یک صندوق پستی جعلی استفاده کنید که در آن می‌توانید پیام‌ها را در یک کلاینت واقعی ایمیل مشاهده کنید. این روش به شما این امکان را می‌دهد تا پیام‌های ایمیل نهایی را در نمایشگر پیام Mailtrap بررسی کنید.

رویدادهای ارسال ایمیل در لاراول


لاراول در طول فرایند ارسال پیام‌های ایمیل دو رویداد را ایجاد می‌کند. رویداد MessageSending قبل از پیام رسالی رخ می‌دهد، در حالی که رویداد MessageSent پس از ارسال پیام، رخ می‌دهد. به یاد داشته باشید، هنگامی که ایمیل ارسال می‌شود، این رویدادها رخ می‌دهند و نه زمانی که در صف قرار دارند. می‌توانید یک شنونده رویداد (event listener) برای این رویدادها را در EventServiceProvider خود ثبت کنید:

/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
'Illuminate\Mail\Events\MessageSending' => [
'App\Listeners\LogSendingMessage',
],
'Illuminate\Mail\Events\MessageSent' => [
'App\Listeners\LogSentMessage',
],
];

 

دیدگاه بگذارید

avatar
  اشتراک  
اطلاع از