Toma Tomov
Toma Tomov

Reputation: 1654

Yii2 sending email to gmail account via swift mailer

I am trying to send email via swift mailer.I know there is a lot if similar questions but can't understand where is my problem. I did it just like i saw it in tutorial video in youtube (don't know shall i post the link here) but like always it is ok on the video but not on my project :D I tried with port 465 and encryption ssl also but without result. Will please you for some advice! Thank you in advance!

actionContact:

public function actionContact()
    {
        $model = new ContactForm();

        if ($model->load(Yii::$app->request->post()) && $model->contact(Yii::$app->params['adminEmail'])) {
            Yii::$app->session->setFlash('contactFormSubmitted');

            return $this->refresh();
        }
        return $this->render('contact', [
            'model' => $model,
        ]);
    }

mailer config:

'mailer' => [
            'class' => 'yii\swiftmailer\Mailer',
            'viewPath' => '@app/mail',
            // 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' => '[email protected]',
                'password' => 'password',
                'port' => '587',
                'encryption' => 'tls',
            ],
        ],

and params:

return [
    'adminEmail' => '[email protected]',
];

I am pretty far from familiar with those emails things and i am still learning so please do not get mad at me for the pathetic question :)

EDIT: ContactForm model:

<?php

namespace app\models;

use Yii;
use yii\base\Model;

/**
 * ContactForm is the model behind the contact form.
 */
class ContactForm extends Model
{
    public $name;
    public $email;
    public $title;
    public $body;
    public $verifyCode;


    /**
     * @return array the validation rules.
     */
    public function rules()
    {
        return [
            // name, email, subject and body are required
            [['name', 'email', 'title', 'body'], 'required'],
            // email has to be a valid email address
            ['email', 'email'],
            // verifyCode needs to be entered correctly
            ['verifyCode', 'captcha'],
        ];
    }

    /**
     * @return array customized attribute labels
     */
    public function attributeLabels()
    {
        return [
            'name' => 'Name:',
            'email' => 'Email:',
            'title' => 'Title:',
            'body' => 'Connect with us :)',
            'verifyCode' => 'Verification Code'
        ];
    }

    /**
     * Sends an email to the specified email address using the information collected by this model.
     * @param string $email the target email address
     * @return bool whether the model passes validation
     */
    public function contact($email)
    {
        if ($this->validate()) {
            Yii::$app->mailer->compose()
                ->setTo($email)
                ->setFrom([$this->email => $this->name])
                ->setSubject($this->subject)
                ->setTextBody($this->body)
                ->send();

            return true;
        }
        return false;
    }
}

Upvotes: 0

Views: 3387

Answers (1)

SHIKHAR SINGH
SHIKHAR SINGH

Reputation: 439

I wont boggle you with terms and code at the beginning.Just check whether security for less secure apps is OFF in your google account or not.If it is ON then turn it OFF.If all your settings are correct then this could be the unexpected glitch. Revert to me if that doesn't help. After adding the smtp configuration in config I used this to send my emails(also I don't remember adding any extra params to my config):

 $value=Yii::$app->mailer->compose()
->setFrom('[email protected]')
->setTo($model->emailAddress)
->setSubject($model->subject)
->setHtmlBody($model->content)
->attach($model->attachment)
->send();

where the emailAddress will be filled by various users when they fill out the form, if u have one.If that is not the case and you have the emails stored elsewhere then you will have to fetch them in a php variable and replace $model->emailAddress with that variable.

Upvotes: 1

Related Questions