Как использовать swiftMailer в Yii2

Я не могу окончательно понять, как использовать расширение swiftMailer в Yii2. Судя по тому вопросов по этой теме я не нашел, задача тривиальная, но до конца так и не смог разобраться.

Есть примеры, которые не описывают более подробно весь цикл отправки письма или я чего-то не понимаю :(

Настройка

    return [
    //....
   'components' => [
    ......
    'mail' => [
      'class' => 'yii\swiftmailer\Mailer',
      'transport' => [
        'class' => 'Swift_SmtpTransport',
        'host' => 'localhost',
        'username' => 'username',
        'password' => 'password',
        'port' => '587',
        'encryption' => 'tls',
      ],
    ],
  ]
];

Отправить

Yii::$app->mail->compose()
->setTo($toEmail)
->setFrom([$this->email => $this->name])
->setSubject($this->subject)
->setTextBody($this->body)
->send();

Хочу получит конкретный рабочий пример. Спасибо.

P.S. Настроил доменные записи MX, DKIM, добавил SPF.

UPD (какой-то ответ):

E-mail, который передается в поле "От", проставляется по умолчанию в поле "Обратный путь", должен быть существующий адрес. Некоторые провайдеры не разрешают отправлять почту с несуществующих адресов электронной почты.


person frops    schedule 28.07.2014    source источник


Ответы (6)


Убедитесь, что вы инициализировали свое приложение в производственной среде для отправки электронных писем из вашего приложения, иначе оно будет записано в папку mailoutput. Или вручную отредактируйте файл конфигурации, как показано ниже.

В разделе компонентов вашего common/main-local.php

'mail' => [
        'class' => 'yii\swiftmailer\Mailer',
        'viewPath' => '@backend/mail',
        'useFileTransport' => false,//set this property to false to send mails to real email addresses
        //comment the following array to send mail using php's mail function
        'transport' => [
            'class' => 'Swift_SmtpTransport',
            'host' => 'smtp.gmail.com',
            'username' => '[email protected]',
            'password' => 'password',
            'port' => '587',
            'encryption' => 'tls',
            ],
    ],

В вашем контроллере

    \Yii::$app->mail->compose('your_view', ['params' => $params])
    ->setFrom([\Yii::$app->params['supportEmail'] => 'Test Mail'])
    ->setTo('[email protected]')
    ->setSubject('This is a test mail ' )
    ->send();

Это должно работать! Надеюсь, что это поможет вам!

person Dency G B    schedule 30.07.2014
comment
Благодарю вас! Я уже нашел ответ. Оказывается, некоторые провайдеры получают только существующую электронную почту в поле обратного пути. - person frops; 30.07.2014
comment
Глядя на пример сброса пароля, должен ли он быть mailer, а не mail yourApp-›frontend-›models-›PasswordResetRequestForm.php - person johnsnails; 30.11.2014
comment
Привет, Денси ГБ, я новичок в yii2 и фреймворке. Не могли бы вы объяснить, где я должен ввести код, предложенный для контроллера. должен ли я поместить его под новый контроллер/действие и как его использовать или поместить его под создание или обновление. Спасибо. - person Joshi; 10.01.2015

Вам не нужно использовать транспорт SMTP с swiftmailer, только удалите 'useFileTransport' => true в файле конфигурации (app/config/web.php в базовом шаблоне), и почта будет течь.

Посмотрите в документах:

http://www.yiiframework.com/doc-2.0/ext-swiftmailer-index.html

person uselma    schedule 25.07.2015

Предупреждение: эта опция больше недоступна, так как Mandrill был куплен Mailchimp.

Иногда могут возникнуть проблемы с использованием SwiftMailer, не зависящие от вас. Например, когда я пользовался почтовым сервером mail.ru. Я нашел решение в сообществе laravel и реализовал его в Yii2.

Вы можете использовать альтернативный сервис, такой как https://mandrillapp.com/ (12 тыс. писем в месяц, 250 в час бесплатно) и настроить, как показано ниже:

почта сообщества / настройки laravel с мандрилом

'host' => 'smtp.mandrillapp.com',
'username' => '[email protected]',
'password' => 'oDLKswXZIkry8634f1jCDg', // new generated API key by mandrill
'port' => '587',
'encryption' => 'tls',

Если вы используете электронную почту Gmail, вы также можете столкнуться с проблемой безопасности. Вы можете отключить безопасность, разрешив приложению использовать вашу учетную запись gmail.

Если вы вошли в систему с помощью Google, используйте ссылки ниже:

https://www.google.com/settings/security/lesssecureapps

Надеюсь, это поможет кому-то

person sambua    schedule 16.01.2015
comment
Больше не бесплатная услуга. - person crafter; 26.06.2016

Если вы используете базовый шаблон, вам нужно будет добавить

'viewPath' => '@app/mail',

к конфигу

person Martin    schedule 14.12.2014

Опция безопасности Google Gmail

https://myaccount.google.com/lesssecureapps

Путь к файлу проекта

config\web.php
'mailer' => [
    'class' => 'yii\swiftmailer\Mailer',
    'useFileTransport' => false,
    'transport' => [
        'class' => 'Swift_SmtpTransport',
        'host' => 'smtp.gmail.com',  
        'username' => '[email protected]',
        'password' => 'email_password',
        'port' => '465',
        'encryption' => 'ssl',
        'streamOptions' => [ 
            'ssl' => [ 
            'allow_self_signed' => true,
            'verify_peer' => false,
            'verify_peer_name' => false,
            ],
        ]
    ]
],

Добавьте функцию внутри вашего контроллера

public function actionSend() {
    $send = Yii::$app->mailer->compose()
    ->setFrom('[email protected]')
    ->setTo('[email protected]')
    ->setSubject('Test Message')
    ->setTextBody('Plain text content. YII2 Application')
    ->setHtmlBody('<b>HTML content <i>Ram Pukar</i></b>')
    ->send();
    if($send){
        echo "Send";
    }
}
person Ram Pukar    schedule 05.11.2018

На самом деле вы должны использовать конфигурационный ключ mailer вместо mail.

'components' => [
...
    'mailer' => [
        'class' => 'yii\swiftmailer\Mailer',
        'transport' => [
            'class' => 'Swift_SmtpTransport',
            'host' => 'localhost',
            'username' => 'username',
            'password' => 'password',
            'port' => '587',
            'encryption' => 'tls',
        ],
    ],
...
],
person MichalB    schedule 09.05.2017