在 Laravel 中编辑电子邮件模板

Edit email template in Laravel

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

我想了几个办法:

  1. 将电子邮件模板保存在数据库中的文本字段中,在管理面板中对其进行编辑,然后在 blade 的视图中显示文本。

这种方式实现的问题是我必须在blade模板中显示php变量,然后使用最终代码作为电子邮件的html。我觉得,Laravel.

太难了

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

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

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

我想到了以下办法:

$view = view('template')->render();
mail(..., $view, ...);

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

感谢大家的回复。

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

那么在准备电子邮件的过程中,您应该将所有这些构造解析为它们的真实值。我不知道需要哪些变量,但在准备电子邮件期间,您应该执行以下步骤:

  1. 从数据库加载电子邮件模板。
  2. 用真实值替换所有 ${VARIABLE_KEY}

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

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

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

然后您必须创建自己的 class,它扩展了 Laravel Illuminate\Mail\Mailable class。在这个 class 你应该定义 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;
    }

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

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

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

您可以阅读有关编写邮件的内容in Laravel documentation

昨天我在为一个项目做这件事,发现一个很好的 post 更详细地描述了 Alexander 的答案。核心是用这个方法创建一个EmailTemplate模型:

public function parse($data)
{
    $parsed = preg_replace_callback('/{{(.*?)}}/', function ($matches) use ($data) {
        list($shortCode, $index) = $matches;

        if( isset($data[$index]) ) {
            return $data[$index];
        } else {
            throw new Exception("Shortcode {$shortCode} not found in template id {$this->id}", 1);   
        }

    }, $this->content);

    return $parsed;
}

用法示例:

$template = EmailTemplate::where('name', 'welcome-email')->first();

Mail::send([], [], function($message) use ($template, $user)
{
    $data = [
        'firstname' => $user->firstname
    ];

    $message->to($user->email, $user->fullname)
        ->subject($template->subject)
        ->setBody($template->parse($data));
});

有关所有详细信息(数据库迁移、单元测试等),请参阅 http://tnt.studio/blog/email-templates-from-database

中的原始 post

您可以简单地使用这个很棒的 laravel 包:

https://github.com/Qoraiche/laravel-mail-editor

功能(来自自述文件):

  • 不使用命令行创建邮件。
  • Preview/Edit 您所有的邮件都集中在一个地方。
  • 模板(超过 20 个随时可用的电子邮件模板)。
  • 所见即所得电子邮件 HTML/Markdown 编辑器。