Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Laravel中编辑电子邮件模板_Php_Laravel_Email_Laravel 5_Message Queue - Fatal编程技术网

Php 在Laravel中编辑电子邮件模板

Php 在Laravel中编辑电子邮件模板,php,laravel,email,laravel-5,message-queue,Php,Laravel,Email,Laravel 5,Message Queue,我需要编辑模板,用于管理面板中的电子邮件。有什么想法吗 我想有几种方法: 将电子邮件模板保存在文本字段的DB中,在管理面板中编辑它,然后在刀片视图中显示文本 这种方法实现的问题是我必须在blade模板中显示php变量,然后使用最终代码作为电子邮件的html。我想,这对拉威尔来说太难了 另外一个问题是,如果我将{{$var}}存储在DB中的模板文本中,它将显示为文本,blade编译器不会处理它 仅将电子邮件中的静态文本信息存储在数据库中,然后在模板中显示。PHP变量将单独传输 这种方法将解决php

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

我想有几种方法:

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

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

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

    我的想法如下:

    $view = view('template')->render();
    mail(..., $view, ...);
    
    但我不想使用它,因为我想使用Mail::queue()查询电子邮件,但我不知道如何将它与PHP Mail()一起使用


    感谢大家的回复。

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

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

  • 从数据库加载电子邮件模板
  • 用实际值替换所有
    ${VARIABLE\u KEY}
  • 您可以使用正则表达式进行搜索和替换,也可以使用函数
    str\u replace
    。例如,如果要将当前用户的电子邮件粘贴到电子邮件中(并且模型
    user
    的表有一个电子邮件字段),则可以创建变量:${user.name},然后手动将其替换为简单的
    stru replace
    函数:

    $variables['${user.name}']=Auth::user()->email; str_replace(数组_键($variables)、数组_值($variables)、$yourEmailTemplateBody)

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

    然后,您必须创建自己的类,该类扩展了Laravel
    Lightning\Mail\Mailable
    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\u NAME}
    构造创建更复杂的语法,例如,
    VARIABLE\u NAME
    可以是PHP或Laravel表示法中的方法定义,即:
    SomeClass::someStaticMethod
    。您可以检测此情况并通过解决
    SomeClass
    。它也可以是
    对象.field
    符号,例如,
    user.email
    ,其中
    user
    是当前的Auth::user()

    但在这种情况下要小心:如果您将授予所有用户使用此变量编辑电子邮件模板的权限,则应过滤用于调用的字段或可用方法和类,以防止执行电子邮件模板中任何可用类的任何方法或防止显示私人信息。
    你可以阅读关于写邮件的文章

    我昨天为一个项目写了这篇文章,发现了一篇很好的帖子,更详细地描述了Alexander的答案。核心是使用以下方法创建
    电子邮件模板
    模型:

    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迁移、单元测试等),请参阅原始帖子,网址为

    ,您只需使用这个很棒的laravel软件包即可:

    功能(来自自述文件):

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

    谢谢您的回复。据我所知,您的方法是将变量写入模板的DB记录,并在邮寄之前用正则表达式手动替换为实际值?还有一个问题。我仍然有一个想法。如何通过管理面板编辑模板的.blade.php文件,而不将内容写入数据库。然后得到某种ModX)你怎么看?是的,你应该在发送邮件之前“解析”(搜索并替换为实际值)模板中的每个变量。Regexp是一种可能的解决方案,但不是强制性的。我已经更新了我的答案。当然,您可以从任何地方(手动,从某些用户界面)编辑文件“*.blade.php”,但这并不安全,因为直接编辑文件就像打开服务器的大门。此外,在这种情况下,当我的解决方案更友好但更复杂时,编辑器应该对blade语法有一些特殊的了解,因为使用应该:1)为允许的变量创建一些检查。2) 创建允许的变量及其解析方法的列表。谢谢。但是,为什么编辑文件不安全?我怎么会受到伤害?毕竟,管理区的访问权限不会对普通用户开放。只有那些我认为有必要通知登录和密码的人。例如,在WordPress的正常实践中,在管理面板中编辑文件。