Приветствую всех.
Плотно изучаю Yii2, Linux и Nginx.
Установил Nginx, установил Yii2, создал отдельные домены под Frontend и Backend, натянул HTML шаблон на пару страниц, установил расширение PHPMailer, и вот когда начал настраивать Контактную форму понял что почта то не отправляется.
Код 4 раза просмотрел вдоль и поперек, вроде ошибок нет. Из-за того, что опыта в принципе нет, мысли такие что на Nginx не настроена отправка почты как таковая. Подскажите пожалуйста кто-нибудь как это дело настроить или в какую сторону копать?
Версия Yii2: 2.0.10
Дистрибутив Linux: Ubuntu 16.10
Версия Nginx: 1.10.1
Версия PHP: 7.0.8-3ubuntu3
На всякий случай код оставлю:
Функция из MainController:
<?php
namespace app\modules\main\controllers;
use frontend\models\ContactForm;
use frontend\models\Image;
use frontend\models\SignupForm;
use yii\base\Response;
use yii\bootstrap\ActiveForm;
public function actionContact()
{
$model = new ContactForm();
if($model->load(\Yii::$app->request->post()) && $model->validate())
{
$body = "<div>Body: <b> " . $model->body . "</b></div>";
$body = "<div>Email: <b> " . $model->email . "</b></div>";
\Yii::$app->common->sendMail($model->subject,$body);
print "Send success!";
die;
}
return $this->render("contact", ['model' => $model]);
}
Модель:
<?php
namespace frontend\models;
use Yii;
use yii\base\Model;
/**
* ContactForm is the model behind the contact form.
*/
class ContactForm extends Model
{
public $name;
public $email;
public $subject;
public $body;
public $verifyCode;
/**
* @inheritdoc
*/
public function rules()
{
return [
// name, email, subject and body are required
[['name', 'email', 'subject', 'body'], 'required'],
// email has to be a valid email address
['email', 'email'],
// verifyCode needs to be entered correctly
['verifyCode', 'captcha', 'captchaAction' => \yii\helpers\Url::to(['main/captcha'])], // site/captcha
];
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'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 email was sent
*/
public function sendEmail($email)
{
return Yii::$app->mailer->compose()
->setTo($email)
->setFrom([$this->email => $this->name])
->setSubject($this->subject)
->setTextBody($this->body)
->send();
}
}
Конфиг PHPMailer
'components' => [
'mail' => [
'class' => 'zyx\phpmailer\Mailer',
'viewPath' => '@common/mail',
'useFileTransport' => false,
'config' => [
'mailer' => 'smtp',
'host' => 'smtp.yandex.ru',
'port' => '465',
'smtpsecure' => 'ssl',
'smtpauth' => true,
'username' => '*MYEMAIL*@yandex.com',
'password' => '*MYPASSWORD*',
'ishtml' => true,
'charset' => 'UTF-8',
],
], ],
Вьюшка:
<div class="row contact">
<div class="col-lg-6 col-sm-6 ">
<?php
$form = yii\bootstrap\ActiveForm::begin();
?>
<?= $form->field($model, 'name') ?>
<?= $form->field($model, 'email') ?>
<?= $form->field($model, 'subject') ?>
<?= $form->field($model, 'body')->textarea(['rows' => 6]) ?>
<?= $form->field($model, 'verifyCode')->widget(\yii\captcha\Captcha::className(), [
'template' => '<div class="row"><div class="col-lg-3">{image}</div><div class="col-lg-6">{input}</div></div>',
'captchaAction' => \yii\helpers\Url::to(['main/captcha'])
]) ?>
<?= \yii\helpers\Html::submitButton('Send Message',['class' => 'btn btn-success']) ?>
<?php
$form = yii\bootstrap\ActiveForm::end();
?>
</div>
<div class="col-lg-6 col-sm-6 ">
<div class="well"><iframe width="100%" height="300" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="../../../maps.google.com/fi000001.002642&t=m&z=14&output=embed" ></iframe></div>
</div>
</div>
Common app:
<?php
namespace frontend\components;
use yii\base\Component;
class Common extends Component{
const EVENT_NOTIFY = 'notify_admin';
public function sendMail($subject,$text,$emailFrom='FROMEMAIL@yandex.ru',$nameFrom='Advert'){
if(\Yii::$app->mail->compose()
->setFrom(['MYEMAIL@yandex.com' => 'Advert'])
->setTo([$emailFrom => $nameFrom])
->setSubject($subject)
->setHtmlBody($text)
->send()){
$this->trigger(self::EVENT_NOTIFY);
return true;
}
}
public function notifyAdmin($event) {
print "Notify Admin";
}
}