首页 文章

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

提问于
浏览
6

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

我正在尝试在mailables中发送内联图像,但我还没有找到适当的方法(Laravel 5.5) .

documentation这样说:

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

<img src =“{{$ message-> embed($ pathToFile)}}”>
</ BODY>

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

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

我知道这在使用 Markdown 消息时有一个限制但是 I'm not using one .


这是相关文件:

Mail / NewUserWelcomeEmail.php

class NewUserWelcomeEmail extends Mailable
{
    use SerializesModels;

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

Resources / views / mails / 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

App / Http / Controllers / UserController.php

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

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

    return 'done';
}

4 回答

  • 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

    如果您可以像这样使用它可以在其他方面工作,您不要在邮件刀片中使用$ 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

    它可以像这样工作 .

  • 1

    在我的情况下( Larvel 5.5 ),我已经在 html and markdown 中管理,修改 Headers 徽标 .

    Laravel documentation 虽然真的很棒,但在这方面可能会更好 .

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

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

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

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

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

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

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

    Note:

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

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

  • 1

    您必须在Mailable中将文件路径变量定义为公共属性 - > example $ 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
    

相关问题