如何在laravel中呈现来自数据库的电子邮件?
我正在发送邮件,视图来自数据库:如何在laravel中呈现来自数据库的电子邮件?,laravel,blade,swiftmailer,Laravel,Blade,Swiftmailer,我正在发送邮件,视图来自数据库: $blade_from_db = 'Hello, {{ $something }}!'; $email_data = ['something' => 'World!']; Mail::send($blade_from_db, $email_data, function ($message) use ($sender) { $message->from($sender->from, $sender->from_safe);
$blade_from_db = 'Hello, {{ $something }}!';
$email_data = ['something' => 'World!'];
Mail::send($blade_from_db, $email_data, function ($message) use ($sender)
{
$message->from($sender->from, $sender->from_safe);
$message->to($sender->to, $sender->safe);
$message->subject($sender->subject);
});
这是错误消息:
“消息”:“未找到查看[Hello,{{$something}!]”,
有人可以帮助我或给我一个建议,因为我需要来自数据库的视图内容
$blade_from_db = view('your view',['something' => 'World!'])->render();
Mail::send([], $email_data, function ($message) use ($sender, $blade_from_db)
{
$message->from($sender->from, $sender->from_safe);
$message->to($sender->to, $sender->safe);
$message->subject($sender->subject);
$message->setBody($blade_from_db,'text/html');
});
使用$message->setBody('blade_from_db,'text/html')
从数据库发送带有模板的电子邮件
希望这有帮助
编辑
为了从数据库中获取模板,这里是我在代码中使用的一个片段
<?php
class EmailTemplate extends Model
{
use SoftDeletes;
public $table = 'email_templates';
protected $dates = ['deleted_at'];
public $fillable = [
'name',
'subject',
'content',
'variables'
];
/**
* The attributes that should be casted to native types.
*
* @var array
*/
protected $casts = [
'name' => 'string',
'subject' => 'string',
'content' => 'string'
];
/**
* Validation rules
*
* @var array
*/
public static $rules = [
// 'name' => 'required',
'subject' => 'required'
];
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;
}
}
现在您可以在数据库中使用
{{{something}
来填充这些条目视图来自数据库?比如,视图本身还是文件名?如果将视图存储在DB行中,这是一个非常有趣的想法。您可以将视图呈现为如下字符串:view::make('my_view',['name'=>'Rishabh'])->render()代码>感谢您的回答@j.steelman,但是如果刀片标签来自数据库,那么它应该包含的视图?啊,刀片应该放在/resources/views中,并使用.blade.php扩展名保存。创建此文件:/resources/views/emailTemplate.blade.php,其中包含“Hello”{{$something}代码>。然后可以将模板呈现为如下字符串:$emailString=View::make('emailTemplate',['something'=>'World'])->render()
。这可能对你有用,但是你应该考虑为你的LaaFail版本使用默认邮件进程。请记住,Laravel是经过意见化的,因此最好的办法是创建一个调用视图的Mailer类,而不是将其全部烘焙到控制器中。我了解视图的部分,但我想在数据库中保存一个html,以便客户端可以保存自己的格式非常有趣。laravel中的电子邮件模板编辑器。我假设您已经考虑过sprintf的各种用途,其中用户被训练使用特殊字符(甚至可以是双大括号)进行字符串注入。考虑到刀片是如何解析和缓存的,我认为刀片的值并不像普通字符串那样处理。如果您假设用户有足够的信任度来创建可变刀片,那么将用户的刀片保存到文件系统不会带来太大的安全风险。但是我对你的问题标题的正式回答是“我不认为这是可能的”。谢谢,我已经试过了,理论上我需要的是传递一个字符串,其中包含来自database@JulioCesarMontenegro您可以像这样将数据传递给视图$blade\u from_db=view('your view',['something'=>'World!'])->render()
@Juliocesara请查看我的最新信息,希望您能得到您想要的。
$data = ['something' => 'World!'];
Mail::queue([], [], function ($m) use ($sender, $data) {
$emailTemplate = EmailTemplate::where('name', '=', 'yourtemplate')->first();
$message->from($sender->from, $sender->from_safe);
$message->to($sender->to, $sender->safe);
$message->subject($sender->subject);
$message->setBody($emailTemplate->parse($data), 'text/html');;
});