Laravel邮件可选参数

4

如何给 Laravel 的邮件功能添加可选消息部分?

例如添加附件或设置密送。

Mail::send('emails.welcome', $data, function($message)
{
    $message->from('us@example.com', 'Laravel');

    $message->to('foo@example.com')->cc('bar@example.com');

    $message->attach($pathToFile); <========= OPTIONAL =========
});

我非常希望避免像这样丑陋的代码

if (isset($data['attachment'])) {
    // Attachment
    Mail::queue('emails.raw', ['content' => $content], function($message) use ($data) {
        $message
            ->subject($data['subject'])
            ->attach($data['attachment'])
            ->to($data['email'])
            ->bcc($data['bcc']);
        });
}
else{
    // No attachment
    Mail::queue('emails.raw', ['content' => $content], function($message) use ($data) {
        $message
            ->subject($data['subject'])
            ->to($data['email'])
            ->bcc($data['bcc']);
        });
}
2个回答

6

您可以将if条件移入闭包中:

Mail::queue('emails.raw', ['content' => $content], function($message) use ($data) {
    $message
        ->subject($data['subject'])
        ->to($data['email'])
        ->bcc($data['bcc']);

    if (isset($data['attachment'])) {
        $message->attach($data['attachment']);
    }
});

请注意,方法的链式调用只是语法糖。上述代码等同于以下代码:
Mail::queue('emails.raw', ['content' => $content], function($message) use ($data) {
    $message->subject($data['subject']);
    $message->to($data['email']);
    $message->bcc($data['bcc']);

    if (isset($data['attachment'])) {
        $message->attach($data['attachment']);
    }
});

因此,您可以以任何喜欢的方式编写它。


太棒了!我没有意识到内部部分需要设置为消息,之前只尝试了->attach($pathToFile);。感谢Jeroen - 救了我的一天! - Peder Wessel
你的代码中 $message->subject($data['subject']) 和 $message->to($data['email']) 缺少分号。 - Paul Denisevich
感谢@PaulDenisevich的关注 :) 已更新。 - Jeroen Noten

0

请记住,您当前添加的 from/to 等部分只是像其他任何函数一样的函数,只是它被称为匿名函数,因为它没有定义名称。

因此,您可以在函数内放置条件逻辑:

$body = 'YOUR_BODY_HERE';
$attachment = 'YOUR_ATTACHMENT_FILEPATH_HERE';

Mail::send('emails.welcome', ['content' => $body], function($message) use ($attachment)
{
    $message->from('us@example.com', 'Laravel');

    $message->to('foo@example.com')->cc('bar@example.com');

    if ($attachment) {
        $message->attach($attachment);
    }
}

谢谢Tom。出于好奇,你的'if ($attachment)'不需要为TRUE才能工作吗?它不应该是'if (isset($attachment))'吗? - Peder Wessel
请记住,在PHP中,它可以将所有变量评估为“真/假”(请参见此处的已接受答案:https://dev59.com/lHE95IYBdhLWcg3wRLwt)。我的代码假设如果您没有附件,则会将$attachment变量设置为空或空字符串 - 因此它将被定义。 - Tom Folk
如果您对答案感到满意,是否可以点个赞呢! - Tom Folk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接