【问题标题】:Edit email template in Laravel在 Laravel 中编辑电子邮件模板
【发布时间】:2017-08-17 13:55:01
【问题描述】:

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

我想了几个办法:

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

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

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

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

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

我考虑如下方式:

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

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

感谢大家的回复。

【问题讨论】:

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


    【解决方案1】:

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

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

    功能(来自自述文件):

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

    【讨论】:

      【解决方案2】:

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

      有关所有详细信息(db 迁移、单元测试等),请参阅http://tnt.studio/blog/email-templates-from-database 的原始帖子

      【讨论】:

        【解决方案3】:

        您可以创建自己的变量语法并将电子邮件模板作为文本存储在数据库中。例如,您可以将每个变量存储为${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);

        您也可以通过相同的方法进行替换,不仅在电子邮件模板正文中,而且在电子邮件主题中。

        然后你必须创建你自己的类来扩展 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

        【讨论】:

        • 感谢您的回复。据我了解,您的方法是将变量写入模板的数据库记录,并在邮寄前用正则表达式手动替换为实际值?
        • 还有一个问题。我还是有想法的。如何通过管理面板编辑模板的 .blade.php 文件而不将内容写入数据库。然后得到某种ModX)))你怎么看?
        • 是的,您应该在邮寄之前“解决”(搜索并替换为实际值)模板中的每个变量。正则表达式是一种可能的解决方案,但不是强制性的。我已经更新了对此的回答。
        • 当然,您可以从任何地方(手动,从某些用户界面)编辑文件“*.blade.php”,但并不安全,因为直接文件编辑就像打开您的大门服务器。在这种情况下,编辑器也应该对刀片语法有一些特殊的知识,当我的解决方案更友好但更复杂时,因为使用应该:1)为允许的变量创建一些检查。 2) 创建允许的变量及其解析方法的列表。
        • 谢谢。但是,为什么编辑文件不安全?我怎么会受到伤害?毕竟,普通用户无法访问管理区域。仅适用于我认为有必要告知登录名和密码的人。例如,在 WordPress 的常规实践中在管理面板中编辑文件。
        猜你喜欢
        • 1970-01-01
        • 2021-09-21
        • 2017-06-12
        • 2017-05-20
        • 2017-10-11
        • 1970-01-01
        • 2022-08-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多