首页 文章

在Laravel中编辑电子邮件模板

提问于
浏览
2

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

我想几个方面:

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

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

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

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

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

我想到以下方式:

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

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

感谢大家的回复 .

2 回答

  • 1

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

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

    • 从DB加载电子邮件模板 .

    • 将所有 ${VARIABLE_KEY} 替换为其实际值 .

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

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

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

    然后你必须创建自己的类,扩展Laravel Illuminate\Mail\Mailable 类 . 在这个类中,您应该定义 build 方法,您不仅可以使用视图的名称,还可以使用一些其他参数,例如"regular"视图中的参数:

    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;
        }
    

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

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

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

    你可以读一下写mailables in Laravel documentation

  • 3

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

相关问题