سلام عزیزان حال شما خوبه ؟ با اموزش امروز ماکه در مورد آموزش سرویس ایمیل در لاراول میباشد درخدمت شما دوستان هستم.
Mail (سرویس ایمیل)

۱٫ مقدمه

۲٫ ارسال ایمیل

· الصاق پیوست ها

· ضمیمه کردن فایلها در بدنه ی ایمیل (inline attachment)

· در صف قرار دادن ایمیل ها (queueing mail)

3. ایمیل و توسعه ی محلی

۴٫ رخدادها

مقدمه

laravel یک API ساده در عین حال کارآمد مبتنی بر کتابخانه ی پرطرفدار ارسال ایمیل SwiftMailer ارائه می دهد. لاراول همچنین درایورهایی را برای SMTP، Mailgun، Mandril، Amazon SES، تابع mail زبان PHP ارائه می کند که این امکان را به شما می دهد تا به راحتی ایمیل ها را از طریق سرویس محلی یا سرویس مبتنی بر Cloud دلخواه خود ارسال کنید.

پیش نیازهای Driver

درایورهای مبتنی بر API همچون Mailgun و Mandrill معمولا ساده تر و سریع تر از سرور های SMTP هستند. برای تمامی درایورهای مبتنی بر API نصب کتابخانه ی Guzzle HTTP الزامی است. می توانید Guzzle را با افزودن کد زیر به فایلcomposer.json ، در پروژه ی خود نصب کنید:

“guzzlehttp/guzzle”: “~5.3|~6.0”

درایور Mailgun

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

‘mailgun’ => [

‘domain’ => ‘your-mailgun-domain’,

‘secret’ => ‘your-mailgun-key’,

],

درایور Mandrill

به منظور استفاده از درایور Mandrill ابتدا بایستی Guzzle را نصب کرده و سپس آپشن driver را در فایل تنظیمات config/mail.php بر روی mandrill تنظیم کنید. سپس بررسی کرده و مطمئن شوید که فایل تنظیمات config/services.php آپشن های زیر را شامل می شود:

‘mandrill’ => [

‘secret’ => ‘your-mandrill-key’,

],

درایور SparkPost

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

‘sparkpost’ => [

‘secret’ => ‘your-sparkpost-key’,

],

درایور SES

به منظور استفاده از درایور Amazon SES، بایستی جعبه توسعه نرم افزار (SDK) Amazon AWS را برای PHP نصب کنید. می توانید با افزودن کد زیر به بخش require فایل composer.json این کتابخانه را نصب کنید:

“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

],

ارسال ایمیل

لاراول به شما این امکان را می دهد تا پیغام های ایمیل خود را در view ها ذخیره نمایید. به عنوان مثال برای سازماندهی ایمیل ها می توان یک پوشه به نام emails داخل پوشه یresources/views ایجاد کرد.

جهت ارسال ایمیل، کافی است متد send را در Mail facade فراخوانی کنید. این متد سه آرگومان ورودی دریافت می کند. اولین پارامتر اسم view است که دربردارنده ی پیغام ایمیل می باشد. دومین آرگومان آرایه ای از داده ها است که بایستی به view ارسال شود. آخرین آرگومان یک تابع بازفراخوان (callback) Closure است که یک نمونه از پیغام (message instance) را دریافت کرده و به شما امکان می دهد تا دریافت کنندگان ایمیل، موضوع و دیگر جزئیات پیام ایمیل را اختصاصی تنظیم نمایید:

$user], function ($m) use ($user) {

$m->from(‘hello@app.com’, ‘Your Application’);

$m->to($user->email, $user->name)->subject(‘Your Reminder!’);

});

}

}

در نمونه ی فوق از آنجایی که یک آرایه حاوی کلید user را به عنوان آرگومان ارسال کردیم، می توانیم با بهره گیری از کد PHP زیر اسم کاربر را داخل view مربوط به ایمیل خود به نمایش بگذاریم:

name; ?>

نکته: همیشه یک متغیر $message به view های مربوطه به ایمیل ها فرستاده می شود که امکان گنجاندن پیوست ها در بدنه ی ایمیل (inline attachments) را فراهم می آورد. به همین دلیل بایستی از ارسال متغیر message در payload (اطلاعات همراه) view خودداری نمایید.

