从Laravel HTML Mailable(NON Markdown)中未收到$ message变量

时间:2018-05-09 08:09:38

标签: laravel email laravel-5.5

 

我已经阅读了几个与此问题相关的类似问题,但都提到Markdown mailables。

我试图在mailables中发送内联图片,但我还没有找到合适的方法(Laravel 5.5)。

documentation说:

  

内联附件

     

将嵌入式图片嵌入电子邮件通常很麻烦;但是,Laravel提供了一种将图像附加到电子邮件并检索相应CID的便捷方式。要嵌入内嵌图片,请使用电子邮件模板中embed变量上的$message方法。 Laravel会自动为您的所有电子邮件模板提供$message变量,因此您无需担心手动传递它:

<body>
    Here is an image:

    <img src="{{ $message->embed($pathToFile) }}">
</body>

但是,当我这样做时,我收到了这个错误:

  

未定义的变量:message(查看:/path/to/project/resources/views/mails/new_user_welcome.blade.php)

我知道在使用 Markdown 消息时这有一个限制,但我没有使用

这是相关文件:

邮件/ NewUserWelcomeEmail.php

class NewUserWelcomeEmail extends Mailable
{
    use SerializesModels;

    public function build()
    {
        return $this->view('mails.new_user_welcome');
    }
}

资源/视图/邮件/ new_user_welcome.blade.php

@extends('layouts.mail')

@section('content')

    <img src="{{ $message->embed(url("storage/images/inline_image.png")) }}" 
    alt="An inline image" />

@endsection

应用/ HTTP /控制器/ UserController.php

public function register(NewUserRequest $request)
{
    // some code

    Mail::to($user)->send(new NewUserWelcomeEmail($user));

    return 'done';
}

5 个答案:

答案 0 :(得分:4)

嗯,说实话,我还没有办法让这项工作正常进行。我的意思是,就目前而言,这应该有效。也许是我的Laravel安装(?)..

无论如何,我确实使用了解决方法。

1)使用Eduardokum'Laravel Mail Auto Embed软件包,这基本上会为您的每个媒体资产生成 CID

但是在添加这个包后,这没有按预期工作..所以我:

2)改变我引用资产的方式,从:

   <img src="{{ url("storage/a_inline_image.png") }}" />

对此:

   <img src="{{ asset("storage/a_inline_image.png") }}" />

现在可行。

答案 1 :(得分:1)

如果您可以使用这样的工作而不是其他工作,那么您不能在邮件刀片中使用$ message变量

Mail::send('emails.welcome', $data, function ($message) {
    $message->from('us@example.com', 'Laravel');
    $message->to('foo@example.com')->cc('bar@example.com'); 
});

如果你不想使用这种方法,你可以像这样使用

https://code.tutsplus.com/tutorials/how-to-send-emails-in-laravel--cms-30046

它可以像这样工作。

答案 2 :(得分:1)

在我的情况下( Larvel 5.5 ),我已在 html和markdown 中设法修改标题徽标。

Laravel文档虽然非常棒,但在这方面可能会更好。

无论如何,按照这些步骤,你应该没事......

1 - 通过以下方式发布邮件模板:

php artisan vendor:publish --tag=laravel-mail

这样您就可以轻松修改邮件源文件。

2 - 使用以下内容修改message.blade.php中的resources/views/vendor/mail/html

@slot('header')
    @component('mail::header', ['url' => config('app.url')])
        <img src="{{asset('assets/img/pathToYourImage...')}}">
    @endcomponent
@endslot

3 - 您的所有电子邮件都应该从现在开始通过CID接收徽标。

注意:

在这个Laravel示例中,自动将资产转换为CID,因此您根本不需要调用$message->embed(... ...

请进行广泛测试,这些html / markdown目录和刀片指令正在进行中。它有点棘手,但绝对是它的魔力......

答案 3 :(得分:1)

您必须在Mailable中将文件路径变量定义为公共属性 - &gt;示例$ pathToFile。

如果你有来自mailable外部的文件路径,你可以使用构造函数传入。

class NewUserWelcomeEmail extends Mailable
{
    use SerializesModels;

    // Must be public    
    public $pathToFile;

    /**
    * Create a new message instance.
    */
    public function __construct(string $pathToFile)
    {
        $this->pathToFile= $pathToFile;
    }

    public function build()
    {
        return $this->view('mails.new_user_welcome');
    }
}

然后它在您的视图中按预期工作:

@extends('layouts.mail')

@section('content')

    <img src="{{ $message->embed(url($pathToFile)) }}" alt="An inline image" />

@endsection

答案 4 :(得分:0)

通过这种方式,您可以在Markdown Laravel邮件中嵌入图像(在这里用于例如嵌入徽标):

app / Mail / Demo.php     

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Swift_Image;

class Demo extends Mailable
{
    use Queueable, SerializesModels;

    public $image_logo_cid;

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {   
        // Generate a CID 
        $this->image_logo_cid = \Swift_DependencyContainer::getInstance()
            ->lookup('mime.idgenerator')
            ->generateId();

        return $this->withSwiftMessage(function (\Swift_Message $swift) {
            $image = Swift_Image::fromPath(resource_path('img/make-a-wish-logo-rev.gif'));
            $swift->embed($image->setId($this->image_logo_cid));
        })->subject('My awesome markdown mail with an embedded image')
            ->markdown('emails.demo');
    }
}

resources / views / emails / demo.blade.php

@component('mail::message')
    {{-- Just embedding this image in the content here --}}
    <img src="cid:{{ $image_logo_cid }}">
@endcomponent

或者,您可以嵌入mail :: layout组件,并将图像放在标题

resources / views / emails / demo.blade.php

@component('mail::layout')
    {{-- Header --}}
    @slot('header')
        @component('mail::header', ['url' => config('app.url')])
            <img src="cid:{{ $image_logo_cid }}">
        @endcomponent
    @endslot

    {{-- Body --}}
    <!-- Body here -->

    {{-- Subcopy --}}
    @slot('subcopy')
        @component('mail::subcopy')
            <!-- subcopy here -->
        @endcomponent
    @endslot


    {{-- Footer --}}
    @slot('footer')
        @component('mail::footer')
            <!-- footer here -->
        @endcomponent
    @endslot
@endcomponent

或者,如果您始终想要此标题,只需编辑resources/views/vendor/mail/html/header.blade.php文件(在php artisan vendor:publish --tag=laravel-mail之后可用)。然后,当然,您需要使用app / Mail / Demo.php中显示的每个可发送邮件创建CID /图像(或为此提供一个基本控制器)。