我希望使用 Laravel 发送确认电子邮件。 然而,Laravel 的 Mail::send() 函数只接受系统上文件的路径作为参数。 问题在于,我的邮件模板是存储在数据库中而不是系统文件中。
我该如何向邮件传递纯文本内容?
例如:
$content = "Hi,welcome user!";
Mail::send($content,$data,function(){});
我希望使用 Laravel 发送确认电子邮件。 然而,Laravel 的 Mail::send() 函数只接受系统上文件的路径作为参数。 问题在于,我的邮件模板是存储在数据库中而不是系统文件中。
我该如何向邮件传递纯文本内容?
例如:
$content = "Hi,welcome user!";
Mail::send($content,$data,function(){});
2022年7月20日更新:对于更高版本的Laravel,下面Mail::send()
示例中的setBody()
方法已被替换为text()
或html()
方法。
更新:在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');
});
text/html
和text/plain
部分的多部分电子邮件。 - Jason这与问题不直接相关,但对于那些想要设置纯文本版本电子邮件并保留自定义HTML版本的人来说,您可以使用以下示例:
Mail::raw([], function($message) {
$message->from('contact@company.com', 'Company name');
$message->to('johndoe@gmail.com');
$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');
});
希望这能帮到你们。
Mailer类将一个字符串传递给addContent
方法,该方法通过其他各种方法调用views->make()
。因此,直接传递一串内容将不起作用,因为它会尝试按名称加载视图。
您需要做的是创建一个视图,只需回显$content
即可。
// mail-template.php
<?php echo $content; ?>
然后在运行时将您的字符串插入到该视图中。
$content = "Hi,welcome user!";
$data = [
'content' => $content
];
Mail::send('mail-template', $data, function() { });
尝试
public function build()
{
$message = 'Hi,welcome user!'
return $this->html($message)->subject($message);
}
我遇到了一个类似的问题,即我的电子邮件的HTML和/或纯文本不是通过视图构建的,我不想为它们创建一个虚拟视图(如@Matthew Odedoyin所建议的那样)。
正如其他人所评论的那样,您可以使用$this->html()
来设置消息的HTML内容,但是如果您希望电子邮件具有HTML和纯文本内容,该怎么办?
不幸的是,$this->text()
只接受视图,但我通过使用以下方法解决了这个问题:
$this->text(new HtmlString('Here is the plain text content'));
这将呈现HTMLString
内容而不是视图。
如您所知
只有可邮寄的才可以排队。
也就是说,如果您使用了 ShouldQueue
接口
1)首先,您应该始终执行
php artisan queue:restart
2)其次,在您的可邮寄对象中,您可以使用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',
]);
}
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>
send([], [], function($message){ $message->setBody() } )
注意:以下答案适用于寻求灵活方法的人,即(使用或不使用Laravel模板)
使用模板
$payload['message'] = View::make('emails.test-mail',$data)->render();
无模板
$payload['message'] = "lorem ipsum";
Mail::raw([], function ($mail) use ($payload) {
$mail->from($payload['from_email'])
->to($payload['to'])
->setBody($payload['message'], 'text/html')
->cc($payload['cc'])
->bcc($payload['bcc'])
->subject($payload['subject']);
foreach ($payload['attachments'] as $file){
$mail->attach($file);
}
});