📜  phpmailer 与 laravel - PHP (1)

📅  最后修改于: 2023-12-03 15:03:44.451000             🧑  作者: Mango

PHPMailer 与 Laravel

PHPMailer 是一个流行的 PHP 邮件库,用于发送电子邮件。它提供了一些与 SMTP、POP3、IMAP、PHPMailer 验证等相关的特性,使得向高级用户或技术人员发送邮件变得非常容易。

安装 PHPMailer

您可以使用 Composer 来安装 PHPMailer 库。在项目的根目录中,打开终端并执行以下命令:

composer require phpmailer/phpmailer
使用 PHPMailer

在 Laravel 中,您可以使用 PHPMailer 来发送电子邮件。这是通过创建自定义 Mailer 驱动程序并使用 PHPMailer 库进行实现的。让我们看看如何实现这一点。

  1. config/services.php 文件中,添加以下配置:
'phpmailer' => [
    'host'          => env('MAIL_HOST', 'smtp.gmail.com'),
    'port'          => env('MAIL_PORT', 587),
    'username'      => env('MAIL_USERNAME'),
    'password'      => env('MAIL_PASSWORD'),
    'encryption'    => env('MAIL_ENCRYPTION', 'tls'),
    'from'          => [
        'address' => env('MAIL_FROM_ADDRESS', 'example@example.com'),
        'name'    => env('MAIL_FROM_NAME', 'Example'),
    ],
],
  1. config/mail.php 文件中,将 driver 更改为 phpmailer
'driver' => 'phpmailer',
  1. 创建自定义 Mailer 驱动程序 app/Mail/PhpMailer.php
<?php

namespace App\Mail;

use Exception;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception as PHPMailerException;
use Illuminate\Mail\Mailable;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Validator;
use Illuminate\Contracts\Mail\Mailer as MailerContract;

class PhpMailer implements MailerContract
{
    protected $phpMailer;

    public function __construct(PHPMailer $phpMailer)
    {
        $this->phpMailer = $phpMailer;

        // Set defaults
        $this->phpMailer->isSMTP();
        $this->phpMailer->SMTPAuth   = true;
        $this->phpMailer->SMTPSecure = $this->phpMailer->SMTPAutoTLS;
        $this->phpMailer->CharSet    = 'utf-8';
    }

    public function send(Mailable $mailable)
    {
        $validator = Validator::make($mailable->build()->toArray(), $mailable->rules());

        if ($validator->fails()) {
            $errors = $validator->errors();

            Log::error('Failed to send email. Validation errors: [', $errors->toArray());

            return false;
        }

        try {
            $mailable->build($this->phpMailer);

            $this->phpMailer->send();

            return true;
        } catch (PHPMailerException $ex) {
            Log::error('Failed to send email. Exception was thrown: ['. $ex->getMessage() .']', $ex->getTrace());

            return false;
        } catch (Exception $ex) {
            Log::error('Failed to send email. Exception was thrown: ['. $ex->getMessage() .']', $ex->getTrace());

            return false;
        }
    }

    public function failures()
    {
        return [];
    }
}

该类实现了 MailerContract 接口,定义了 send 方法和 failures 方法,是邮件发送之前的最后一步封装。

  1. app/Providers/AppServiceProvider.phpregister 方法中,绑定该类为 Laravel 的默认邮件实现:
<?php

namespace App\Providers;

use App\Mail\PhpMailer;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\ServiceProvider;
use PHPMailer\PHPMailer\PHPMailer;

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->singleton('mail.manager', function ($app) {
            return new \Illuminate\Mail\MailManager($app);
        });

        $this->app->singleton('mailer', function ($app) {
            $config = $app['config']['mail'];

            return new PhpMailer(new PHPMailer);
        });

        $this->app->singleton('swift.mailer', function ($app) {
            return new \Swift_Mailer(
                $app->make('mailer')->getSwiftMailer()
            );
        });

        $this->app->singleton('swift.transport', function ($app) {
            return new \Swift_SmtpTransport;
        });

        Mail::swap($this->app->make('mailer'));
    }
}

现在,您已经成功地将 PHPMailer 库集成到 Laravel 中了,可以像平常一样进行电子邮件的发送了。

结论

在 Laravel 项目中,使用 PHPMailer 库发送电子邮件非常简单。通过上述步骤,我们可以快速创建自己的 Mailer 驱动程序,以及在 Laravel 的应用程序中使用 PHPMailer 库。

在此过程中,我们也了解了 PHPMailer 和 Laravel 的关系,并熟练掌握了如何将 PHPMailer 库与 Laravel 集成在一起,从而最大限度地利用 PHPMailer 库提供的丰富特性,为应用程序的用户发送电子邮件。


本文完。