yiisoft / yii2-symfonymailer
Yii框架的SymfonyMailer集成
Requires
- php: >=8.1
- psr/event-dispatcher: 1.0.0
- symfony/mailer: ^6.4 || ^7.0
- symfony/mime: ^6.4 || ^7.0
- yiisoft/yii2: >=2.0.4
Requires (Dev)
- maglnet/composer-require-checker: ^4.7
- phpunit/phpunit: ^10.5
- roave/infection-static-analysis-plugin: ^1.34
- symplify/easy-coding-standard: ^12.1
- vimeo/psalm: ^5.20
Suggests
- yiisoft/yii2-psr-log-source: Allows routing transport logs to your Yii2 logger
README
Yii 邮件库 - Symfony 邮件扩展
本扩展为 Symfony Mailer 提供了一个用于 Yii框架2.0 的邮件解决方案。
有关许可信息,请查看 LICENSE 文件。
需求
- 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 访问权限。
测试
查看文档测试以了解有关测试的信息。