yii2 - 通过console use transport发送电子邮件

时间:2016-04-24 08:48:19

标签: php email yii2

我希望通过控制台使用Swift_SmtpTransport发送电子邮件。

相同的传输设置在common / config / main-local.php中工作,在console / config / main-local.php中不起作用。

在config / main-local.php的控制台中我有:

<?php
return [
    'components' => [        
        'mail' => [
            'class' => 'yii\swiftmailer\Mailer',
            'viewPath' => '@common/mail',
            'htmlLayout' => '@common/mail/layouts/html',
            'textLayout' => '@common/mail/layouts/text',  // custome layout        
            'transport' => [
                'class' => 'Swift_SmtpTransport',
                'host' => 'gator.hostgator.com',
                'username' => 'test@pix.com',
                'password' => '*******',
                'port' => '465',
                'encryption' => 'ssl',
            ],
        ],
    ],    
];

使用此配置(并且通常设置相同且有效)我按命令加载脚本,没有电子邮件发送,也没有错误。

这个(我删除传输设置)我按命令运行相同的脚本,电子邮件发送确定:

<?php
return [
    'components' => [        
        'mail' => [
            'class' => 'yii\swiftmailer\Mailer',
            'viewPath' => '@common/mail',
            'htmlLayout' => '@common/mail/layouts/html',
            'textLayout' => '@common/mail/layouts/text',  // custome layout        
        ],
    ],    
];

在console / controllers / CronController中我有这个:

<?php

namespace console\controllers;

use yii\console\Controller;
use backend\models\Definicoes;
use common\models\Acordo;
use Yii;

/**
 * Cron controller
 */
class CronController extends Controller {

    public function actionIndex() {
        $data_hoje = date('Y-m-d');
        $model_definicoes = Definicoes::find()->one();

        Yii::$app->mail->compose('@common/mail/cron_acordo', ['model_definicoes' => $model_definicoes])
           ->setFrom([Yii::$app->params['adminEmail'] => Yii::$app->params['nome']])
           ->setSubject('Alert')
           ->setTo('ideinto@gmail.com')     
           ->send();        
    }
}

为什么会这样?我不能在控制台中使用传输?

谢谢!

4 个答案:

答案 0 :(得分:2)

另一种检查传输设置是否正确的方法 你可以直接在CronController.php中设置传输

          \Yii::$app->mail->setTransport( [
            'class' => 'Swift_SmtpTransport',
            'host' => 'gator.hostgator.com',
            'username' => 'test@pix.com',
            'password' => '*******',
            'port' => '465',
            'encryption' => 'ssl',
          ]); 

在此行之前

Yii :: $ app-&gt; mail-&gt;撰写(&#39; @ common / mail / cron_acordo&#39;,[&#39; model_definicoes&#39; =&gt; $ model_definicoes])

答案 1 :(得分:0)

这是因为common/main.php中的yii合并配置与您console/main.php的合并配置。 重置您的配置以直接发送:

'mailer' => [
        'useFileTransport' => false,
        //other configs
    ]

请参阅文件:yii\mail\BaseMailer.php,在第77-78行注释:

/**
 * @var boolean whether to save email messages as files under [[fileTransportPath]] instead of sending them
 * to the actual recipients. This is usually used during development for debugging purpose.
 * @see fileTransportPath
 */
public $useFileTransport = false;

答案 2 :(得分:0)

您应该确保console.php中的配置正确,确保已配置密钥邮件程序。 祝你好运!

答案 3 :(得分:0)

所以,当我在寻找一个问题的答案时,我遇到了这个问题。我通过启用SwiftMailer的日志记录找到了我的问题的答案,最终发现&#34;发件人地址被拒绝:中继收件人表中的用户未知。&#34;基本上,我在&#34;来自&#34;中使用的邮件。控制台部分的地址与前端部分的地址不同,这就是问题,它甚至与配置无关。

我只能通过查看日志记录来解决这个问题,以便在您的Yii配置中启用日志记录,以及邮件&#39;组件(或您正在调用的任何组件)添加key =&gt;值对&#39; enableSwiftMailerLogging&#39; =&GT; true(此问题的位置示例:Config mailer parameters from model - Yii2)。然后,在您的日志组件配置中,在&#39; targets&#39;你需要添加

[
    'class' => 'yii\log\FileTarget',
    'categories' => ['yii\swiftmailer\Logger::add'],
]

这里略有记录:http://www.yiiframework.com/doc-2.0/yii-swiftmailer-logger.html

通过这样做,我能够查看日志(console / runtime / app.log),并找出它为什么不能从控制台正确发送,而是来自我的应用程序的其他区域