ارسال ایمیل یکی از ملزومات همیشگی اپلیکیشنهای مبتنی بر وب است. توسعهدهندگان در موارد مختلفی نیاز به ارسال ایمیل در اپلیکیشن خود دارند، مانند: خبرنامه، عضویت، فراموشی رمز عبور، بخش تماس با ما و... . لاراول یک API ساده و کاربردی را براساس کتابخانهی محبوب SwiftMailer و همراه با درایورهای مختلفی از جمله SMTP ،Mailgun ،Postmark ،Amazon SES و sendmail فراهم کرده است. این Api به شما اجازه میدهد که از طریق سرویس محلی یا ابری مورد نظرتان، به سادگی عملیات ارسال ایمیل را در اپلیکیشن خود اجرایی کنید. در ادامه شما را با انجام این فرآیند آشنا میکنیم؛ با ما همراه باشید.
پیشنیاز
در این مقاله، فرض میکنیم شما یک پروژهی لاراول را بر روی سیستم لوکال خود دارید و با آموزش لاراول نیز آشنایی دارید و قصد دارید که بخش ارسال ایمیل را به آن اضافه کنید.
پیکربندی
فایل mail.php در پوشهی config، حاوی تمامی تنظیمات مورد نیاز برای پیکربندی سرویسهای ایمیل لاراول است. درایور پیشفرض لاراول برای ارسال ایمیل، SMTP است. تنظیمات مربوط به این درایور و همچنین سایر درایورها در آرایهی mailers موجود است. مقادیر این تنظیمات ابتدا از محتویات فایل env. خوانده شده و در صورتی که مقادیر در این فایل تعریف نشده باشند، پارامتر دوم موجود در تابع ()env، به عنوان مقدار در نظر گرفته میشود.
همانطور که میبینید، علاوه بر تنظیمات مربوط به درایور SMTP، نام و آدرس پیشفرض فرستندهی ایمیل را هم میتوان مشخص کرد.
ایجاد Mailable
با اجرای دستور زیر، یک کلاس با نام دلخواه در مسیر app/Mail ایجاد میشود که از کلاس Mailable لاراول ارث بری میکند. این کلاس ویژگیهای جذابی دارد که در ادامه از آنها استفاده خواهیم کرد.
php artisan make:mail SampleMail
ایجاد View
برای قالب HTML ایمیل، میتوانید از هر قالب دلخواهی استفاده کنید. کافی است تا فایل مورد نظر را در پوشهی views و در فایلی با پسوند blade.php کپی کنید.
متد ()build
تمام موارد مربوط به پیکربندی کلاس Mailable در متد ()build انجام میگیرد. در این متد، شما میتوانید از متدهای مختلفی نظیر ()from() ،subject() ،attach و ()view به منظور پیکربندی کلاس استفاده کنید.
متد ()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');
}
}
متد ()text
اگر قصد دارید که ایمیل را به صورت متن ساده نمایش دهید، میتوانید از این متد به جای متد ()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');
}
}
متد ()from
علاوه بر مقدار پیشفرض فرستنده در تنظیمات مربوط به پیکریندی که در بالا ذکر شد، با استفاده از این متد میتوانید فرستندهی ایمیل را مشخص کنید. در صورت استفاده از این متد، مقدار پیشفرض در نظر گرفته نمیشود.
<?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
برای افزودن هر گونه ضمیمهای به ایمیل، میتوانید مسیر کامل فایل ضیمیه را به متد ()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');
}
}
متد ()subject
با استفاده از این متد میتوانید عنوان ایمیل ارسالی را مشخص کنید:
<?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></span>
<span></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 را تست کنیم. همچنین در انتها، نحوهی پیکربندی ایمیل لاراول در هاست اشتراکی را به صورت خلاصه بررسی کردیم. امیدواریم این آموزش مورد استفادهی شما قرار بگیرد و بتوانید ارسال ایمیل در لاراول را به درستی اجرا کنید.
خوشحال میشویم نظرات، تجربیات و سوالات خود را با ما و سایر کاربران سون لرن به اشتراک بگذارید.
اگر به یادگیری بیشتر لاراول علاقه داری میتوانی در دوره آموزش لاراول کاربردی (بسته پروژه محور) شرکت کنی، این دوره شامل ۱۲ پروژه کاربردی و پر استفاده در دنیای واقعی است، که تمامی پروژهها به صورت کامل برنامه نویسی خواهند شد، تا دانشجو بتواند با روند ایجاد و تکمیل پروژه به صورت کامل آشنا شود.
۵ دیدگاه
۰۹ مرداد ۱۴۰۲، ۱۰:۱۴
سلام
نحوه ارسال ایمیل در لاراول 5.5 و 9 تغییری کرده است ؟ پس از آپدیت سیستم به لاراول 9 خطای زیر را میدهد و مطابق آموزش شما نیز پیش رفتم اما فرقی نکرد :
Connection could not be established with host &quot;webmail.myaddress.ir:25&quot;: stream_socket_client():
ممنون میشوم راهنمایی فرمایید
نازنین کریمی مقدم۱۹ شهریور ۱۴۰۲، ۰۹:۴۶
درود
احتمالا مشکل از پورت هست. <a href="https://stackoverflow.com/questions/27721120/laravel-connection-could-not-be-established-with-host-smtp-gmail-com-0" target="_blank" rel="noopener nofollow ugc">راهکارهای این تاپیک</a> رو بررسی کنید.
۳۰ شهریور ۱۴۰۱، ۰۸:۵۱
بسیار عالی و کامل بود.
سهند رحمت پناه۱۴ آبان ۱۴۰۰، ۰۸:۳۶
از کجا بفهمیم ایمیل ارسال شده یا نه؟ فرضا ایمیل کاربر اشتباه وارد شده
Nazanin KarimiMoghaddam۱۴ آبان ۱۴۰۰، ۱۹:۲۲
درود
حقیقتا چون این بخش میره زیر دست گوگل، بنده راهی نمیشناسم مگر اینکه یک لینک رو در ایمیل خودتون قرار بدید و از فرد بخواهید با زدن روی لینک، مشاهده اش رو تایید کنه.
دوستان اگر تجربه موفقی داشتید دست یاری برسونید بما :)