在Laravel中编辑电子邮件模板

时间:2017-03-24 14:54:50

标签: php laravel email laravel-5 message-queue

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

我想了几个方法:

  1. 在文本字段中的DB中保存电子邮件模板,在管理面板中对其进行编辑,然后在刀片视图中显示该文本。
  2. 这种方式实现的问题是我必须在刀片模板中显示php变量,然后使用最终代码作为电子邮件的html。我想,这对拉拉维尔来说太难了。

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

    1. 仅将数据库中的电子邮件中的静态文本信息存储在模板中,然后将其显示在模板中。 PHP变量将单独传输。
    2. 这种方式可以解决php var显示的问题,但我仍然不知道如何使用Mail :: send中的最终代码,因为Laravel只允许使用模板的名称,而不是HTML,因为我知道...

      我想到以下方式:

      start

      但我不想使用它,因为我想使用Mail :: queue()来排队电子邮件,我不知道如何将它用于PHP mail()。

      感谢大家的回复。

3 个答案:

答案 0 :(得分:3)

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

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

  1. 从DB加载电子邮件模板。
  2. 将所有${VARIABLE_KEY}替换为其实际值。
  3. 您可以使用正则表达式进行搜索和替换,但也可以使用str_replace等函数。例如,如果要将当前用户的电子邮件粘贴到电子邮件中(模型User的表格中有电子邮件字段),则可以创建变量:$ {user.name}然后手动替换使用简单的str_replace函数:

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

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

    然后你必须创建自己的类,扩展Laravel Illuminate\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;
        }
    

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

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

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

    您可以阅读有关撰写邮寄的信息in Laravel documentation

答案 1 :(得分:1)

我昨天为一个项目做了这个,发现了一篇很好的帖子,更详细地描述了亚历山大的答案。核心是使用此方法创建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上的原始帖子

答案 2 :(得分:1)

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

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

功能(来自自述文件):

  • 无需使用命令行即​​可创建可邮寄邮件。
  • 在一个地方预览/编辑所有可邮件。
  • 模板(超过20个可以使用的电子邮件模板)。
  • 所见即所得的电子邮件HTML /降价编辑器。