تخفیف ویژه

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

دسته بندی: لاراول
زمان مطالعه: 11 دقیقه
۲۷ آبان ۱۳۹۹

ارسال ایمیل یکی از ملزومات همیشگی اپلیکیشن‌های مبتنی بر وب است. توسعه‌دهندگان در موارد مختلفی نیاز به ارسال ایمیل در اپلیکیشن خود دارند، مانند: خبرنامه، عضویت، فراموشی رمز عبور، بخش تماس با ما و... . لاراول یک 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، نام و آدرس پیش‌فرض فرستنده‌ی ایمیل را هم می‌توان مشخص کرد.

ایجاد 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('[email protected]')->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>{{ $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('[email protected]')->bcc('[email protected]')->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 را تست کنیم. هم‌چنین در انتها، نحوه‌ی پیکربندی ایمیل لاراول در هاست اشتراکی را به صورت خلاصه بررسی کردیم. امیدواریم این آموزش مورد استفاده‌ی شما قرار بگیرد و بتوانید ارسال ایمیل در لاراول را به درستی اجرا کنید.

خوشحال می‌شویم نظرات، تجربیات و سوالات خود را با ما و سایر کاربران سون لرن به اشتراک بگذارید.

اگر به یادگیری بیشتر لاراول علاقه داری می‌توانی در دوره آموزشی لاراول کاربردی (بسته پروژه محور) شرکت کنی، این دوره شامل ۱۲ پروژه کاربردی و پر استفاده در دنیای واقعی است، که تمامی پروژه‌ها به صورت کامل برنامه‌ نویسی خواهند شد، تا دانشجو بتواند با روند ایجاد و تکمیل پروژه به صورت کامل آشنا شود.

 

چه امتیازی به این مقاله می دید؟
نویسنده رضا زیدی
از یادگیری ، عمل‌گرایی و چالش‌های مربوطه ، لذت می‌برم ...

نظرات کاربران

اولین دیدگاه این پست رو تو بنویس !

ارسال دیدگاه
خوشحال میشیم دیدگاه و یا تجربیات خودتون رو با ما در میون بذارید :