在 Laravel 中编辑电子邮件模板

Pau*_*nko 2 php email message-queue laravel laravel-5

我需要在管理面板中编辑用于电子邮件的模板。有任何想法吗?

我想了几个方法:

  1. 将电子邮件模板保存在 DB 中的文本字段中,在管理面板中进行编辑,然后在刀片视图中显示文本。

这种方式实现的问题是我必须在blade模板中显示php变量,然后将最终代码用作电子邮件的html。我认为,这对 Laravel 来说太难了。

另一个问题是,如果我将 {{ $var }} 存储在 DB 中模板的文本中 - 它会显示为文本,刀片编译器不会处理它。

  1. 仅将电子邮件中的静态文本信息存储在数据库中,然后将其显示在模板中。PHP 变量将单独传输。

这种方式将解决 php var 显示的问题,但我仍然不知道如何使用 Mail::send 中的最终代码,因为 Laravel 只允许使用模板的名称,而不是 HTML,据我所知.. .

我考虑以下方式:

$view = view('template')->render();
mail(..., $view, ...);
Run Code Online (Sandbox Code Playgroud)

但是我不想使用它,因为我想使用 Mail::queue() 来查询电子邮件,而且我不知道如何将它与 PHP mail() 一起使用。

感谢大家的回复。

Ale*_*kov 5

您可以创建自己的变量语法并将电子邮件模板作为文本存储在数据库中。例如,您可以将每个变量存储为${VARIABLE_KEY}字符串。

然后在电子邮件准备期间,您应该将所有此类构造解析为它们的实际值。我不知道需要哪些变量,但在电子邮件准备期间,您应该执行以下步骤:

  1. 从数据库加载电子邮件模板。
  2. 全部替换${VARIABLE_KEY}为它们的真实值。

您可以使用正则表达式进行搜索和替换,也可以使用str_replace. 例如,如果您想将当前用户的电子邮件粘贴到您的电子邮件中(并且您的模型表User有一个电子邮件字段),那么您可以创建变量:${user.name},然后用简单的str_replace函数手动替换它:

$variables['${user.name}'] = Auth::user()->email; str_replace(array_keys($variables), array_values($variables), $yourEmailTemplateBody);

此外,您不仅可以在电子邮件模板正文中使用相同的方法进行替换,还可以在电子邮件主题中进行替换。

然后你必须创建你自己的类来扩展 LaravelIlluminate\Mail\Mailable类。在这个类中,您应该定义build方法,您不仅可以在其中使用视图的名称,还可以使用一些附加参数,例如在“常规”视图中,例如:

class SomeClassName extends Mailable
{

    public function build()
    {
        $email = $this->view('mail.common', [
            'mail_header' => 'some header', 
            'mail_footer' => 'some footer',
            ])->subject('Your subject');
    ...
        return $email;
    }
Run Code Online (Sandbox Code Playgroud)

例如,在您的视图中,您可以使用一些额外的参数存储整个电子邮件的布局:页脚和标题,如我的示例所示。

您还可以为${VARIABLE_NAME}构造创建更复杂的语法,例如,VARIABLE_NAME可以是 PHP 或 Laravel 符号中的方法定义,即:SomeClass::someStaticMethod。您可以检测这种情况并SomeClass通过Laravel Service Container解决。它也可以是一个object.field符号,例如,当前 Auth::user()user.email在哪里user

但在这种情况下要小心:如果您授予所有用户使用此变量编辑电子邮件模板的能力,您应该过滤字段或可用方法和类以防止执行电子邮件模板中任何可用类的任何方法或阻止显示私人信息。

您可以在 Laravel 文档中阅读有关编写邮件的信息