【发布时间】:2015-12-13 02:36:24
【问题描述】:
我一直在搜索,我检查了 Laravel 5 文档,但没有找到任何东西。在 Laravel .env 示例文件中,它显示了如何将其设置为从一个电子邮件地址发送,但是说我想在不同的情况下从不同的电子邮件地址发送,我该怎么做?
【问题讨论】:
标签: php email laravel-5 environment-variables send
我一直在搜索,我检查了 Laravel 5 文档,但没有找到任何东西。在 Laravel .env 示例文件中,它显示了如何将其设置为从一个电子邮件地址发送,但是说我想在不同的情况下从不同的电子邮件地址发送,我该怎么做?
【问题讨论】:
标签: php email laravel-5 environment-variables send
.env 文件只是为您的应用程序设置值的一种方式。您可以(在一定范围内 - 请参阅this answer 进行讨论)将这些值称为任何您喜欢的值。因此,如果您想在您的环境中为不同的事件设置多个电子邮件地址,您可以在 .env 文件中执行类似的操作:
MAIL_ONLOGIN=larry@example.com
MAIL_ONSIGNUP=moe@example.com
MAIL_ONERROR=curly@example.com
然后,在您的应用程序的事件处理程序中(或您需要的任何地方),只需访问相应的电子邮件地址,如下所示:
// time to inform someone of a catastrophic error
Mail::send(
'emails.error',
['error' => $exception],
function ($m) use ($exception) {
$m->to(env('MAIL_ONERROR'))
->subject('Something broke! ' . $exception->getMessage());
});
我还应该提到,.env 文件旨在用于开发用途 - 当需要将您的应用程序部署到生产环境时,请删除 .env 文件并在您的服务器上为那些使用“真实”环境变量价值观。
【讨论】:
在 Laravel 中没有“默认”方式来定义来自地址的集合,尽管你可以实现它。
这是在 Laravel 中发送电子邮件时使用“发件人”的工作原理:
config/mail.php 文件的from 配置中设置了除null 以外的任何内容。 MailServiceProvider会在设置mailer对象的时候调用Mailer方法alwaysFrom。alwaysFrom 设置了地址,则每次发送电子邮件时都会使用此地址作为发件人地址。不设置它的问题是,对于您不控制发件人地址的情况,您将没有“默认”发件人地址,例如 PasswordBroker(发送密码重置电子邮件),以及任何您包含的其他可以发送电子邮件的库。
因此,考虑到这一点,您可以执行以下操作:
config/mail.php 文件中设置发件人地址,您可以使用env() 在.env 文件中实际设置它。Mailer::send() 方法并且想要不同的“发件人”地址之前,您只需使用所需的发件人地址调用 Mailer::alwaysFrom() 方法或将其设置为 null 像这样 Mailer::alwaysFrom(null) 和然后,您可以将您发送到Mailer::send() 方法的信息中的“发件人”地址和姓名发送给。例如:
Mail::alwaysFrom(null);
Mail::send('emails.welcome', $data, function ($message) {
$message->from('us@example.com', 'Laravel');
$message->to('foo@example.com')->cc('bar@example.com');
// ...
});
或者你可以这样做:
// Get from the database, config or any other way which address from you want to use
Mail::alwaysFrom($fromEmail, $fromName);
Mail::send('emails.welcome', $data, function ($message) {
// ...
});
或者,如果您想要更“自动”的东西,您可以执行以下操作:
Illuminate\Mail\Mailer 创建您自己的扩展类
send() 方法,以便它使用$view 名称从数据库表或类似的东西中查找应该使用哪个“发件人”地址,并具有“默认”从何时没有找到。Illuminate\Mail\MailServiceProvider 创建您自己的扩展类
register() 方法,以便实例化您自己的Mailer 而不是原来的。config/app.php 文件中删除或注释掉 Illuminate\Mail\MailServiceProvider::class, 并将您自己的 ServiceProvider 放在那里。就是这样!,您现在有了一个改进的邮件程序,它将根据您的视图名称使用发件人地址。
希望对你有帮助。
注意:如果您在config/mail.php 中设置发件人地址,它将覆盖您在创建电子邮件时作为“发件人”发送的任何内容。
【讨论】:
事实上并没有设置多个地址的方法。如何实现这取决于您。
一种方法是创建一个配置文件(例如 config/addresses.php),其中包含您的地址数组:
return [
'enquiries' => 'someone@example.com',
'orders' => 'someone.else@example.com',
];
然后在发送电子邮件时选择它们:
Mail::send('enquiry', $data, function ($message) {
$message->from(config('addresses.enquiries'));
});
如果您不想像这样在应用程序的源代码中硬编码电子邮件地址,那么您可以将它们移动到环境变量中,或者如果您希望它们可配置,则可以移动到数据库中。
【讨论】:
如果您想同时向所有管理员发送电子邮件,您可以执行以下操作:
在您的 .env 文件中,将所有电子邮件添加为逗号分隔值:
ADMIN_EMAILS=admin1@site.com,admin2@site.com,admin3@site.com
因此,当您要发送电子邮件时,只需这样做(是的!消息构建器实例的“to”方法接受一个数组):
所以,
$to = explode(',', env('ADMIN_EMAILS'));
还有……
$message->to($to);
现在会将邮件发送给所有管理员。
【讨论】: