Почему не отправляется почта?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Deyan
Сообщения: 14
Зарегистрирован: 2018.01.18, 19:59

Почему не отправляется почта?

Сообщение Deyan » 2018.10.10, 21:24

Приветствую, форумчане.


Почему-то письма отправляются самому пользователю а не админу. Как перенастроить?
Смена setTo на setFrom не срабатывает.


Controller - IndexController (extends AppController)
Форма -СontactForm
Вид - views/index/contact.php

ContactForm

Код: Выделить всё

<spoiler title="">
<?php

namespace app\models;

use Yii;
use yii\db\ActiveRecord;
use yii\db\Expression;


error_reporting(E_ALL);
 /**
 * This is the model class for table "contactform".
 *
 * @property string $id
 * @property string $name
 * @property string $email
 * @property integer $subject
 * @property double $body
 * @property string $verifyCode
 
 */

class Contactform extends ActiveRecord
{
    public $id;
    public $name;
    public $email;
    public $subject;
    public $body;
    public $verifyCode;


     public static function tableName()
    {
        return 'contactform';
    }
    /**
     * @return array the validation rules.
     */
    public function rules()
    {
        return [
       
           /* Поля обязательные для заполнения */
            [ ['name', 'email', 'subject', 'body'], 'required'],
            /* Поле электронной почты */
            ['email', 'email'],
            /* Капча */
            ['verifyCode', 'captcha', 'captchaAction'=>'index/captcha'],
          /*  ['verifyCode', 'captcha','captchaAction'=>'/contactus/default/captcha'],*/

        ];

    }

    /**
     * @return array customized attribute labels
     */
    public function attributeLabels()
    {
        return [
            'verifyCode' => 'Подтвердите код',
            'name' => 'Имя',
            'email' => 'Электронный адрес',
            'subject' => 'Тема',
            'body' => 'Сообщение',
        ];
    }

    /**
     * Sends an email to the specified email address using the information collected by this model.
     * @param  string  $email the target email address
     * @return boolean whether the model passes validation
     */
   
     
  

         public function contact($adminEmail)
    {
        if ($this->validate()) {
          
             Yii::$app->mailer->compose()
            ->setFrom(Yii::$app->params['adminEmail']) /* от кого */
            ->setTo([$this->email => $this->name]) 
            // ->setFrom([$this->email => $this->name]) 
           //  ->setFrom(Yii::$app->params['adminEmail']) 
         //   ->setTo($adminEmail)
           //    ->setFrom([$this->email => $this->name])
              //  ->setTo([$this->email => $this->name])
             //  ->setFrom ($adminEmail)
            //  ->setTo([$adminEmail])
            //  ->setFrom ([$this->email => $this->name]) 
             //  ->setFrom([$this->email => $this->name]) 

            // ->setTo(['medeyacom@mail.ru' => $this->name])
            //->setTo($adminEmail)
             
              ->setSubject($this->subject) /* имя отправителя */
              ->setTextBody($this->body) /* текст сообщения */
               ->send();

              return true;
             } 
          return false;
            
        
    }
                   
 }               






</spoiler>

config/web

Код: Выделить всё

<spoiler title="">
  'mailer' => [
         'class' => 'yii\swiftmailer\Mailer',
            // 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, //если false то письма будут отпр. если true то в папке runtime 
            'transport'=>[
                'class' => 'Swift_SmtpTransport',     
                'host' => 'smtp.mail.ru',
                'port' => '465', // для mail.ru
                'encryption' => 'ssl', // tls
                'username' => 'username@mail.ru',
                'password' => 'password',
                
              // 'host' => 'smtp.gmail.com',
              /* 'options' => array('hostname' => 'smtp.gmail.com',*/
             //   'username' => 'username@gmail.com',
             //   'password' => 'password',
             //   'port' => '25',
             //   "encryption" => ("tls"),
               // 'viewPath' => '@common/mail',
            ],
        ],

</spoiler>

IndexController

Код: Выделить всё

<spoiler title="">
<?php


namespace app\controllers;

use Yii;
use yii\App\Controller;
use app\models\ContactForm;
use yii\web\Request;




