Задать вопрос
@MSAFT

Yii2 на Nginx. Как настроить сервер чтоб обращение через форму контактов попадало на емаил?

Приветствую всех.

Плотно изучаю 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";
    }

}
  • Вопрос задан
  • 536 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
@Akellacom
CTO
Пример конфигурации nginx есть тут https://github.com/yiisoft/yii2/blob/master/docs/g...
Ответ написан
Комментировать
проверьте порты. я локально lamp ставил и тоже почта не уходила а залил на хостинг и все заработало
Ответ написан
Комментировать
Exebeche
@Exebeche
Осваиваю программирование
По идее нужно установить и настроить почтовый сервер с SMTP например Postfix
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
26 дек. 2024, в 14:50
2000 руб./за проект
26 дек. 2024, в 14:40
15000 руб./за проект
26 дек. 2024, в 14:27
100000 руб./за проект