根据用户输入更新swiftmailer配置

时间:2019-07-10 16:45:34

标签: yii2 swiftmailer yii2-basic-app

我需要根据用户输入来更新SwiftMailer配置,特别是,用户可能决定使用SMTP协议发送电子邮件或将其存储在本地(在特定文件系统的文件夹中)。用户将使用视图来确定选项,然后控制器捕获该决定并更新会话变量。当前的方法是从config / web.php中读取该会话变量,然后选择适当的配置。

我不确定在应用程序执行期间是否仅一次加载了web.php,实际上我无法检查会话是否处于活动状态,然后从var获取信息。我不确定哪种方法合适。

这是我的config / web.php:

<?php
use yii\web\Session;

$params = require __DIR__ . '/params.php';
$db = require __DIR__ . '/db.php';
$session = Yii::$app->session;
if($session->isActive){
    $mailTransport = Yii::app()->session->get('emailtransport');    
}
else{ //session is not started
    $mailTransport = 'local';
}

if($mailTransport=='local'){
    $config = [
    'id' => 'basic',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'aliases' => [
        '@bower' => '@vendor/bower-asset',
        '@npm'   => '@vendor/npm-asset',
    ],
    'components' => [
        'request' => [
            // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
            'cookieValidationKey' => 'a4ARdWYauHJ-UEAvVfagzk0LTyT_KEuZ',
        ],
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
        'user' => [
            'identityClass' => 'app\models\User',
            'enableAutoLogin' => true,
        ],
        'errorHandler' => [
            'errorAction' => 'site/error',
        ],
        'mailer' => [
            'class' => 'yii\swiftmailer\Mailer',
            'viewPath' => '@app/mail',
            'htmlLayout' => 'layouts/main-html', //template to Send Emails Html based
            'textLayout' => 'layouts/main-text', //template to Send Emails text based
            'messageConfig' => [
               'charset' => 'UTF-8',
               'from' => ['clients@ok.com' => 'OK Premiun Clients'],
             ], //end of messageConfig
            // send all mails to a file by default. You have to set
            // 'useFileTransport' to false and configure a transport
            // for the mailer to send real emails.
            'useFileTransport' => true,
            //'useFileTransport' => false,
            'transport' => [
            'class' => 'Swift_SmtpTransport',
            'host' => 'smtp.gmail.com',
            'username' => 'ok@gmail.com',
            'password' => "password",
            'port' => '465',
            'encryption' => 'ssl',
          ],
        ],
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                ],
            ],
        ],
        'db' => $db,
        /*
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
            ],
        ],
        */
    ],
    'params' => $params,
];
}//end of if loop
else{
    $config = [
    'id' => 'basic',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'aliases' => [
        '@bower' => '@vendor/bower-asset',
        '@npm'   => '@vendor/npm-asset',
    ],
    'components' => [
        'request' => [
            // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
            'cookieValidationKey' => 'a4ARdWYauHJ-UEAvVfagzk0LTyT_KEuZ',
        ],
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
        'user' => [
            'identityClass' => 'app\models\User',
            'enableAutoLogin' => true,
        ],
        'errorHandler' => [
            'errorAction' => 'site/error',
        ],
        'mailer' => [
            'class' => 'yii\swiftmailer\Mailer',
            'viewPath' => '@app/mail',
            'htmlLayout' => 'layouts/main-html', //template to Send Emails Html based
            'textLayout' => 'layouts/main-text', //template to Send Emails text based
            'messageConfig' => [
               'charset' => 'UTF-8',
               'from' => ['ok@namesilo.com' => 'OK Premiun Clients'],
             ], //end of messageConfig
            // send all mails to a file by default. You have to set
            // 'useFileTransport' to false and configure a transport
            // for the mailer to send real emails.
            'useFileTransport' => false,
            'transport' => [
            'class' => 'Swift_SmtpTransport',
            'host' => 'smtp.gmail.com',
            'username' => 'ok@gmail.com',
            'password' => "password",
            'port' => '465',
            'encryption' => 'ssl',
          ],
        ],
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                ],
            ],
        ],
        'db' => $db,
        /*
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
            ],
        ],
        */
    ],
    'params' => $params,
];
}//end of if else loop

由于从未在web.php上到达会话,因此电子邮件始终存储在本地。

2 个答案:

答案 0 :(得分:0)

您要执行的操作要求您从代码内实例化yii\swiftmailer\Mailer类,并通过调用setTransport()来设置传输方式,而不是通过在配置文件中的组件下进行定义来使用它。

我将为您提供一个示例,其中我将使用smtp.gmail.com作为传输的主机并发送电子邮件

public function actionTest(){

    //instantiate the mailer
    $mailer = new \yii\swiftmailer\Mailer(
        [
            'useFileTransport' => false
        ]
    );

    //set the transport params
    $mailer->setTransport(
        [
            'class' => 'Swift_SmtpTransport',
            'host' => 'smtp.gmail.com',
            'username' => 'username',
            'password' => 'password',
            'port' => '587',
            'encryption' => 'tls'
        ]
    );

    //to email 
    $to = "someemail@gmail.com";

    //email subject
    $subject = "this is a test mail";

    //email body 
    $body ="Some body text for email";

    //send the email
    $mailer->compose()->setTo($to)->setFrom(
        [
            'support@site.com' => 'Site Support'
        ]
    )->setTextBody($body)->setSubject($subject)->send();
}

答案 1 :(得分:0)

另一个解决方案是:我使用模型类进行了一些更改:

var addActiveDiv = (timeout = 1850) => {
  var activeEl = document.querySelector(".o-wrapper");
  setTimeout(() => {
    activeEl.classList.add("is-active");
  }, timeout);
}

addActiveDiv();

export { addActiveDiv }

它帮助我简化了web.php,无需使用会话变量。