【问题标题】:Laravel "universal to" in development vs productionLaravel 在开发与生产中“通用”
【发布时间】:2017-09-06 13:30:30
【问题描述】:

我正在使用 Laravel 5.2 应用程序。在我的开发和登台环境中,我想使用“Universal To”邮件配置选项described in the docs。开发环境中的通用收件人可确保所有电子邮件都发送到该地址,而不是发送给真正的客户/客户/其他任何人。

我不知道如何在生产中以不同的方式指定它。在生产中应该没有通用的 - 电子邮件应该发送到真实地址。

使用不同env() 值的标准方法似乎不起作用。例如:

config/mail.php

'to' => [
    'address'   => env('UNIVERSAL_TO', false)
],

开发.env

UNIVERSAL_TO=my-testing-address@somewhere.com

这工作正常 - 所有电子邮件都按预期发送到指定的 UNIVERSAL_TO。但是,如果我将其更改为我在生产中想要的,例如:

生产 .env

UNIVERSAL_TO=

(或='',或=false,或干脆完全省略),发送任何邮件都会失败并显示(storage/laravel.log):

local.ERROR: 异常 'Swift_RfcComplianceException' 带有消息'给定邮箱中的地址 [] 不符合 RFC 2822, 3.6.2。在路径/to/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Headers/MailboxHeader.php:348

config/mail.php 只是返回一个数组,所以我想我可以将其设置为变量,然后根据环境将“to”附加到它,如下所示:

$return = [ ... normal mail config array ... ];

if (!\App::environment('production')) {
    $return['to'] => [
        'address' => 'my-testing-address@somewhere.com'
    ];
}

return $return;

但这似乎有点...... hacky。有没有更好的办法?

【问题讨论】:

  • 我不明白。您尝试将其设置为空,然后它尝试将邮件发送到一个空的电子邮件地址?
  • 你不能定义你的电子邮件为假。 'address' => env('UNIVERSAL_TO', 'my-testing-address@somewhere.com) 并且此行应该是 UNIVERSAL_TO= 在您的 .env 文件中,因此如果您定义 UNIVERSAL_TO 您将使用它(生产)。在暂存或本地,您将使用测试地址。 false 不是电子邮件
  • 在生产中应该有 no 通用的。请参阅我链接到的文档 - 通用的要点是在开发环境中捕获电子邮件,这样它们就不会发送给真正的客户。
  • 那么不要定义它。在您的生产中使用 MAIL_DRIVER=log in local 和 smpt,这样您就可以在 staging/local 中记录您的电子邮件,并在生产中发送真实的电子邮件
  • 谢谢,但这不是我提出的问题的解决方案。我想使用记录在案的通用功能,而不是其他东西。我需要能够查看客户端中的电子邮件;我还需要其他人有权检查它们。

标签: php laravel email laravel-5.2


【解决方案1】:

我认为这应该可行 - 除非设置了 UNIVERSAL_TO,否则它会将 config('mail.to') 保留为 null

'to' => env('UNIVERSAL_TO', false) ? [
    'address' => env('UNIVERSAL_TO'),
    'name' => env('UNIVERSAL_TO_NAME')
] : null,

【讨论】:

  • 它工作正常,但应该有第二个参数作为名称。 [ 'address' => env('UNIVERSAL_TO'), 'name' => '任何名称或为此设置环境变量']
  • 看来关键是使用null,在我的测试中我使用了失败的false或空白。
【解决方案2】:

“universal to”仅在存在时使用。所以以下工作: 配置/mail.php:

'to' => [
    'address' => env('UNIVERSAL_TO'),
    'name' => env('UNIVERSAL_TO_NAME')
],

在.env(测试)中填写详细信息:

UNIVERSAL_TO=
UNIVERSAL_TO_NAME=

并且不要在 .env (production) 中填写详细信息

【讨论】:

    【解决方案3】:

    我在搜索此行为时偶然发现了此问题。由于答案并不完美,我决定添加我的结果。

    如果它曾经被破坏,现在似乎已经修复了。在 .env 文件中省略 UNIVERSAL_TO 时,邮件只会发送给指定的收件人。

    也许问题在于您没有 null 值,而是默认为 false

    配置/mail.php

        'to' => [
            'address' => env('MAIL_GLOBAL_RECIPIENT'), // when not found, defaults to null
            'name' => 'Developer'
        ],
    

    本地 .env

    MAIL_GLOBAL_RECIPIENT=my@email.com
    

    production .env 甚至没有那个变量

    【讨论】:

    • 所以你的作品config/mail.php 有一个to => [address => null, name => Developer],它有效吗?我当然希望它会因我看到的那种错误、无效地址等而失败? null to 地址如何工作!? :-)
    • 谢谢,看来关键是使用null 或者甚至没有你所说的变量。
    【解决方案4】:

    是的,我仍然在做你所谓的 hacky 方式,目前我还没有找到更好的方式。

    $default = [
        ....
    ]
    
    if (env('APP_ENV', 'local') === 'staging'){
        $default['to'] = [
            'address' => 'webmaster@xxx.com',
        ]
    }
    
    return $default;
    

    【讨论】:

      猜你喜欢
      • 2021-05-11
      • 1970-01-01
      • 2011-10-16
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-02
      相关资源
      最近更新 更多