使用 Yii2 扩展通过 swiftmailer 发送电子邮件

Sending email with swiftmailer using the Yii2 extension

我正在做一个项目,我想测试发送给用户的电子邮件,但到目前为止我还没有成功设置它。我在 Vagrant 中使用 Codeception 和 运行。我现在想做什么:

return \Yii::$app->mailer->compose()
->setFrom($from)
->setTo($to)
->setSubject('Welcome')
->send();

我有一个 main-local.php,它看起来像这样:

'mailer'=> ['class' => 'yii\swiftmailer\Mailer',
'viewPath' => '@common/mail',
'transport' => [
'class' => 'Swift_SmtpTransport',
'host' => 'localhost',
'port' => 1025,
'useFileTransport' => false,
],

起初我遗漏了'useFileTransport' => false,然后我在'transport'之前添加了它,并尝试将它移到'transport'里面,正如你现在看到的,但它是一样的。 file/email 在项目中创建为 .eml 文件,但没有发送邮件。我尝试设置 mailcatcher (http://mailcatcher.me/),并且确实成功了,但如果我可以更改配置,而不是使用不同的方法和更改代码,邮件将被发送到哪里,那就太好了我要它。 (我也尝试使用端口 1080,所以不是。)

如有任何帮助,我们将不胜感激。如果您需要更多信息,请告诉我!

更新: 我发现我有一个不同的配置文件,我实际上可以在其中使用 'useFileTransport' => false,然后它不会在项目中创建 file/email,但仍然不会发送它。我将 main-local.php 中显示的设置复制到此配置文件中,将 'useFileTransport' => false 移到 'transport' 之前,但我仍在寻找发送这些电子邮件的方法

$useFileTransportyii\swiftmailer\Mailer class 的 属性,因此不属于 transport 部分。

如果您的邮件程序配置如下,它将尝试通过 SMTP 将邮件投递到您本地主机上端口 1025 上的邮件服务器 运行:

'mailer'=> [
    'class' => 'yii\swiftmailer\Mailer',
    'viewPath' => '@common/mail',
    'useFileTransport' => false,
    'transport' => [
         'class' => 'Swift_SmtpTransport',
         'host' => 'localhost',
         'port' => 1025,
    ],
],

这对我来说有点不寻常,因为 SMTP 的默认端口是 25

确保 SMTP 服务器确实在该端口上 运行。例如。通过使用 telnet 命令:

telnet localhost 1025

应该给你这样的东西:

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 your.servername ESMTP Postfix

键入 quit 并按回车键退出 SMTP 会话。

您还可以检查通常位于 /var/log/mail.log 的邮件服务器日志文件。您可以使用

查看正在记录的消息
tail -f /var/log/mail.log

当您尝试发送它们时。

折腾了几天,终于找到问题了!

所以问题是我在更新部分提到的另一个配置。隐藏在 codeception/config/config.php 中缺少一行

'mailer' => [
        'class' => 'yii\swiftmailer\Mailer',
        'viewPath' => '@common/mail',
        //For email creation in project
        //'useFileTransport' => true,
        'transport' => [
            'class' => 'Swift_SmtpTransport',
            'host' => 'localhost',
            'port' => 1025,
            'encryption' => '',
        ],
    ],

我只需要加密,只需为空即可。电子邮件现在正在按预期方式发送,而且看起来不错!

希望这对那里的人有帮助,测试愉快!