Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在使用Laravel在控制器中发送邮件之前更改邮件配置?_Php_Email_Laravel - Fatal编程技术网

Php 如何在使用Laravel在控制器中发送邮件之前更改邮件配置?

Php 如何在使用Laravel在控制器中发送邮件之前更改邮件配置?,php,email,laravel,Php,Email,Laravel,我使用的是Laravel 4,我想更改控制器中的邮件配置(如driver/host/port/…),因为我想将配置文件保存在具有不同邮件配置的数据库中。这是使用config/mail.php中的配置发送邮件的基本方法 Mail::send( 'emails.responsable.password_lost', array(), function($message) use ($responsable){ $message->to($responsa

我使用的是Laravel 4,我想更改控制器中的邮件配置(如driver/host/port/…),因为我想将配置文件保存在具有不同邮件配置的数据库中。这是使用config/mail.php中的配置发送邮件的基本方法

Mail::send(
    'emails.responsable.password_lost',
    array(),
    function($message) use ($responsable){
        $message->to($responsable->email, $responsable->getName());
        $message->subject(Lang::get('email.password_lost'));
    });
我试着放一些类似的东西,但没用

 $message->port('587');
谢谢你的支持


Jean

您可以使用
Config::set
动态设置/更改任何配置:

Config::set('key', 'value');
因此,要在
mail.php
中设置/更改端口,您可以尝试以下方法:

Config::set('mail.port', 587); // default
注意:运行时设置的配置值仅针对 当前请求,并且不会结转到后续请求


更新

所选答案对我无效,我需要添加以下内容才能注册更改

Config::set('key', 'value');
(new \Illuminate\Mail\MailServiceProvider(app()))->register();

我知道有点晚了,但一种方法可能是提供一个快速的邮递员到拉拉威尔邮递员

<?php

$transport = (new \Swift_SmtpTransport('host', 'port'))
    ->setEncryption(null)
    ->setUsername('username')
    ->setPassword('secret');

$mailer = app(\Illuminate\Mail\Mailer::class);
$mailer->setSwiftMailer(new \Swift_Mailer($transport));

$mail = $mailer
    ->to('user@laravel.com')
    ->send(new OrderShipped);

如果您希望创建一个
Laravel 7
应用程序,允许用户注册并登录您的应用程序,并且您希望让每个用户都能够使用自己独特的电子邮件地址和密码通过您的平台发送电子邮件

解决方案:

Route::group(['middleware' => [ 'auth:api' ]], function () {
  Route::post('send/email', 'Controller@test_mail')->middleware('mail');
});
  • Laravel模型:首先需要创建一个数据库表来存储用户的电子邮件配置数据。接下来,您需要一个有说服力的模型来检索经过身份验证的用户id,以便动态获取他们的电子邮件配置数据
  • Laravel服务提供商:接下来,创建一个服务提供商,该服务提供商将使用模型类中的作用域方法查询数据库中用户的电子邮件配置,并将其设置为默认邮件配置。不要在
    config/app.php
  • Laravel中间件:还创建一个中间件,当用户经过身份验证并注册服务提供商时运行该中间件
  • 实施模型

    进行迁移。从命令行
    php artisan make:migration创建\用户\电子邮件\配置\表格
    运行这些命令。然后:

    Schema::create('user_email_configurations', function (Blueprint $table) {
      $table->id();
      $table->string('user_id');
      $table->string('name');
      $table->string('address');
      $table->string('driver');
      $table->string('host');
      $table->string('port');
      $table->string('encryption');
      $table->string('username');
      $table->string('password');
      $table->timestamps();
    });
    
    完成并创建您的模型。运行php artisan migrate
    php artisan make:model userEmailConfiguration
    。现在在模型中添加一个scope方法

    <?php
      namespace App;
      use Illuminate\Support\Facades\Auth;
      use Illuminate\Database\Eloquent\Model;
    
    class userEmailConfiguration extends Model
    {
      protected $hidden = [
        'driver',
        'host',
        'port',
        'encryption',
        'username',
        'password'
      ];
      public function scopeConfiguredEmail($query) {
        $user = Auth::user();
        return $query->where('user_id', $user->id);
      }
    }
    
    实现中间件

    运行以下命令-
    php artisan make:middleware MailService

    <?php
      namespace App\Http\Middleware;
      use Closure;
      use App;
    class MailService
    {
      public function handle($request, Closure $next)
      {
        $app = App::getInstance();
        $app->register('App\Providers\MailServiceProvider');
        return $next($request);
      }
    }
    
    这是我的原帖-

    谢谢!正如我所期待的,我也面临着类似的问题。我已经创建了一个服务提供者
    MailServiceProvider
    ,并声明了
    Config::set('mail.port',587)
    Config::set('mail.driver',smtp)
    register()函数中这样设置。但它似乎不起作用。感谢您的帮助:)原始问题:您不应该像这样在运行时更改配置设置。改为使用数据库。@Saurabh Config::set()在boot()中工作,至少在Meth中是这样的。当我在处理Laravel 4.2时,这个解决方案非常有用。我不再使用Laravel了,你可能想打开另一个线程来获得关于Laravel 5+的答案。祝你好运谢谢,帮了很多忙!这是在L5.1上对我有效的唯一方法。使用邮件facade会不规则地恢复为默认邮件提供程序
    
    Route::group(['middleware' => [ 'auth:api' ]], function () {
      Route::post('send/email', 'Controller@test_mail')->middleware('mail');
    });