Laravel邮件:传递字符串而不是视图

nex*_*ana 43 php email swiftmailer laravel laravel-4

我想使用laravel发送确认电子邮件.laravel Mail :: send()函数似乎只接受系统上文件的路径.问题是我的mailtemplates存储在数据库中,而不是存储在系统上的文件中.

如何将纯文本内容传递给电子邮件?

例:

$content = "Hi,welcome user!";

Mail::send($content,$data,function(){});
Run Code Online (Sandbox Code Playgroud)

Jar*_*zyk 90

更新:在Laravel 5中你可以使用raw:

Mail::raw('Hi, welcome user!', function ($message) {
  $message->to(..)
    ->subject(..);
});
Run Code Online (Sandbox Code Playgroud)

这是你如何做到的:

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
});
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,如果您想发送Mail :: queue消息,并抛出InvalidArgumentException异常“仅可邮寄邮件可能会排队”,他将无法工作。 (2认同)

Saj*_*raf 38

对于Html电子邮件

Mail::send(array(), array(), function ($message) use ($html) {
  $message->to(..)
    ->subject(..)
    ->from(..)
    ->setBody($html, 'text/html');
});
Run Code Online (Sandbox Code Playgroud)

  • @Jason函数(https://github.com/laravel/framework/blob/master/src/Illuminate/Mail/Mailer.php#L320)使用`addPart()`代替`setBody()`当设置HTML部分时 (2认同)

Ben*_*rne 13

Mailer类传递一个字符串addContent,通过各种其他方法调用views->make().因此,直接传递一串内容将无法正常工作,因为它将尝试按该名称加载视图.

你需要做的是创建一个简单回声的视图 $content

// mail-template.php
<?php echo $content; ?>
Run Code Online (Sandbox Code Playgroud)

然后在运行时将您的字符串插入该视图.

$content = "Hi,welcome user!";

$data = [
    'content' => $content
];

Mail::send('mail-template', $data, function() { });
Run Code Online (Sandbox Code Playgroud)

  • 不是很优雅,我更喜欢Jarek Tkaczyk的方式:) (9认同)
  • 这个答案非常误导,不知道为什么op接受了这个答案.Jarek Tkaczyk和Sajjad Ashraf已正确回答 (2认同)

Anw*_*war 9

它与问题没有直接关系,但是对于那些在保留自定义 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');
});
Run Code Online (Sandbox Code Playgroud)

如果你问“但为什么不将第一个参数设置为纯文本?”,我做了一个测试,它只需要 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');
});
Run Code Online (Sandbox Code Playgroud)

希望对各位大侠有所帮助。


jei*_*ias 5

尝试

public function build()
{
    $message = 'Hi,welcome user!'
    return $this->html($message)->subject($message);
}
Run Code Online (Sandbox Code Playgroud)


小智 5

我有一个类似的问题,我的电子邮件的 HTML 和/或纯文本不是由视图构建的,我不想为它们创建一个虚拟视图(如@Matthew Odedoyin 所提议的)。

正如其他人评论的那样,您可以使用$this->html()来设置邮件的 HTML 内容,但是如果您希望您的电子邮件同时包含 HTML 和纯文本内容怎么办?

不幸的是$this->text()只需要一个视图,但我使用以下方法解决了这个问题:

$this->text(new HtmlString('Here is the plain text content'));
Run Code Online (Sandbox Code Playgroud)

它呈现了HTMLString而不是视图的内容。