gpt4 book ai didi

php - 在 Laravel 4 中更改邮件传输

转载 作者:太空宇宙 更新时间:2023-11-03 17:00:35 25 4
gpt4 key购买 nike

L4 似乎被硬编码为将 SMTP 与 Swiftmailer 一起使用。我们如何将传输类型更改为 sendmail?

最佳答案

这不像将一种传输方式换成另一种传输方式那么容易。如您所说,传输在 Illuminate\Mail\MailServiceProvider 中进行了硬编码。

您可能想用您自己的扩展 L4 邮件实现,将其替换到您的 config/app.php Providers 数组中:

  • 替换邮件提供商的提供商数组:

配置/app.php

...
'providers' => array(
'SendmailServiceProvider',
  • 将sendmail路径添加到二进制:

配置/邮件.php

'sendmail_path' => '/usr/bin/sendmail -bs',
  • 确保您的 composer.json 文件自动加载“来自应用程序/库的类映射:”

Composer .json:

....    
"autoload": {
"classmap": [
"app/libraries",
....
  • 添加您的 Sendmail 服务提供商:

应用程序/库/SendmailServiceProvider.php

<?php

use \Swift_Mailer;
use Illuminate\Support\ServiceProvider;
use Illuminate\Mail\Mailer as Mailer;
use Swift_SendmailTransport as SendmailTransport;

class SendmailServiceProvider extends ServiceProvider {

/**
* Indicates if loading of the provider is deferred.
*
* @var bool
*/
protected $defer = true;

/**
* Register the service provider.
*
* @return void
*/
public function register()
{
$this->registerSwiftMailer();

$this->app['mailer'] = $this->app->share(function($app)
{
// Once we have create the mailer instance, we will set a container instance
// on the mailer. This allows us to resolve mailer classes via containers
// for maximum testability on said classes instead of passing Closures.
$mailer = new Mailer($app['view'], $app['swift.mailer']);

$mailer->setLogger($app['log']);

$mailer->setContainer($app);

$from = $app['config']['mail.from'];

// If a "from" address is set, we will set it on the mailer so that all mail
// messages sent by the applications will utilize the same "from" address
// on each one, which makes the developer's life a lot more convenient.
if (is_array($from) and isset($from['address']))
{
$mailer->alwaysFrom($from['address'], $from['name']);
}

return $mailer;
});
}

/**
* Register the Swift Mailer instance.
*
* @return void
*/
protected function registerSwiftMailer()
{
$config = $this->app['config']['mail'];

$this->registerSwiftTransport($config);

// Once we have the transporter registered, we will register the actual Swift
// mailer instance, passing in the transport instances, which allows us to
// override this transporter instances during app start-up if necessary.
$this->app['swift.mailer'] = $this->app->share(function($app)
{
return new Swift_Mailer($app['swift.transport']);
});
}

/**
* Register the Swift Transport instance.
*
* @param array $config
* @return void
*/
protected function registerSwiftTransport($config)
{
$this->app['swift.transport'] = $this->app->share(function($app) use ($config)
{
extract($config);

// The Swift SMTP transport instance will allow us to use any SMTP backend
// for delivering mail such as Sendgrid, Amazon SMS, or a custom server
// a developer has available. We will just pass this configured host.
$transport = SendmailTransport::newInstance($sendmail_path);

// Once we have the transport we will check for the presence of a username
// and password. If we have it we will set the credentials on the Swift
// transporter instance so that we'll properly authenticate delivery.
if (isset($username))
{
$transport->setUsername($username);

$transport->setPassword($password);
}

return $transport;
});
}

/**
* Get the services provided by the provider.
*
* @return array
*/
public function provides()
{
return array('mailer', 'swift.mailer', 'swift.transport');
}

}

没有真正测试过,但应该可以正常工作。尝试将其放入 routes.php 并播放一下:

Route::get('/', function()
{
Mail::send('emails.auth.reminder', array('token' => '123456'), function($m)
{
$m->from('us@example.com', 'Laravel');

$m->to('foo@example.com')->cc('bar@example.com');

});
});

关于php - 在 Laravel 4 中更改邮件传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15604027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com