class IndexController extends AppController
{


  public function actions()
    {
        return [
            'captcha' => [
                'class' => 'yii\captcha\CaptchaAction',
                'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
            ]
        ];
    }
    public function actionContact()
        {
        $model = new ContactForm();
        /*if ($model->load(Yii::$app->request->post()) && $model->contact(setting::ADMIN_EMAIL_ADDRESS))*/
         if ($model->load(Yii::$app->request->post()) && $model->contact(Yii::$app->params['adminEmail']))
         {
            Yii::$app->session->setFlash('contactFormSubmitted');

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

  

   
}
    

 
</spoiler>




SiteControler

Код: Выделить всё

<spoiler title="">
<?php

namespace app\controllers;

use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\filters\VerbFilter;
use app\models\LoginForm;
use app\models\ContactForm;
//use app\models\MailerForm;

class SiteController extends Controller
{
     public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'only' => ['logout'],
                'rules' => [
                    [
                        //'actions' => ['logout'],
                        'actions' => ['captcha','index','logout'],
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                ],
            ],
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'logout' => ['post','get'],
                ],
            ],
        ];
    }

    
    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
            'captcha' => [
                'class' => 'yii\captcha\CaptchaAction',
                'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
            ],
        ];
    }

  

    public function actionIndex()
    {
       $model = new ContactForm();
        if ($model->load(Yii::$app->request->post()) && $model->contact(setting::ADMIN_EMAIL_ADDRESS)) {
            Yii::$app->session->setFlash('contactFormSubmitted');

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

   

    public function actionLogin()
    {
        if (!\Yii::$app->user->isGuest) {
            return $this->goHome();
        }

        $model = new LoginForm();
        if ($model->load(Yii::$app->request->post()) && $model->login()) {
            return $this->goBack();
        }
        return $this->render('login', [
            'model' => $model,
        ]);
    }

    public function actionLogout()
    {
        Yii::$app->user->logout();

        return $this->goHome();
    }

   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,
        ]);
    }

    public function actionAbout()
    {
        return $this->render('about');
    }

  /*  public function actionMailer()
    {
        $model = new MailerForm();
        if ($model->load(Yii::$app->request->post()) && $model->sendEmail()) {
            Yii::$app->session->setFlash('mailerFormSubmitted');
            return $this->refresh();
        }
          return $this->render('mailer', [
              'model' => $model,
          ]);
    }*/

}

    



</spoiler>


Аватара пользователя
carono
Сообщения: 49
Зарегистрирован: 2018.04.28, 11:05

Re: Почему не отправляется почта?

Сообщение carono » 2018.10.10, 21:35

“от кого” совпадает с username из настроек транспорта?Ошибки в логах есть?

Deyan
Сообщения: 14
Зарегистрирован: 2018.01.18, 19:59

Re: Почему не отправляется почта?

Сообщение Deyan » 2018.10.10, 22:43

В логах ошибок нет, почта отправляется только самому отправителю, а не админу.

Код: Выделить всё

