我使用Mandrill邮件驱动程序进行测试。我有一个远程登台,我在部署后播种。在播种期间,我尝试禁用与某些事件相关联的电子邮件发送。
将其放置在播种机中:
Config::set('mail.driver', 'log');
Config::set('mail.pretend', true);
无效。我不明白为什么。我把它放在根DatabaseSeeder@run
或/和儿童播种机中 - 相同。仍在执行对Mandrill的调用。
这个问题有解决方案吗?
答案 0 :(得分:11)
你的原因
Config::set('mail.driver', 'log');
Config::set('mail.pretend', true);
不起作用是因为邮件对象在发送邮件之前不检查这些值。的 Whaaaaaaaa吗。如果您查看邮件程序类中的sendSwiftMessage
方法
#File: vendor/laravel/framework/src/Illuminate/Mail/Mailer.php
protected function sendSwiftMessage($message)
{
if ($this->events)
{
$this->events->fire('mailer.sending', array($message));
}
if ( ! $this->pretending)
{
$this->swift->send($message, $this->failedRecipients);
}
elseif (isset($this->logger))
{
$this->logMessage($message);
}
}
在决定是否应该发送邮件之前,您可以看到班级检查$this->pretending
和不配置。什么设置pretending
?这是在MailServiceProvider
类的register
方法中。
public function register()
{
//...
$pretend = $app['config']->get('mail.pretend', false);
$mailer->pretend($pretend);
//...
}
当Laravel启动并注册每个服务提供商时,它最终会在读取配置时注册邮件服务提供商和那个,然后告诉邮件者是否应该“假装”。当你在播种机中调用它时,邮件程序已经加载了它的配置值。
幸运的是,有一个非常简单的解决方案。邮件程序对象是单例/共享服务,并且具有可用于控制是否应该伪装的公共方法。只需自己调用pretend
方法,而不是设置配置值
Mail::pretend(true); //using the `Mail` facade to access the mailer object.
你应该能够以编程方式关闭邮件程序。
答案 1 :(得分:5)
这是Laravel 5.7的答案,因为假装不存在:
如果您想在播种数据库时禁用邮件,则可以简单地“滥用”
Mail::fake()
答案 2 :(得分:2)
我认为有两种可能性,你可以尝试:
您可以设置命令以即时启用邮件假装:
Mail::pretend();
db种子正在运行多个请求:
正如写here:
仅在运行时设置的配置值 当前请求,不会转发给后续请求。
因此,您可以尝试将此配置设置为请求(如会话),而不是在播种结束时完成。