Использование SwiftMailer на примере формы обратной связи в Yii 2.x

Сегодня рассмотрим работающий пример формы обратной связи с использованием компонента SwiftMailer. Изначально в файл конфигурации web.php components подключим SwiftMailer.

'components' => [
//...
    'mailer' => [
            'class' => 'yii\swiftmailer\Mailer'
            ]
//...
]

Создадим модель MailForm и опишем ее. Используем для примера 3 поля это заголовок, описание и капчу.

namespace app\models;

use Yii;
use yii\base\Model;

class MailForm extends Model
{
    public $title; // заголовок
    public $description; // описание
    public $verifyCode; // капча

    public function rules()
    {
        return [
            //поля обязательные для заполнения  
            [ ['title', 'body'], 'required'],
            // проверка капчи
            ['verifyCode', 'captcha'],
        ];
    }

    public function attributeLabels()
    {
        return [
            'title' => 'Заголовок',
            'description' => 'Описание',
            'verifyCode' => 'Подтвердите код с картинки',
        ];
    }

    // функция отправки формы обратной связи
    public function contact($emailto)
    {
        if ($this->validate()) {
            Yii::$app->mailer->compose()
                ->setFrom('to@mail.ru') // email, от кого отправляем
                ->setTo($emailto) // email, кому отправляем
                ->setSubject($this->title) // заголовок писма
                ->setTextBody($this->description) // тело письма
                ->send();

            return true;
        } else {
            return false;
        }
    }
}

Вторым шагом опишем функцию-обработку отправки формы обратной связи на почту.

    public function actionFix()
    {
        // создаем экземпляр класса описанного выше
        $model = new MailForm();
        // если произошла передача формы и отправка ее, то
        if ($model->load(Yii::$app->request->post()) && $model->contact('from@mail.ru)) 
        {
            // выводим сообщение об успехе и обновляем страницу
            Yii::$app->session->setFlash('contactFormSubmitted');
            return $this->refresh();
        } 
        else 
        {    
            // иначе просто выводим форму
            return $this->render('contact', ['model' => $model]);
        }

    }


Третьим, завершающим шагом, опишем вывод формы в представлении.

use yii\helpers\Html;
use yii\bootstrap\ActiveForm;

$this->title = 'Обратная связь';

?>
// выводим заголовок    
    echo Html::encode($this->title) ?>
    
    // если ошибок нет то выводим информации об успехе отправки формы обратной связи 
    if (Yii::$app->session->hasFlash('fixFormSubmitted'))
        echo "Форма обратной связи отправлена"
    else:
        // выводим форму
        $form = ActiveForm::begin([
            'id' => 'fix-form',
            'options' => ['class' => 'form-horizontal'],
            'fieldConfig' => [
                'template' => "{label}{input}{error}",
            ],
        ]); 
        
            // поле для заголовка
            echo $form->field($model, 'title');
           // тело документа
            echo $form->field($model, 'description')->textArea(['rows' => 6]);
            // капча
            echo $form->field($model, 'verifyCode')->widget(Captcha::className(), [
                'captchaAction' => '/index/captcha',
                'template' => '{image}{input}',
            ]) ?>
            // кнопка отправить
            echo Html::submitButton('Отправить', ['class' => contact-button', 'name' => 'contact-button']);
        
        ActiveForm::end();
    endif;