yiisoft/yii2-symfonymailer

Yii框架的SymfonyMailer集成

安装量: 1,633,956

依赖: 57

建议者: 3

安全性: 0

星标: 42

关注者: 14

分支: 22

公开问题: 1

类型:yii2-extension

4.0.0 2024-01-29 14:13 UTC

This package is auto-updated.

Last update: 2024-08-22 22:15:00 UTC


README

Yii 邮件库 - Symfony 邮件扩展


本扩展为 Symfony Mailer 提供了一个用于 Yii框架2.0 的邮件解决方案。

有关许可信息,请查看 LICENSE 文件。

Latest Stable Version Total Downloads Build Status codecov static analysis type-coverage

需求

  • PHP 8.1 或更高版本。

安装

安装此扩展的首选方式是通过 composer

运行以下命令之一:

php composer.phar require --prefer-dist yiisoft/yii2-symfonymailer

"yiisoft/yii2-symfonymailer": "~3.0.0"

将以下内容添加到您的 composer.json 的 require 部分。

使用方法

要使用此扩展,只需在您的应用程序配置中添加以下代码

return [
    //....
    'components' => [
        'mailer' => [
            'class' => \yii\symfonymailer\Mailer::class,            
            'transport' => [
                'scheme' => 'smtps',
                'host' => '',
                'username' => '',
                'password' => '',
                'port' => 465,
                'dsn' => 'native://default',
            ],
            'viewPath' => '@common/mail',
            // send all mails to a file by default. You have to set
            // 'useFileTransport' to false and configure transport
            // for the mailer to send real emails.
            'useFileTransport' => false,
        ],
    ],
];

return [
    //....
    'components' => [
        'mailer' => [
            'class' => \yii\symfonymailer\Mailer::class,            
            'transport' => [
                'dsn' => 'smtp://user:[email protected]:25',
            ],
        ],
    ],
];

然后您可以按如下方式发送邮件

Yii::$app->mailer->compose('contact/html')
     ->setFrom('[email protected]')
     ->setTo($form->email)
     ->setSubject($form->subject)
     ->send();

依赖注入容器

当依赖注入容器可用时,Mailer 组件将自动使用它。这允许您轻松地覆盖传输工厂配置或其依赖项。

从 yiisoft/yii2-swiftmailer 迁移

要从弃用的 yiisoft/yii2-swiftmailer 迁移到此扩展,您需要更新应用程序配置。

Swiftmailer 默认传输是 SendmailTransport,而在此扩展中,默认将使用 NullTransport(不发送邮件)。您可以使用以下方式使用 Swiftmailer 默认设置

'mailer' => [
    'class' => yii\symfonymailer\Mailer::class,
    'transport' => [
        'dsn' => 'sendmail://default',
    ],
],

使用此扩展,您无法直接设置超时或其他与 Swiftmailer 扩展可能配置的设置。原因是,底层 Symfony 包将类定义为 final,这阻止了继承并鼓励使用组合。

例如,为了实现超时(以及其他受支持的传输配置),您需要定义工厂类并覆盖您感兴趣替换的默认传输工厂,通过 Yii DI 容器 定义。

以下是一个如何覆盖超时的示例。

首先定义您的自定义工厂类。

namespace app\utils;

use Symfony\Component\Mailer\Transport\Dsn;
use Symfony\Component\Mailer\Transport\Smtp\SmtpTransport;
use Symfony\Component\Mailer\Transport\TransportFactoryInterface;
use Symfony\Component\Mailer\Transport\TransportInterface;
use yii\base\BaseObject;

final class CustomSmtpFactory extends BaseObject implements TransportFactoryInterface
{
    public float $timeout;

    public function create(Dsn $dsn): TransportInterface
    {
        $transport = $this->create($dsn);
        if ($transport instanceof SmtpTransport) {

            /** @var SocketStream $stream */
            $stream = $transport->getStream();
            $stream->setTimeout($this->timeout);
        }
        return $transport;
    }

    public function supports(Dsn $dsn): bool
    {
        return $dsn->getScheme() == 'smtp';
    }
}

然后在配置文件的根目录中,设置容器定义中的工厂类,从而覆盖默认类。

'container' => [
    'definitions' => [
        EsmtpTransportFactory::class => [
            'class' => \app\utils\CustomSmtpFactory::class,
            'timeout' => 143, //Configure it to your own timeout
        ],
        // ... other definitions
    ],
],

这就是您需要做的。扩展应使用您的新类及其配置设置。

DSN 的安全影响

虽然 DSN 可能看起来像是一个允许用户配置邮件器设置的方法,但应该注意的是,sendmail 传输允许执行本地可执行文件。如果您需要有一个用户可配置的 DSN(这比创建 GUI 更容易构建且更强大),您可能需要禁用 sendmail 传输。任何有权配置 DSN 的用户实际上都有对运行代码的 shell 访问权限。

测试

查看文档测试以了解有关测试的信息。