【问题标题】:Not receiving the $message variable in view from a Laravel HTML Mailable (NON Markdown)未从 Laravel HTML Mailable 接收到 $message 变量(非 Markdown)
【发布时间】:2018-10-19 06:49:08
【问题描述】:

我已经阅读了几个与此问题相关的类似问题,但都参考 Markdown 邮件。

我正在尝试在邮件中发送内联图像,但我还没有找到正确的方法(Laravel 5.5)。

documentation 是这样说的:

内嵌附件

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

<body>
    Here is an image:

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

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

未定义变量:消息(查看:/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

App/Http/Controllers/UserController.php

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

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

    return 'done';
}

【问题讨论】:

  • 尝试使用构造传递消息。
  • 你好@AliÖzen,我该怎么做?
  • 也许它在其他地方失败了,因为它应该像这样工作..

标签: laravel email laravel-5.5


【解决方案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

可以这样工作。

【讨论】:

  • 文档说:“Laravel 自动使 $message 变量可用于所有电子邮件模板”,因此它应该可用。
【解决方案2】:

在我的例子中(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-&gt;embed(......

请使用这些 html/markdown 目录和刀片指令进行广泛测试。这有点棘手,但它确实有它的魔力......

【讨论】:

  • 我的 laravel 5.5 没有更改 CID id 的 URL,它只是发送 url。
  • @DonViegues 你确定你在使用asset() 函数吗?如果是这样的话。也许你应该尝试 HCK 在这个线程中建议的包 - Laravel Mail Auto Embed .. BTW 我相信这是一个错误,我希望它在 Laravel 5.6 中得到修复。你能验证一下吗?
  • 嗨,是的,我正在使用asset(),看来你说的包是要走的路。谢谢。
【解决方案3】:

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

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

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

【讨论】:

  • 问题是$message 变量不是Mailable 类中标记为public 的变量。
  • 别担心,我解决了这个问题。我明天会更新它。无论如何,谢谢,伙计。
【解决方案4】:

好吧,老实说,我还没有找到使这项工作正常工作的方法。我的意思是,就目前而言,这应该有效。也许是我的 Laravel 安装(?)..

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

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

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

2) 改变我引用资产的方式,从这里开始:

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

到这里:

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

现在可以了。

【讨论】:

  • 供我个人参考,如果它在没有任何额外软件包的情况下使用 asset(... 工作,那就太好了?
  • @bart 不,它没有用。最初的问题不是我引用资产的方式,而是$message 变量。可悲的是,我还没有找到使它起作用的方法。是的,我尝试(我假设)你的建议,但正如我所说,它没有用:/
【解决方案5】:

这样你可以在 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');
    }
}

资源/视图/电子邮件/demo.blade.php

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

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

资源/视图/电子邮件/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/Image(或者有一个基本控制器)。

【讨论】:

  • 该问题明确指出它与降价消息无关。
猜你喜欢
  • 2017-07-01
  • 2018-01-31
  • 1970-01-01
  • 2021-09-09
  • 1970-01-01
  • 1970-01-01
  • 2019-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多