Laravel 5.4在邮件中嵌入图片

8zzbczxx  于 2023-04-07  发布在  其他
关注(0)|答案(9)|浏览(200)

我刚刚升级了我的5.2安装的laravel到5.3,然后到5.4以下的官方升级方法。
我现在正在尝试使用其中一个新功能,创建一个markdown格式的电子邮件。
根据以下文件:https://laravel.com/docs/5.4/mail#view-data
要嵌入内联图像,请在电子邮件模板中的$message变量上使用embed方法。Laravel会自动将$message变量提供给所有电子邮件模板,因此您无需担心手动传递它:
然而,这:

<img src="{{ $message->embed(public_path().'/img/official_logo.png') }}">

将产生以下错误:
未定义变量:message
我错过了什么吗?或者升级指南中没有记录的东西?
后期编辑:
我正在调用电子邮件功能:
\Mail::to($user)->send(new WelcomeCandidate($user, $request->input('password')));
WelcomeCandidate看起来像:

<?php

namespace App\Mail;

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

use App\Models\User;

class WelcomeCandidate extends Mailable
{

    use Queueable, SerializesModels;

    public $user;
    public $password;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct(User $user, $password)
    {
        //
        $this->user = $user;
        $this->password = $password;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        $this->subject('Welcome!');
        return $this->markdown('emails.welcome-candidate');
    }
}
63lcw9qa

63lcw9qa1#

您可以尝试以下操作:

class WelcomeCandidate extends Mailable
{
    use Queueable, SerializesModels;

    public $message;
    public function __construct(User $user)
    {
        $this->user = $user;
        $this->message = (object) array('image' => '/path/to/file');
    }
}
6ljaweal

6ljaweal2#

下面的解决方案适合我。

<img src="{{ $message->embed(asset('img/logo.png')) }}"/>

.env文件中。

本地:APP_URL=http://localhost/project_name
生产用APP_URL=https://www.example.com

参考:https://laravel.com/docs/7.x/mail#inline-attachments

mkh04yzy

mkh04yzy3#

Laravel在所有的laravel版本中都支持embed方法,7,8,9和10。如何在laravel中嵌入图像?

<img src="{{ $message->embed($pathToImage) }}">

Laravel会自动将$message变量提供给你所有的邮件模板,所以你不需要担心手动传递它:

r8uurelv

r8uurelv4#

在后端,我创建了显示图像的端点。并将我需要的图像放在resource/img中。Laravel代码如下:

public function getImage($name)
 {
        return response()->file(base_path() . '/resources/img/' . $name . '.png');
 }

然后在我的html电子邮件模板中,我创建了带有background-image的div。

<div style='background: url("https://mysite1.com/api/v1/get_image/logo")'></div>

对我很有效。

abithluo

abithluo5#

旧的$message-〉embed似乎不能很好地处理Markdown邮件。Like you mentioned in the comments it seems broken since 5.4
但是你可以在你的markdown电子邮件中这样尝试:

This is your logo 
![Some option text][logo]

[logo]: {{asset('/img/official_logo.png')}} "Logo"

如图所示:https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet#images
资产功能参考:https://laravel.com/docs/5.4/helpers#method-asset

ttcibm8c

ttcibm8c6#

试试这个:

<img src="data:image/png;base64,{{base64_encode(file_get_contents(resource_path('img/email/logo.png')))}}" alt="">

![](data:image/png;base64,{{base64_encode(file_get_contents(resource_path('img/email/logo.png')))}})
nuypyhwy

nuypyhwy7#

解决了我的问题!

<img src="{{ $message->embed(base_path() . '/img/logo.png') }}" />
Controller:

\Mail::send(['html' =>'mail'],
        array(
            'name' => $r->name,
            'email' => $r->email,
            'user_message' => $r->message,
           // 'telephone'=>$r->telephone,
           // 'subject'=>$r->subject
        ), function($message) use ($r)  {

            $message->to('abc@gmail.com')->subject('Contact Form || abc.com');
            $message->from($r->email);
            // ->setBody($r->user_message); // assuming text/plain

        });

如果在localhost中,可以使用public_path代替base_path函数

8hhllhi2

8hhllhi28#

您也可以使用这个有用的包
https://github.com/eduardokum/laravel-mail-auto-embed
摘自自述文件
它的使用非常简单,你可以正常地写你的markdown:

@component('mail::message')
# Order Shipped

Your order has been shipped!

@component('mail::button', ['url' => $url])
View Order
@endcomponent

Purchased product:

![product](https://example.com/products/product-1.png)

Thanks,<br>
{{ config('app.name') }}
@endcomponent

发送时,它将替换通常生成的链接:

<img src="https://example.com/products/product-1.png">

通过图像的嵌入式内联附件:

<img src="cid:3991f143cf1a86257f8671883736613c@Swift.generated">
vd8tlhqk

vd8tlhqk9#

我遇到了同样的问题,并找到了解决方案。
在渲染图像之前,您必须使用以下命令创建从“public/storage”到“storage/app/public”的符号链接:

php artisan storage:link

在“storage/app/public”中,你应该有一个文件夹“images”现在你可以在你的markdown.blade.php中呈现这段代码:

!['alt_tag']({{Storage::url('/images/your_image.png')}})

第二个选项类似:

!['alt_text']({{Storage::url($comment->user->image->path)}})

都很好用

相关问题