【问题标题】:How can I set multiple sending addresses in Laravel 5 .env file?如何在 Laravel 5 .env 文件中设置多个发送地址?
【发布时间】:2015-12-13 02:36:24
【问题描述】:

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

【问题讨论】:

    标签: php email laravel-5 environment-variables send


    【解决方案1】:

    .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 文件并在您的服务器上为那些使用“真实”环境变量价值观。

    【讨论】:

      【解决方案2】:

      在 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 中设置发件人地址,它将覆盖您在创建电子邮件时作为“发件人”发送的任何内容。

      【讨论】:

        【解决方案3】:

        事实上并没有设置多个地址的方法。如何实现这取决于您。

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

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

        然后在发送电子邮件时选择它们:

        Mail::send('enquiry', $data, function ($message) {
            $message->from(config('addresses.enquiries'));
        });
        

        如果您不想像这样在应用程序的源代码中硬编码电子邮件地址,那么您可以将它们移动到环境变量中,或者如果您希望它们可配置,则可以移动到数据库中。

        【讨论】:

        • 我最终使用了一个配置文件。可能会也可能不会切换到数据库。
        【解决方案4】:

        如果您想同时向所有管理员发送电子邮件,您可以执行以下操作:

        在您的 .env 文件中,将所有电子邮件添加为逗号分隔值:

        ADMIN_EMAILS=admin1@site.com,admin2@site.com,admin3@site.com
        

        因此,当您要发送电子邮件时,只需这样做(是的!消息构建器实例的“to”方法接受一个数组):

        所以,

        $to = explode(',', env('ADMIN_EMAILS'));
        

        还有……

        $message->to($to);
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-04-23
          • 2019-03-01
          • 1970-01-01
          • 2016-04-24
          • 2019-07-23
          • 1970-01-01
          • 2017-04-02
          • 2017-01-03
          相关资源
          最近更新 更多