【问题标题】:How to send cc and bcc recipients in Laravel 7?如何在 Laravel 7 中发送 cc 和 bcc 收件人?
【发布时间】:2021-01-21 07:45:51
【问题描述】:

我正在尝试使用 cc 和/或 bcc 发送电子邮件,并且只有收件人才能收到电子邮件。

我正在派遣这样的工作:

$user = User::where('email', 'test1@test.com')->first();
$sender = 'test@test.com';
$cc = User::where('email', 'test2@test.com')->first();
$bcc = User::where('email', 'test3@test.com')->first();
$subject = "Test subject";
$text = "Text mail body";
dispatch(new SendEmailJob($user,$sender,$cc,$bcc,$subject, $text))->delay(now()->addSeconds(10));

然后在 SendEmailJob 的构造函数中,我接受这些参数并发送电子邮件:

public function handle()
{
    Mail::to($this->user)->cc($this->cc)->bcc($this->bcc)->send(new TestMail($this->sender, $this->subject, $this->text));
}

还有实际的TestMail:

public function build()
{
    return $this
        ->from($this->sender)
        ->subject($this->subject)
        ->markdown('emails.test');
}

降价:

@component('mail::message')
{!! nl2br($text) !!}
@endcomponent

SendEmailJob 和 TestMail 都在实现 ShouldQueue 并运行 php artisan queue:work。 $user 可以收到电子邮件,但 $cc 和 $bcc 没有。在 Mailtrap 和生产上都试过了。一项作业已排队并处理,一封电子邮件已排队并处理。

有人知道为什么不发送 cc 和 bcc 电子邮件吗?

【问题讨论】:

  • 这能回答你的问题吗? Laravel mail bcc
  • 试过了,但是开发人员让函数接受@param object|array|string $address,所以它没有回答问题。

标签: php laravel email


【解决方案1】:

所以我想通了。

首先,在 localhost 上,php artisan queue:work 需要重新启动,否则它仍然可以使用启动时的任何代码。

在生产服务器上,维护 php artisan queue:work up 的主管或其他服务需要重新启动,否则队列将无法工作。

在本地主机上,使用密件抄送您会收到 2 封相同的电子邮件,一封用于收件人,另一封用于密件抄送收件人 - 这是一个邮件陷阱功能,意味着它正在工作。

在生产中,我用错误的代码尝试了很多次,并且 office365 反垃圾邮件阻止了服务器的 ip,所以在尝试了个人 gmail 之后,它起作用了。

这是我正在使用的代码:

我调度工作的控制器(电子邮件可以是字符串或用户模型):

$user = User::where('email', 'test1@test.com')->first();
$sender = 'test@test.com'; 
$cc = User::where('email', 'test2@test.com')->first();
$bcc = User::where('email', 'test3@test.com')->first();
$subject = "Test subject";
$text = "Text mail body";
dispatch(new SendEmailJob($user,$sender,$cc,$bcc,$subject, $text))->delay(now()->addSeconds(10));

在 Job 类中:

public function handle()
{
    Mail::send(new TestMail($this->user, $this->cc, $this->bcc, $this->sender, $this->subject, $this->text));
}

以及实际的邮件类:

public function build()
{
    return $this
        ->to($this->user->email, 'Main recipient') //can be $this->user
        ->bcc($this->cc->email, 'Hidden recipient')  //can be $this->cc
        ->from($this->sender)
        ->subject($this->subject)
        ->markdown('emails.test');
}

编辑经过更多挖掘:

所以在处理一些电子邮件后,我仍然收到此错误“swift_transportexception 预期响应代码 354 但得到代码 554”。

此错误基本上表示您未在服务器上进行身份验证,或者“发件人”地址与 config('mail.username') 地址不匹配。 因为我有多租户应用程序,而我的目标是让租户动态更改“发件人”地址,所以我正在通过每封电子邮件更改 config(mail.username') 和 config('mail.password')。但是当执行作业后邮件真正被发送时,配置已经被更改了很多次,并且永远不会 100% 的邮件被发送。

所以我的解决方案是,我收到 100% 的电子邮件,根本不更改配置,让所有电子邮件从“info@myapp.com”发送并由每个租户指定“replyTo”。希望这对某人有所帮助。

【讨论】:

    【解决方案2】:
    Mail::to($request->user())
        ->cc($moreUsers)
        ->bcc($evenMoreUsers)
        ->send(new OrderShipped($order))
    

    【讨论】:

    • 请在您的答案中添加一点 Ham,以便人们了解为什么您的解决方案比 OP 选择的解决方案更好。
    • 您需要为 Hari 的解决方案设置一个全局表单才能正常工作,仅此代码将无法正常工作。
    • 您必须从名称 OrderShipped 发出邮件,然后在控制器中全局定义它。然后根据上面写的代码使用它。
    猜你喜欢
    • 2013-10-11
    • 2019-05-04
    • 1970-01-01
    • 2010-12-05
    • 2012-04-23
    • 2013-01-19
    • 1970-01-01
    相关资源
    最近更新 更多