gpt4 book ai didi

php - 如何从 Laravel 上的 MessageSent 事件访问邮件数据?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:34:22 27 4
gpt4 key购买 nike

我正在使用 laravel 5.5,并尝试发送带有客户端标志图像的电子邮件。 为了让图片可以从 View 中访问,我将它复制到public 文件夹中,排队的电子邮件将可以访问它。

通过一次操作,我可以向客户发送多封电子邮件,登录电子邮件,以及电子邮件附件中的 pdf,也带有签名图像。然后,可以从不同的电子邮件中多次调用相同的图像。为此,我为每封电子邮件复制一张带有代码化名称的图像,并将图像的名称传递给 Mailable。

问题是在有限的时间内公开客户的标志。然后我试图为 Illuminate\Mail\Events\MessageSent 事件创建监听器,该事件删除公共(public)文件夹的图像,从事件中获取图像名称...但我无法访问它。

  • 如何从事件中访问可邮寄数据?
  • 你知道更好的方法吗?

提前致谢。

可邮寄类

class SEPA extends Mailable
{
use Queueable, SerializesModels;

public $client;

/**
* Create a new message instance.
*
* @param Client $client
*/
public function __construct(Client $client)
{
$this->client = $client;
}

/**
* Build the message.
*
* @return $this
*/
public function build()
{
$date = Carbon::now();

// Name codified
$fileName = md5(microtime()).".png";

// Making the image accessible from views
Storage::copy("clients/{$this->client->id}/firma.png", "public/tmp/{$fileName}");
$pdfName = "SEPA - {$this->client->name}{$this->client->cognom1}{$this->client->cognom2}.pdf";
$dades = [
'data' => $date,
'client' => $this->client,
'firma' => $fileName
];

// Generating PDF
$pdf = PDF::loadView('pdfs.SEPA', $dades);
if (!Storage::has("tmp/clients/{$this->client->id}")) Storage::makeDirectory("tmp/clients/{$this->client->id}");
$pdf->save(storage_path()."/app/tmp/clients/{$this->client->id}/".$pdfName);

return $this
->from(['address' => 'email@random.com'])
->view('emails.SEPA')
->with($dades)
->attach(storage_path()."/app/tmp/clients/{$this->client->id}/".$pdfName);
}
}

EventServiceProvider.php

protected $listen = [
'Illuminate\Mail\Events\MessageSent' => [
'App\Listeners\DeleteTempResources'
]
];

监听器

public function handle(MessageSent $event)
{
// Trying to access on data message
Log::info($event->message->firma);
}

最佳答案

您可以通过 withSwiftMessage() 方法设置您需要从事件访问的额外数据,作为实际 swiftMessage 上的额外字段,因为这是可以在事件,作为 $message

我看到有人这样做了here ,例如添加一个 $user 对象:

$this->withSwiftMessage(function ($message) {
$message->user = $this->user; // any crazy field of your choosing
});

这对我来说似乎很不正统 - 添加这样的无赖字段。

请注意,您不需要使用 $user 对象将其放入闭包中,因为它可以通过$this 在范围内使用,只要它是成员包含类的属性。

要在消息离开队列时查看事件,您可以在 Log::info('The user: ', [$event->message->user]) MessageSending 事件。

我刚刚测试过它,它可以工作(我在 5.5 上),但我自己还没有在代码中使用它,因为它看起来有点奇怪,添加了这样一个流氓字段。我提到它是因为如果您对这种方法感到满意,它实际上可能会解决您的问题!如果有人知道一种不那么丑陋的方法,我会洗耳恭听......

附言我可能会考虑在闭包中添加 $message->lara_user_id = $this->user->id ,对于我自己的情况,因为它似乎不太可能与任何东西发生冲突,并且可以方便地拉出回到事件中。欢迎讨论!

关于php - 如何从 Laravel 上的 MessageSent 事件访问邮件数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49190574/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com