'transport'=>[
                'username' => 'adminmail@mail.ru',
setFrom - у меня стоит ->setFrom(Yii::$app->params['adminEmail']) т.е. от админа, а нужно, получается, от пользователя.

Но если указать наоборот

Код: Выделить всё

->setFrom([$this->email => $this->name]) 
 -> setTo(Yii::$app->params['adminEmail']) 
то ничего не отправляется, в форме просто сообщение об отправке.
Или в username тоже нужно указывать, что от пользователя?

Аватара пользователя
proctoleha
Сообщения: 260
Зарегистрирован: 2016.07.10, 19:00

Re: Почему не отправляется почта?

Сообщение proctoleha » 2018.10.11, 06:11

Если у вас домен site.ru и почта, вида info@site.ru, привязанная к mail.ru, то все сообщения отправляем только от имени info@site.ru, в том числе и самому себе.
Вот за что я не люблю линукс, так это за свои кривые, временами, руки

Deyan
Сообщения: 14
Зарегистрирован: 2018.01.18, 19:59

Re: Почему не отправляется почта?

Сообщение Deyan » 2018.10.11, 16:05

Нет у меня домен http://yii2.loc, почта админа username@mail.ru, оправляю с локального сервера.

someweb
Сообщения: 540
Зарегистрирован: 2017.03.09, 10:12

Re: Почему не отправляется почта?

Сообщение someweb » 2018.10.11, 16:16

mail.ru не даст отправить почту от имени другого пользователя, без вариантов.
Почту пользователя можно вставить в replyTo.
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.

Deyan
Сообщения: 14
Зарегистрирован: 2018.01.18, 19:59

Re: Почему не отправляется почта?

Сообщение Deyan » 2018.10.11, 17:31

Но там не пользователь даже, т.к авторизация есть только для админа.

Попытка отправить на gmail.com также не удалась

Error: Swift_TransportException
Failed to authenticate on SMTP server with username "username@gmail.com" using 3 possible authenticators. Authenticator LOGIN returned Swift_TransportException: Expected response code 235 but got code "534", with message "534-5.7.14


ContactForm

Код: Выделить всё

<spoiler title="">

         public function contact($adminEmail)
    {
        if ($this->validate()) {
          
             Yii::$app->mailer->compose()
      
 ->setFrom([$this->email => $this->name, 'username@gmail.com' => 'yii2.loc']) 
    ->setTo(Yii::$app->params['adminEmail'])

                          
              ->setSubject($this->subject) /* имя отправителя */
              ->setTextBody($this->body) /* текст сообщения */
               ->send();

              return true;
             } 
          return false;
            
        
    }
        
</spoiler>
config/web

Код: Выделить всё

<spoiler title="">
  'mailer' => [
         'class' => 'yii\swiftmailer\Mailer',
            // 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, //если false то письма будут отпр. если true то в папке runtime 
            'transport'=>[
                'class' => 'Swift_SmtpTransport',     
            
               'host' => 'smtp.gmail.com',
             
               'username' => 'username@gmail.com',
                'password' => 'password',
                'port' => '25',
                "encryption" => ("tls"),
               //'viewPath' => '@common/mail',
            ],
        ],
</spoiler>

Код: Выделить всё

Почту пользователя можно вставить в replyTo.
Каким образом и где?

Deyan
Сообщения: 14
Зарегистрирован: 2018.01.18, 19:59

Re: Почему не отправляется почта?

Сообщение Deyan » 2018.10.12, 15:28

У меня на сайте 2 роли - @ - авторизованныц пользователь (админ)
? - неаторизованый пользователь.

smtp mail.ru требует авторизации и письма отправляться должны от того пользователя, который авторизуется. и там ограничение на количество отправляемых есть. 15 писем в час, кажется,

Проверил на другом проекте и письмо от авторизованного пользователя (админа) отправилось, правда тоже и админу.

Вариантов, как отправить письмо от незарег. пользователя не нашёл нигде, т.е. придётся делать систему авторизации из 3 родей

- админ
- пользователь
- незарег.польз.

и в контактной форме выводить сообщение типа: "Чтобы отправить письмо, Вы должны авторизоваться" -- но это тоже так себе вариант(

someweb
Сообщения: 540
Зарегистрирован: 2017.03.09, 10:12

Re: Почему не отправляется почта?

Сообщение someweb » 2018.10.12, 15:50

->setReplyTo($this->email)

Забудьте про авторизацию на сайте, она тут роли не играет.
Все письма надо отправлять от пользователя user@mail.ru и все.
Если не хватает лимита отправки ищите другой (платный) или настройте свой.
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.

Deyan
Сообщения: 14
Зарегистрирован: 2018.01.18, 19:59

Re: Почему не отправляется почта?

Сообщение Deyan » 2018.10.12, 18:40

Забудьте про авторизацию на сайте, она тут роли не играет.
Вот именно, что играет https://support.webasyst.ru/forum/12845 ... yet-given/

Код: Выделить всё

Все письма надо отправлять от пользователя user@mail.ru и все.
От какого пользователя? Где вы его взяли? У меня на сайте не пользователей, есть только гость и авторизованный пользователь(админ)
[/code]

Код: Выделить всё

Если не хватает лимита отправки ищите другой (платный) или настройте свой.
Какой ещё лимит нужен гостю, чтобы отправить 1 сообщение? Lol

Deyan
Сообщения: 14
Зарегистрирован: 2018.01.18, 19:59

Re: Почему не отправляется почта?

Сообщение Deyan » 2018.10.12, 19:02

Код: Выделить всё

->setReplyTo($this->email)
Да, вот эта встроенная функция в php меня сейчас интересует.

т.к. пробовал отправить письмо в другом проекте, где есть авторизация от зарег. пользователя, но выскочила ошибка

Код: Выделить всё

/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/SimpleMessage.php в строке 496
Ответ нашёл здесь

Код: Выделить всё

https://stackoverflow.com/questions/50036576/without-swiftmailer-how-to-send-mail-in-laravel
Все это было сделано так как там рекомендовалось - в настройках модуля сменил версию php на php - 7.64, Msql - 5.5.-x64, Apache- php-7-x64 ,перенёс sql файл с таблицами, подправив в нем версию php.

Пробую обновить swiftmailer до 6.00 и в консоли выдает, что моя версия 5.5.38 ((

Теперь 3 вариант..по поводу встроенной функции, не совсем ясно, как это реализовать в коде [urlhttp://php.net/manual/en/function.mail.php[/url]

Пример из док.

Код: Выделить всё

<?php
$to      = 'nobody@example.com';
$subject = 'the subject';
$message = 'hello';
$headers = 'From: webmaster@example.com' . "\r\n" .
    'Reply-To: webmaster@example.com' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers);
?>
Как в моём экшене contact ContactForm это должно выглядеть?
Как добавить парам. header? И что должно быть в конфиге?

Так, конечно, не верно..

Код: Выделить всё

 public function sendEmail($adminEmail)
    {
        return Yii::$app->mailer->compose()
          -setFrom ([$this->email => $this->name, 'adminmail@mail.ru' => 'yii2.loc']) 
         ->setTo(Yii::$app->params['adminEmail']) 
          ->setSubject('Админ') 
         ->setTextBody('Добрый день! Ваше сообщение принято!')->setCharset('UTF-8') 
         ->setHeaders = array(
				'From' => ''здесь должна быть почта отправителя, но как передать?",
				'Reply-To' => 'admin@mail.ru',
				'X-Mailer' => 'PHP/' . phpversion(здесь должна указываться версия? )*/
			//	);
		//  ->send(); 

			mail($to, $subject, $message, $headers);

Deyan
Сообщения: 14
Зарегистрирован: 2018.01.18, 19:59

Re: Почему не отправляется почта?

Сообщение Deyan » 2018.10.12, 19:17

Если в таком варианте, то отправляет и пользователю и админу сообщение о том, что "Ваше сообщение принято". Самого сообщения админ, естественно, не видит также

Код: Выделить всё

public function contact()
{
     Yii::$app->mailer->compose()
         ->setFrom(Yii::$app->params['adminEmail']) 
         ->setTo([$this->email => $this->name, 'admin@mail.ru' => 'yii2.loc']) 
         ->setSubject('Админ') 
         ->setTextBody('Добрый день! Ваше сообщение принято!')->setCharset('UTF-8') 
         ->setReplyTo($this->email)
         ->send(); 
 
     return true;    
}
Есть добавить сохранение в таблицу 'contactform' в бд, то тоже не сохраняет ничего


Код: Выделить всё

public function saveForm()
{
    if($this->save() && $this->validate()) {
         return $this->contact();
    } 						
 
    return false;
}

someweb
Сообщения: 540
Зарегистрирован: 2017.03.09, 10:12

Re: Почему не отправляется почта?

Сообщение someweb » 2018.10.12, 20:42

Смешались в кучу кони, люди...
PHP в общем и swiftmailer в частности глубоко фиолетово на вашу авторизацию.
В вашем первом посте есть конфиг

Код: Выделить всё

            'transport'=>[
                'class' => 'Swift_SmtpTransport',     
                'host' => 'smtp.mail.ru',
                'port' => '465', // для mail.ru
                'encryption' => 'ssl', // tls
                'username' => 'username@mail.ru',
                'password' => 'password',
mail.ru не примет письмо, если в from не будет username@mail.ru.
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.

Deyan
Сообщения: 14
Зарегистрирован: 2018.01.18, 19:59

Re: Почему не отправляется почта?

Сообщение Deyan » 2018.10.12, 22:52

Поправил форму, письмо с текстом наконец-то доходит админу!

Код: Выделить всё

public function contact($email)
    {
        if ($this->validate()) {
            Yii::$app->mailer->compose()
                ->setTo($email)
                ->setFrom(['admin@mail.ru' => $this->name])
                ->setSubject('Сообщение от посетителя '.$this->name)
                ->setTextBody($this->body)
                ->send();

            return true;
        } else {
            return false;
        }
Но в бд по прежнему, ничего не сохраняет. :?

myks1992@mail.ru
Сообщения: 121
Зарегистрирован: 2017.11.15, 23:54

Re: Почему не отправляется почта?

Сообщение myks1992@mail.ru » 2018.10.13, 00:26

Код: Выделить всё

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,
        ]);
    }
Добавьте

Код: Выделить всё

$model->save()
Вот так

Код: Выделить всё

public function actionContact()
    {
        $model = new ContactForm();
        if ($model->load(Yii::$app->request->post()) 
        	&& $model->contact(Yii::$app->params['adminEmail']) 
        	&& $model->save() ) {
            Yii::$app->session->setFlash('contactFormSubmitted');

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

Deyan
Сообщения: 14
Зарегистрирован: 2018.01.18, 19:59

Re: Почему не отправляется почта?

Сообщение Deyan » 2018.10.16, 14:09

Код: Выделить всё

$model->save()
У меня, получается, actionContact() есть и в SiteController

Код: Выделить всё

 public function actionContact()
    {
        $model = new ContactForm();
        if ($model->load(Yii::$app->request->post()) && $model->contact(Yii::$app->params['adminEmail'])
&& $model->save()
            ) {
            Yii::$app->session->setFlash('contactFormSubmitted');

            return $this->refresh();
        }
        return $this->render('contact', [
            'model' => $model,
        ]);
    }
и в IndexController (для contact)

IndexController

Код: Выделить всё

<?php


namespace app\controllers;

use Yii;
use yii\App\Controller;
use app\models\ContactForm;
use yii\web\Request;




class IndexController extends AppController
{


  public function actions()
    {
        return [
            'captcha' => [
                'class' => 'yii\captcha\CaptchaAction',
                'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
            ]
        ];
    }
    public function actionContact()
        {
        //$this->layout = 'contact';
        $model = new ContactForm();
      
     
        if ($model->load(Yii::$app->request->post()) && $model->contact(Yii::$app->params['adminEmail']) 
          
      //    && $model->save()

   
          )
          
         {
            Yii::$app->session->setFlash('contactFormSubmitted');

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

            ]);
        }
    }   
  }
   
Но если

Код: Выделить всё

$model->save()
добавить в IndexController, то не срабатывает валидация т.е. после заполнения контактной формы появляется ошибка проверочного кода, но письмо все ровно отправляется на почту с сообщением.

Вообще, в ContactForm уже есть экшен saveForm()

Код: Выделить всё

public function saveForm()
{
    if($this->save() && $this->validate()) {
         return $this->contact();
    }

 
   return false;
}

Может быть во view что-то с полем id ActiveForm?

Код: Выделить всё

 'id' => 'contact-form',  

Код: Выделить всё

    <?php $form = ActiveForm::begin([
                'id' => 'contact-form',  
                
                /* Идентификатор формы */
                'options' => ['class' => 'form-horizontal'], /* класс формы */
                'fieldConfig' => [ /* классы полей формы */
                    'template' => "<div class=\"col-lg-3\">{label}</div>\n<div class=\"col-lg-9\">{input}</div>\n<div class=\"col-lg-12 col-lg-offset-3 \">{error}</div>"
               
                ],
            ]); ?>

Ответить