我想使用laravel发送确认电子邮件。 laravel Mail :: send()函数似乎只接受系统上文件的路径。问题是我的mailtemplates存储在数据库中,而不是存储在系统上的文件中。
如何将纯文本内容传递给电子邮件?
例:
$content = "Hi,welcome user!";
Mail::send($content,$data,function(){});
更新:在Laravel 5中你可以使用raw
代替:
Mail::raw('Hi, welcome user!', function ($message) {
$message->to(..)
->subject(..);
});
这是你如何做到的:
Mail::send([], [], function ($message) {
$message->to(..)
->subject(..)
// here comes what you want
->setBody('Hi, welcome user!'); // assuming text/plain
// or:
->setBody('<h1>Hi, welcome user!</h1>', 'text/html'); // for HTML rich messages
});
对于Html电子邮件
Mail::send(array(), array(), function ($message) use ($html) {
$message->to(..)
->subject(..)
->from(..)
->setBody($html, 'text/html');
});
Mailer类将一个字符串传递给addContent
,它通过各种其他方法调用views->make()
。因此,直接传递一串内容将无法正常工作,因为它将尝试按该名称加载视图。
你需要做的是创建一个简单回声$content
的视图
// mail-template.php
<?php echo $content; ?>
然后在运行时将您的字符串插入该视图。
$content = "Hi,welcome user!";
$data = [
'content' => $content
];
Mail::send('mail-template', $data, function() { });
如果你使用mailables。您可以在构建方法中执行以下操作:
public function build()
{
return $this->view('email')
->with(['html'=>'This is the message']);
}
您只需继续在资源文件夹中创建刀片视图email.blade.php
。
然后在刀片中,您可以使用laravel blade语法引用您的字符串
<html>
<body>
{{$html}}
</body>
</html>
要么
<html>
<body>
{!!$html!!}
</body>
</html>
如果您的原始文本包含html标记,我希望这适用于那些具有存储在数据库中的模板并希望利用Laravel中的Mailables类的人。
public function build()
{
$message = 'Hi,welcome user!'
return $this->html($message)->subject($message);
}
它与问题没有直接关系,但对于那些在保留自定义HTML版本的同时搜索设置电子邮件纯文本版本的问题,您可以使用以下示例:
Mail::raw([], function($message) {
$message->from('[email protected]', 'Company name');
$message->to('[email protected]');
$message->subject('5% off all our website');
$message->setBody( '<html><h1>5% off its awesome</h1><p>Go get it now !</p></html>', 'text/html' );
$message->addPart("5% off its awesome\n\nGo get it now!", 'text/plain');
});
如果您要问“但为什么不将第一个参数设置为纯文本?”,我进行了测试,它只采用了html部分,忽略了原始部分。
如果您需要使用其他变量,匿名函数将需要您使用use()
语句如下:
Mail::raw([], function($message) use($html, $plain, $to, $subject, $formEmail, $formName){
$message->from($fromEmail, $fromName);
$message->to($to);
$message->subject($subject);
$message->setBody($html, 'text/html' ); // dont miss the '<html></html>' or your spam score will increase !
$message->addPart($plain, 'text/plain');
});
希望它可以帮助你们。
要使用Laravel Mailables发送原始html,文本等,您可以
在你的Mailable中覆盖Mailable-> send()并在那里,使用先前响应中的方法:
send([], [], function($message){ $message->setBody() } )
无需在构建函数中调用$ this-> view()。
如你所知
只有可邮寄的人才可以排队。
意思是,如果你使用ShouldQueue
界面
1)首先,你应该总是这样做
php artisan queue:restart
2)第二,在你的mailable你可以使用html
方法(在laravel 5.8测试)
public function build(): self
{
return $this
->html('
<html>
<body>
ForwardEmail
</body>
</html>
')
->subject(config('app.name') . ' ' . 'email forwarded')
->attachData($this->content, 'email.eml', [
'mime' => 'application/eml',
]);
}