ساخت پیغام

همان طور که قبلا گفته شد، سومین آرگومان ارسالی به متد send یک تابع Closure است که به شما اجازه می دهد گزینه های مختلف در یک ایمیل متعارف (همچون subject، recipients) را مطابق نیاز خود تنظیم نمایید. از طریق همین تابع Closure می توان دیگر attribute ها و خصیصه های پیغام را مشخص کنید که از جمله ی آن می توان به carbon copy، blind carbon copy و غیره … اشاره کرد:

Mail::send(’emails.welcome’, $data, function ($message) {

$message->from(‘us@example.com’, ‘Laravel’);

$message->to(‘foo@example.com’)->cc(‘bar@example.com’);

});

تمامی متدهایی که می توان برای نمونه message ساز (message builder instance) متغیر $message فراخوانی کرد در زیر به نمایش گذاشته شده:

$message->from($address, $name = null);

$message->sender($address, $name = null);

$message->to($address, $name = null);

$message->cc($address, $name = null);

$message->bcc($address, $name = null);

$message->replyTo($address, $name = null);

$message->subject($subject);

$message->priority($level);

$message->attach($pathToFile, array $options = []);

// Attach a file from a raw $data string…

$message->attachData($data, $name, array $options = []);

// Get the underlying SwiftMailer message instance…

$message->getSwiftMessage();

نکته: نمونه message ارسالی به تابع Closure متد Mail::send ، از کلاس پیغام رسان SwiftMailer ارث بری می کند. این امر به شما اجازه می دهد هر متدی که لازم دارید را در کلاس نام برده صدا زده و بدین وسیله پیغام های ایمیل خود را تنظیم و ایجاد نمایید.

ارسال پیغام ساده با ایمیل

به صورت پیش فرض، view ارسالی به متد send کد HTML را هم شامل می شود. با این حال، با ارسال یک آرایه به عنوان اولین آرگومان به متد send می توان یک text view ساده نیز به ضمیمه ی HTML view مشخص کرد:

Mail::send([‘html.view’, ‘text.view’], $data, $callback);

یا چنانچه فقط می بایست یک ایمیل متنی ساده ارسال کنید، کافی است کلید text را به صورت زیر در آرایه استفاده نمایید:

Mail::send([‘text’ => ‘view’], $data, $callback);

ارسال رشته های خام (raw strings)

اگر می خواهید یک رشته ی ساده را مسقیم به عنوان ایمیل ارسال کنید، کافی است متد raw را به صورت زیر بکار ببرید:

Mail::raw(‘Text to e-mail’, function ($message) {

//

});

الصاق پیوست ها

به منظور افزودن پیوست به ایمیل، لازم است متد attach را برای شی$message پاس داده شده به Closure فراخوانی کنید. این متد مسیر کامل فایل را به عنوان اولین آرگومان دریافت می کند:

Mail::send(’emails.welcome’, $data, function ($message) {

//

$message->attach($pathToFile);

});

به هنگام پیوست فایل های دلخواه به پیغام ایمیل خود، می توانید اسم نمایش داده شده و / یا نوع MIME را نیز با ارسال یک آرایه به عنوان آرگومان دوم به متد attach، مشخص نمایید:

$message->attach($pathToFile, [‘as’ => $display, ‘mime’ => $mime]);

ضمیمه کردن فایلها در بدنه ی ایمیل(inline attachment)

گنجاندن یک فایل تصویری در view مربوط به ایمیل

اضافه کردن عکس و فایل های تصویری به email اغلب کاری بسیار دشوار است. اما لاراول یک روش بسیار آسان برای ضمیمه کردن تصاویر به ایمیل ها و بازیابی CID مناسب فراهم می کند. جهت اضافه کردن یک عکس به بدنه ی ایمیل (به اصطلاح پیوست inline)، متد embed را برای متغیر $message داخل view مر بوط به email خود صدا بزنید. یادآور می شویم که Laravel به صورت خودکار متغیر $message را در دسترس تمامی view های ایمیل قرار می دهد:

Here is an image:

<img src="embed($pathToFile); ?>”>

گنجاندن داده های خام در view مربوط به ایمیل

برای قرار دادن داده های خام از نوع رشته در پیغام ایمیل، کافی است متد embedData را بر روی متغیر $message فراخوانی کنید:

Here is an image from raw data:

<img src="embedData($data, $name); ?>”>

در صف قرار دادن ایمیل ها (queueing mail)

در صف قرار دادن یک ایمیل

از آنجایی که ارسال ایمیل می تواند طول زمان پاسخ دهی اپلیکیشن را به طور قابل توجهی افزایش دهد، بسیاری از برنامه نویسان تصمیم می گیرند ایمیل ها را برای ارسال در پشت صحنه (بدون دخالت کاربر) و در زمان مناسب در صف قرار دهند. چارچوب نرم افزاری Laravel با ارائه ی رابط برنامه سازی کاربردی unified queue (API) این امکان را به راحتی در اختیار توسعه دهنده قرار می دهد. به منظور قرار دادن یک ایمیل در صف، کافی است متد queue را در Mail facade به صورت زیر بکار ببرید:

Mail::queue(’emails.welcome’, $data, function ($message) {

//

});

این متد به صورت اتوماتیک job مورد نظر را در صف قرار داده تا در پشت صحنه و بدون دخالت کاربر ارسال شود. لازم به ذکر است که پیش از بهره گیری از این قابلیت بایستی queue ها را تنظیم نمایید.

ارسال ایمیل با تاخیر

اگر می خواهید تحویل یک ایمیل در صف قرار گرفته را به تاخیر بیاندازید، کافی است متد later را فراخوانی کنید. برای شروع می بایست تعداد ثانیه هایی که می خواهید ارسال ایمیل به تعویق بیافتد را به عنوان آرگومان اول به متد ارسال نمایید:

Mail::later(5, ’emails.welcome’, $data, function ($message) {

//

});

مشخص کردن queue دلخواه برای صف بندی ایمیل

اگر می خواهید ایمیل در صف مشخصی قرار گیرد، در آن صورت لازم است دو متد queueOn و laterOn را به صورت نمایش داده شده در زیر صدا بزنید:

Mail::queueOn(‘queue-name’, ’emails.welcome’, $data, function ($message) {

//

});

Mail::laterOn(‘queue-name’, 5, ’emails.welcome’, $data, function ($message) {

//

});

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

به هنگام توسعه ی اپلیکیشن با قابلیت ارسال ایمیل، لزومی ندارد ایمیل ها را به آدرس های زنده ی ایمیل ارسال کنید (توصیه می شود ارسال ایمیل از ماشین توسعه ی خود به مخاطبین را غیر فعال کنید. این کار برای عیب یابی و بررسی محتوا محلی انجام می شود). Laravel چندین روش برای غیر فعال کردن ارسال واقعی ایمیل ارائه می دهد که در زیر به شرح هر یک خواهیم پرداخت.

درایور Log

یک روش این است که درایور ایمیل log را در طول توسعه ی محلی برنامه ی کاربردی خود بکار ببرید. این درایور تمامی ایمیل ها را در فایل های ثبت گزارش (log) درج می کند.

تنظیم یک دریافت کننده ی سراسری (Universal To)

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

‘to’ => [

‘address’ => ‘dev@domain.com’,

‘name’ => ‘Dev Example’

],

Mailtrap

به عنوان روش آخر می توان یک سرویس نظیر Mailtrap و درایور smtp را برای ارسال ایمیل ها به یک صندوق پستی (mailbox) ساختگی بکار برد. با این کار می توان ایمیل های آزمایشی را در بستر یک دریافت کننده ی واقعی ایمیل (email client) مشاهده نمود. مزیت این روش نسبت به روش های دیگر این است که می توانید ایمیل های نهایی را در نمایش گر ایمیل (message viewer) Mailtrap مشاهده کرده و بررسی نمایید.

رخدادها

Laravel درست پیش از ارسال ایمیل یک event اعلان (fire) می کند. به خاطر داشته باشید با قرار گرفتن ایمیل در صف، رخداد مربوطه اعلان (fire) نمی شود بلکه زمانی که ایمیل کاملا ارسال شد، می توان گفت که رخداد اعلان شده است. می توانید یک event listener به صورت زیر در EventServiceProvider ثبت نمایید:

/**

* The event listener mappings for the application.

*

* @var array

*/

protected $listen = [

‘Illuminate\Mail\Events\MessageSendin