Laravel - изменение настроек электронной почты на лету не работает - PullRequest
2 голосов
/ 30 марта 2019

Все мои настройки электронной почты для моего приложения хранятся в базе данных. У пользователя есть возможность изменить эти настройки, и все это прекрасно работает. Но я пытаюсь настроить функцию «Отправить тестовое электронное письмо», чтобы пользователи могли проверить свои настройки перед сохранением. Когда они отправляют форму для отправки тестового электронного письма, электронное письмо отправляется с использованием исходных настроек, а не новых настроек.

Форма отправлена ​​в SettingsController.php

//  Send a test email
public function sendTestEmail(Request $request)
{
   Log::info(config('mail.host'));  
   //  Just to check the current email host - shows the proper host 
   //  from the database - i.e. smtp.mailtrap.io

   //  Make sure that all of the information properly validates
   $request->validate([
       'host'       => 'required',
       'port'       => 'required|numeric',
       'encryption' => 'required',
       'username'   => 'required'
   ]);

   //  Temporarily set the email settings
   config([
       'mail.host'       => $request->host,
       'mail.port'       => $request->port,
       'mail.encryption' => $request->encryption,
       'mail.username'   => $request->username,
   ]);
   //  Only update the password if it has been changed
   if(!empty($request->password))
   {
       config(['mail.password' => $request->password]);
   }

   //  Try and send the test email
   try
   {
       Log::info(config('mail.host'));
       //  Just to check the new setting - this also shows the correct
       //  email host - which is the newly assigned one via the form 
       //  i.e. smtp.google.com

       Mail::to(Auth::user()->email)->send(new TestEmail());
       return response()->json([
           'success' => true,
           'sentTo'  => Auth::user()->email
       ]);
   }
   catch(Exception $e)
   {
       Log::notice('Test Email Failed.  Message: '.$e);
       $msg = '['.$e->getCode().'] "'.$e->getMessage().'" on line '.
            $e->getTrace()[0]['line'].' of file '.$e->getTrace()[0]['file'];
       return response()->json(['message' => $msg]);
   }
}

В моем классе TestEmail я привел его к основам

namespace App\Mail;

//use Illuminate\Bus\Queueable;  //  Commented out to be sure it is not queuing
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
//use Illuminate\Contracts\Queue\ShouldQueue;  //  Commented out to be sure it is not queuing

class TestEmail extends Mailable
{
//    use Queueable, SerializesModels;  //  Commented out to be sure it is not queuing

 /**
 * Create a new message instance.
 *
 * @return void
 */
public function __construct()
{
    //
}

/**
 * Build the message.
 *
 * @return $this
 */
public function build()
{
    return $this->subject('Test Email From '.config('app.name'))->markdown('email.testEmail');
}
}

Несмотря на то, что в журналах отображается обновленный узел smtp для параметра конфигурации, сообщение по-прежнему отправляется через исходную настройку - т.е. smtp.mailtrap.io.

1 Ответ

0 голосов
/ 30 марта 2019

Вы можете установить / изменить любую конфигурацию на лету, используя Config :: set:

Config::set('key', 'value'); Итак, чтобы установить / изменить порт в mail.php, вы можете попробовать это:

Config::set('mail.port', 587); // default

Примечание : значения конфигурации, установленные во время выполнения, устанавливаются только для текущего запроса и не будут перенесены в последующие запросы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...