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

时间:2014-10-01 11:07:11

标签: php email laravel laravel-4 swiftmailer

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

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

示例:

$content = "Hi,welcome user!";

Mail::send($content,$data,function(){});

10 个答案:

答案 0 :(得分:81)

更新:在 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
});

答案 1 :(得分:37)

对于Html电子邮件

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

答案 2 :(得分:13)

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

您需要做的是创建一个只需回显$content

的视图
// mail-template.php
<?php echo $content; ?>

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

$content = "Hi,welcome user!";

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

Mail::send('mail-template', $data, function() { });

答案 3 :(得分:2)

如果您使用的是可邮寄的。您可以在构建方法中执行以下操作:

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类的人。

答案 4 :(得分:0)

它与问题没有直接关系,但对于那些在保留自定义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>' if the email dont contains it to decrease your spam score !!
    $message->addPart($plain, 'text/plain');
});

希望它可以帮助你们。

答案 5 :(得分:0)

使用Laravel Mailables发送原始html,文本等,你可以

在Mailable中覆盖Mailable-&gt; send()并在其中,使用先前回复中的方法:

send([], [], function($message){ $message->setBody() } )

根本不需要在构建函数中调用$ this-&gt; view()。

答案 6 :(得分:0)

如您所知

  

仅可邮寄邮件可能会排队。

含义,如果您使用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',
    ]);
}

答案 7 :(得分:0)

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

答案 8 :(得分:0)

我遇到了类似的问题,即电子邮件的HTML和/或纯文本不是由视图构建的,并且我不想为它们创建虚拟视图(由@Matthew Odedoyin提出)。

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

不幸的是,$this->text()仅显示了一个视图,但是我通过使用以下方法解决了这个问题:

$this->text(new HtmlString('Here is the plain text content'));

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

答案 9 :(得分:0)

这可以在 Mailable 实现中完成,使用纯文本和 html 内容部分:

  public function build() {

    // Text and html content sections we wish to use in place of view output
    $bodyHtml = ...
    $bodyText = ...

    // Internally, Mailer::renderView($view) interprets $view as the name of a blade template
    // unless, instead of string, it is set to an object implementing Htmlable,
    // in which case it returns the result $view->toHtml()
    $htmlViewAlternative = new class($bodyHtml) implements Htmlable {
      protected string $html;
      public function __construct($html) {
        $this->html = $html;
      }
      public function toHtml(): string {
        return $this->html;
      }
    };

    // We can now set both the html and text content sections without
    // involving blade templates. One minor hitch is the Mailable::view($view)
    // documents $view as being a string, which is incorrect if you follow
    // the convoluted downstream logic. 
    /** @noinspection PhpParamsInspection */
    return $this
      ->to(...)
      ->from(...)
      ->subject(...)
      ->view([
        'html' => $htmlViewAlternative,
        'raw' => $bodyText
      ]);
  }