如何在 Laravel 5.env 文件中设置多个发送地址?

How can I set multiple sending addresses in Laravel 5 .env file?

我一直在搜索,我检查了 Laravel 5 文档,但我没有找到任何东西。在 Laravel .env 示例文件中,它显示了如何将其设置为从一个电子邮件地址发送,但假设我想在不同情况下从不同的电子邮件地址发送,如何我会那样做吗?

.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 文件并使用 "real" 服务器上用于这些值的环境变量。

在 Laravel 中没有 "default" 定义发件人地址集的方法,尽管您可以实现它。

以下是在 Laravel 中发送电子邮件时使用 "From" 的工作原理:

  • 如果您在 config/mail.php 文件的 from 配置中设置了 null 以外的任何内容。
  • 然后MailServiceProvider会在设置邮件对象时调用Mailer方法alwaysFrom
  • 如果 alwaysFrom 设置了地址,则每次发送电子邮件时都会使用该地址作为发件人地址。

不设置它的问题是在您无法控制发件人地址的情况下,您将没有 "default" 发件人地址,例如 PasswordBroker(发送密码重置电子邮件)例如,以及您包含的任何其他可以发送电子邮件的库。

因此,考虑到这一点,您可以执行以下操作:

  • (可选)如果您想要默认的发件人地址,请在 config/mail.php 文件中设置发件人地址,您可以使用 env().env 文件中实际设置它] 文件。
  • 然后,在每次调用 Mailer::send() 方法并且您想要一个不同的 "from" 地址之前,您只需使用您想要的发件人地址或设置它来调用 Mailer::alwaysFrom() 方法像这样 Mailer::alwaysFrom(null) 为 null 然后,您可以在发送给 Mailer::send() 方法的信息中发送 "from" 地址和名称。

例如:

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) {
  // ...
});

或者,如果您想要更多 "automatic",您可以执行以下操作:

  • Illuminate\Mail\Mailer
  • 创建您自己的扩展 class
  • 覆盖自定义邮件程序中的 send() 方法,以便它使用 $view 名称从数据库 table 中查找应该使用哪个 "from" 地址类似的东西,并且有一个 "default" 来自 for when it was not found.
  • Illuminate\Mail\MailServiceProvider
  • 创建您自己的扩展 class
  • 重写您的服务提供商中的 register() 方法,以便实例化您自己的 Mailer 而不是原始方法。
  • 从您的 config/app.php 文件中删除或注释掉 Illuminate\Mail\MailServiceProvider::class, 并将您自己的 ServiceProvider 放在那里。

就是这样!您现在有了一个改进的 Mailer,它将根据您的视图名称使用发件人地址。

希望对您有所帮助。

注意: 如果您在 config/mail.php 中设置发件人地址,它将覆盖您在创建电子邮件时作为 "From" 发送的任何内容。

实际上没有设置多个发件人地址的方法。如何实施取决于您。

一种方法是创建一个配置文件(比如 config/addresses.php),其中包含您的地址数组:

return [
    'enquiries' => 'someone@example.com',
    'orders' => 'someone.else@example.com',

];

然后在发送电子邮件时只 select 他们:

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);

现在将邮件发送给所有管理员。