如何在 laravel 中配置多封电子邮件 [关闭]

Posted

技术标签:

【中文标题】如何在 laravel 中配置多封电子邮件 [关闭]【英文标题】:How to Configure multiple emails in laravel [closed] 【发布时间】:2021-10-27 22:51:46 【问题描述】:

如何在我的 laravel 应用中使用多个来自电子邮件的配置?

场景 #1:我想将 sales@mywebsite.com 电子邮件用于所有与结算相关的电子邮件 场景 #2:我想将 support@mywebsite.com 电子邮件用于所有通知和其他场景。

问题:在 .env 文件中,我们只能配置一个电子邮件 smtp 详细信息。如何使用多个电子邮件帐户并将其凭据用于不同的场景。

我的 .env smtp 设置

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=xxxxxxxxx
MAIL_PASSWORD=xxxxxxxxxxxxx
MAIL_FROM_ADDRESS=sales@mywebsite.com
MAIL_FROM_NAME="Sales"
MAIL_ENCRYPTION=TLS

下面发送电子邮件,但从 .env 文件中获取配置。

\Mail::to($firmAdminEmail->admin_email)->send(new AdminLeadAccept($acceptLink));

【问题讨论】:

请勿关闭问题,因为它已正确解释... 【参考方案1】:

如果this 没有帮助,那么我认为您应该在每个配置中使用.env,例如:

MAIL_SALES_USERNAME, MAIL_SALES_PASSWORD MAIL_SUPPORT_USERNAME, MAIL_SUPPORT_PASSWORD

然后在配置中你有this,所以你可以像这样在mailers 中添加新的“发件人”:

'sales' => [
    'transport' => 'smtp',
    'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
    'port' => env('MAIL_PORT', 587),
    'encryption' => env('MAIL_ENCRYPTION', 'tls'),
    'username' => env('MAIL_SALES_USERNAME'),
    'password' => env('MAIL_SALES_PASSWORD'),
    'timeout' => null,
    'auth_mode' => null,
],
'support' => [
    'transport' => 'smtp',
    'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
    'port' => env('MAIL_PORT', 587),
    'encryption' => env('MAIL_ENCRYPTION', 'tls'),
    'username' => env('MAIL_SUPPORT_USERNAME'),
    'password' => env('MAIL_SUPPORT_PASSWORD'),
    'timeout' => null,
    'auth_mode' => null,
],

因此,在发送电子邮件之前,您只需选择/更改要用作发件人的人:

Mail::mailer('support')
    ->to($request->user())
    ->send(new SupportTicketGenerated($ticket));

// Or

Mail::mailer('sales')
    ->to($request->user())
    ->send(new OrderShipped($order));

阅读documentation这部分关于mailer的内容。

【讨论】:

【参考方案2】:

如果您想在 .env 中保存硬编码的电子邮件,您可以像这样将它们保留在那里:

MAIL_FROM_ADDRESS="email@gmail.com"
MAIL_FROM_ADDRESSES="email1@gmail.com,email2@gmail.com,email3@gmail.com"

config/mail.php 中添加一些属性,例如:

'from' => [
    'addresses' => explode(',', env('MAIL_FROM_ADDRESSES')),
    'address' => env('MAIL_FROM_ADDRESS'),
    'name' => env('MAIL_FROM_NAME'),
],

刷新 Laravel 缓存。运行:

php artisan config:cache

像这样在您的应用中的任何位置使用它们:

config('mail.from.addresses')

就是这样。请注意, .env 实际上是用于存储字符串数据。 this 对你来说也可能很有趣。

更新:

如果你想根据你的应用逻辑从不同的电子邮件地址发送电子邮件,你可以这样做。 假设您有用户的“角色”表,并且每个用户都有一些特定的“别名”字段。由于我不知道您的应用程序的整个逻辑,您可以根据需要进行更改,但是解决问题的简单方法可以使用关联数组方法:

ma​​il.php

中添加“别名”属性
'from' => [
    'aliases' => [
        // all the roles values (starting from 0)
        'admin' => 0,
        'moderator' => 1,
        // ...
    ],
    'addresses' => explode(',', env('MAIL_FROM_ADDRESSES')),
    'address' => env('MAIL_FROM_ADDRESS'),
    'name' => env('MAIL_FROM_NAME'),
],

同样,不要忘记清除缓存并像这样使用电子邮件发送:

// for example here the app will send email dynamically depending from auth user
// assume the $user is auth user (admin, moderator or something like that)
$alias_number = config('mail.from.aliases.' . $user->role->alias);
\Mail::from(config('mail.from.addresses')[$alias_number])
    ->to('some.email@gmail.com')
    ->send(new AdminLeadAccept($acceptLink));

您可以根据需要覆盖或更改。核心逻辑是你可以在 .env 中保留一些字符串数据并从那里动态地提取。

【讨论】:

问题是我如何使用多个电子邮件配置。我想使用多封电子邮件发送 smtp 设置以在不同场景中使用。谢谢 用户希望根据逻辑从不同的邮件发送电子邮件,而不是来自多个发件人或地址。 @matiaslauriti 如果您愿意,可以投反对票,但最初的问题有很大不同并且被多次编辑,现在我看到了问题中的新细节。无论如何,我添加了一些更新的东西。这只是解决您的问题的一种方法,您可以更改任何您想要的内容。对于更多动态的应用程序,您将拥有更困难的数据库结构,您可以改进逻辑。

以上是关于如何在 laravel 中配置多封电子邮件 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 在不使用 foreach 循环的情况下发送单独的多封邮件

如何在 Django 中支持使用多封电子邮件的用户?

如何在cakephp中一次发送多封电子邮件

如何从帐户表中检查和提取多封电子邮件的数据?

如何一次发送多封电子邮件,每个电子邮件都带有一个 xlsx 文件附件?

如何使用 Java 中的拆分从字符串中获取多封电子邮件的列表?