ارسال ایمیل یکی از ملزومات همیشگی اپلیکیشنهای مبتنی بر وب است. توسعهدهندگان در موارد مختلفی نیاز به ارسال ایمیل در اپلیکیشن خود دارند، مانند: خبرنامه، عضویت، فراموشی رمز عبور، بخش تماس با ما و… . لاراول یک API ساده و کاربردی را براساس کتابخانهی محبوب SwiftMailer و همراه با درایورهای مختلفی از جمله SMTP ،Mailgun ،Postmark ،Amazon SES و sendmail فراهم کرده است. این Api به شما اجازه میدهد که از طریق سرویس محلی یا ابری مورد نظرتان، به سادگی عملیات ارسال ایمیل را در اپلیکیشن خود اجرایی کنید. در ادامه شما را با انجام این فرآیند آشنا میکنیم؛ با ما همراه باشید.
در این مقاله، فرض میکنیم شما یک پروژهی لاراول را بر روی سیستم لوکال خود دارید و با آموزش لاراول نیز آشنایی دارید و قصد دارید که بخش ارسال ایمیل را به آن اضافه کنید.
فایل mail.php در پوشهی config، حاوی تمامی تنظیمات مورد نیاز برای پیکربندی سرویسهای ایمیل لاراول است. درایور پیشفرض لاراول برای ارسال ایمیل، SMTP است. تنظیمات مربوط به این درایور و همچنین سایر درایورها در آرایهی mailers موجود است. مقادیر این تنظیمات ابتدا از محتویات فایل env. خوانده شده و در صورتی که مقادیر در این فایل تعریف نشده باشند، پارامتر دوم موجود در تابع ()env، به عنوان مقدار در نظر گرفته میشود.
MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=null
MAIL_FROM_NAME="${APP_NAME}"
همانطور که میبینید، علاوه بر تنظیمات مربوط به درایور SMTP، نام و آدرس پیشفرض فرستندهی ایمیل را هم میتوان مشخص کرد.
با اجرای دستور زیر، یک کلاس با نام دلخواه در مسیر app/Mail ایجاد میشود که از کلاس Mailable لاراول ارث بری میکند. این کلاس ویژگیهای جذابی دارد که در ادامه از آنها استفاده خواهیم کرد.
php artisan make:mail SampleMail
برای قالب HTML ایمیل، میتوانید از هر قالب دلخواهی استفاده کنید. کافی است تا فایل مورد نظر را در پوشهی views و در فایلی با پسوند blade.php کپی کنید.
تمام موارد مربوط به پیکربندی کلاس Mailable در متد ()build انجام میگیرد. در این متد، شما میتوانید از متدهای مختلفی نظیر ()from() ،subject() ،attach و ()view به منظور پیکربندی کلاس استفاده کنید.
با استفاده از این متد، میتوانید View یا همان قالب Blade مورد نظرتان را برای نمایش ایمیل مشخص کنید:
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class SampleEmail extends Mailable
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('emails.sample');
}
}
اگر قصد دارید که ایمیل را به صورت متن ساده نمایش دهید، میتوانید از این متد به جای متد ()view استفاده کنید:
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class SampleEmail extends Mailable
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->text('emails.sample_plain');
}
}
علاوه بر مقدار پیشفرض فرستنده در تنظیمات مربوط به پیکریندی که در بالا ذکر شد، با استفاده از این متد میتوانید فرستندهی ایمیل را مشخص کنید. در صورت استفاده از این متد، مقدار پیشفرض در نظر گرفته نمیشود.
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class SampleEmail extends Mailable
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->from('someone@example.com')->view('emails.sample');
}
}
برای افزودن هر گونه ضمیمهای به ایمیل، میتوانید مسیر کامل فایل ضیمیه را به متد ()attach پاس دهید:
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class SampleEmail extends Mailable
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('emails.sample')->attach('/path/to/file');
}
}
با استفاده از این متد میتوانید عنوان ایمیل ارسالی را مشخص کنید:
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class SampleEmail extends Mailable
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('emails.sample')->subject('Sample Mail Title');
}
}
اغلب نیاز پیدا میکنید که داده یا دادههایی را به View ایمیل پاس دهید. دو روش برای این کار وجود دارد. در روش اول، هر خصوصیتی که به صورت Public در کلاس تعریف کنید، در View به آن دسترسی خواهید داشت:
<?php
namespace App\Mail;
use App\Models\User;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class SampleEmail extends Mailable
{
use Queueable, SerializesModels;
public $user;
/**
* Create a new message instance.
*
* @param User $user
* @return void
*/
public function __construct(User $user)
{
$this->user = $user;
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->text('emails.sample_plain');
}
}
در قطعه کد فوق، ما یک نمونه از مدل User را در خصوصیت عمومی user قرار دادهایم. در روش دوم، ما میتوانیم یک خصوصیت Protected تعریف کنیم و با استفاده از متد ()with، آن را به View پاس دهیم:
<?php
namespace App\Mail;
use App\Models\User;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class SampleEmail extends Mailable
{
use Queueable, SerializesModels;
protected $user;
/**
* Create a new message instance.
*
* @param User $user
* @return void
*/
public function __construct(User $user)
{
$this->user = $user;
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->text('emails.sample_plain')->with([
'userName' => $this->user->name,
'userPhoneNumber' => $this->user->phone_number
]);
}
}
مقادیر مورد نظر به صورت معمول در View قابل دسترسی خواهد بود:
<div>
<span>{{ $userName }}</span>
<span>{{ $userPhoneNumber }}</span>
</div>
برای ارسال ایمیل میتوانید از Mail Facade استفاده کنید:
<?php
namespace App\Http\Controllers;
use App\Mail\SampleEmail;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
class SampleController extends Controller
{
public function sendEmail(Request $request, $userId)
{
$user = $request->user();
Mail::to($user)->send(new SampleEmail($user));
}
}
متد ()to، ایمیل گیرنده را میپذیرد. میتوان این ایمیل را به صورت رشته، یک نمونه از مدل کاربر مورد نظر یا به صورت کالکشنی از مدلها به متد ()to پاس داد. در صورت استفاده از مدل یا کالکشن، Mailer به صورت خودکار مقادیر email و name را استخراج میکند. بنابراین مطمئن شوید که این مقادیر در مدل مورد نظر تعریف شده باشند. سپس یک نمونه از کلاس Mailable را به همراه دادهی مورد نظرمان به متد ()send پاس میدهیم. همچنین میتوانید از توابع ()cc و ()bcc برای ارسال رونوشت ایمیل استفاده کنید:
<?php
namespace App\Http\Controllers;
use App\Mail\SampleEmail;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
class SampleController extends Controller
{
public function sendEmail(Request $request, $userId)
{
$user = $request->user();
Mail::to($user)->cc('user@example.com')->bcc('another.user@example.com')->send(new SampleEmail($user));
}
}
به دلیل آنکه ارسال ایمیل معمولا فرآیندی زمانبر است، بسیاری از توسعهدهندگان ایمیلها را در Queue یا صف قرار میدهند تا عملیات ارسال آنها در پسزمینه انجام شود. در این حالت میتوانیم به جای متد ()send از متد ()queue استفاده کنیم:
<?php
namespace App\Http\Controllers;
use App\Mail\SampleEmail;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
class SampleController extends Controller
{
public function sendEmail(Request $request, $userId)
{
$user = $request->user();
Mail::to($user)->queue(new SampleEmail($user));
}
}
اگر نیاز دارید که کلاس Mailable که ایجاد کردهاید، همواره در صف قرار گیرد، میتوانید Interface با نام ShouldQueue را در کلاس ایجاد شده، implement کنید. در این حالت برای ارسال ایمیل میتوانید از همان متد ()send استفاده کنید:
<?php
namespace App\Mail;
use App\Models\User;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class SampleEmail extends Mailable implements ShouldQueue
{
use Queueable, SerializesModels;
public $user;
/**
* Create a new message instance.
*
* @param User $user
* @return void
*/
public function __construct(User $user)
{
$this->user = $user;
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('emails.sample');
}
}
به منظور تست ایمیل و مطمئن شدن از صحت اجرای آن در مرحلهی توسعه، میتوانید از Mailtrap استفاده کنید. Mailtrap یک سرور SMTP را برایتان شبیهسازی میکند. برای این منظور، ابتدا به وب سایت mailtrap مراجعه کنید:
سپس با انتخاب گزینهی Sign up، یک حساب کاربری ایجاد کنید و وارد آن شوید:
با انتخاب Laravel از لیست آبشاری Integrations، تنظیمات نمایش داده شده را در فایل env. پروژهی خود کپی کنید. اکنون میتوانید فرآیند ارسال ایمیل را تست کرده و در صورت موفقیتآمیز بودن ارسال آن، نتیجه را به شکل زیر در حساب کاربری خود در وب سایت Mailtrap مشاهده کنید:
اگر قصد دارید برای پروژهی لاراولی خود از هاست اشتراکی استفاده کنید، میتوانید از تیم پشتیبان هاست درخواست کنید که تنظیمات سرور SMTP را در اختیارتان قرار دهند. این تنظیمات شامل Host ،Port و Encryption است. Username و Password نیز آدرس ایمیل و رمز عبور آن در وبمیل هاست هستند.
جمعبندی
در این مقاله از سری مقالات آموزش لاراول، توانستیم نحوهی ایجاد کلاس Mailable برای ارسال ایمیل در لاراول را فرا بگیریم و با متدهای مختلف آن آشنا شویم. با تنظیمات مختلف پیکربندی ایمیل در لاراول آشنا شدیم و توانستیم با استفاده از سرویس Mailtrap، فرآیند ارسال ایمیل با استفاده از درایور SMTP را تست کنیم. همچنین در انتها، نحوهی پیکربندی ایمیل لاراول در هاست اشتراکی را به صورت خلاصه بررسی کردیم. امیدواریم این آموزش مورد استفادهی شما قرار بگیرد و بتوانید ارسال ایمیل در لاراول را به درستی اجرا کنید.
خوشحال میشویم نظرات، تجربیات و سوالات خود را با ما و سایر کاربران سون لرن به اشتراک بگذارید.
اگر به یادگیری بیشتر لاراول علاقه داری میتوانی در دوره آموزش لاراول کاربردی (بسته پروژه محور) شرکت کنی، این دوره شامل ۱۲ پروژه کاربردی و پر استفاده در دنیای واقعی است، که تمامی پروژهها به صورت کامل برنامه نویسی خواهند شد، تا دانشجو بتواند با روند ایجاد و تکمیل پروژه به صورت کامل آشنا شود.