laravel 5.4 在邮件中嵌入图像

Posted

技术标签:

【中文标题】laravel 5.4 在邮件中嵌入图像【英文标题】:laravel 5.4 embed image in mail 【发布时间】:2017-07-19 02:16:05 【问题描述】:

我刚刚将我的 5.2 安装的 laravel 升级到 5.3,然后按照官方升级方法升级到 5.4

我现在正在尝试使用其中一项新功能来创建降价格式的电子邮件。

根据在以下位置找到的文档: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)-&gt;send(new WelcomeCandidate($user, $request-&gt;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');
    

【问题讨论】:

显示更多代码,但错误的意思很清楚。您没有在可邮寄类或通知类上定义消息变量,或者您没有在可邮寄/通知的构造函数中为其分配任何值。此外,如果您要使用降价,则不需要图像标签。 我是按照说明做的,正如您在引用的文本中看到的那样。我应该提供什么代码? 执行可邮寄类的代码:例如:$message = "hello"; Mail::to($request-&gt;user())-&gt;send(new OrderShipped($message)); 我已经在问题中添加了代码。 这里提出了同样的问题:github.com/laravel/framework/issues/17629。但没有解决方案。 【参考方案1】:

似乎较旧的 $message->embed 不适用于 Markdown 电子邮件。 Like you mentioned in the comments it seems broken since 5.4

但是您可以在降价电子邮件中这样尝试:

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

【讨论】:

已经试过了。我得到一个空的 img &lt;img alt="alt here" title="title here" style="font-family:Avenir,Helvetica,sans-serif;box-sizing:border-box;max-width:100%"&gt; 你试过使用 assets('img/official_log.png') 吗?也许问题出在路径上? 路径是问题所在。我正在尝试内联方法,这可能是另一个问题。 很高兴它有帮助!是的,目前嵌入方法似乎不适用于降价 是的。好吧,最终在vews/vendor/mail/html/layout.blade.php 中执行类似&lt;td class="logo"&gt;&lt;img src="asset('img/official-logo.png')" alt="alt here"&gt;&lt;/td&gt; 的操作,因为我会将该徽标作为默认设置放在所有电子邮件中。【参考方案2】:

试试这个:

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

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

【讨论】:

我喜欢这个解决方案,但不幸的是没有骰子。 尽管我非常喜欢粘贴到图像标签中的大型序列化图像数据......它们在许多电子邮件服务和客户端上特别不受欢迎。我出于某些目的喜欢 base64 编码的图像,不要误会我的意思。只是电子邮件不是专门针对不显示图像和完全无法实现呈现可见图像的单一目的的那些东西之一。现在是 2018 年下半年,我们将看看这条评论的老化程度。也许几年后它会变得不那么真实...... 这将导致 Gmail 等服务出现问题,其中极长的 HTML 行被强制换行为大约 10,240 个字符;如果您的图像大于 8KB,它将在 base64 编码的字符串中插入空格,从而破坏它 - &lt;img src="data:...r4ScdV3si deY8TdZ..."&gt;【参考方案3】:

解决了我的问题!

  <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 函数

【讨论】:

【参考方案4】:

你也可以使用这个有用的包

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">

【讨论】:

【参考方案5】:

我刚刚遇到同样的问题并找到了解决方案。

在渲染图像之前,您必须使用以下命令创建从“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)) 

两个都很好

【讨论】:

【参考方案6】:

您可以尝试以下方法:

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');
    

【讨论】:

【参考方案7】:

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

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

然后在我的 html 电子邮件模板中,我使用背景图像创建了 div。

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

它对我有用。

【讨论】:

以上是关于laravel 5.4 在邮件中嵌入图像的主要内容,如果未能解决你的问题,请参考以下文章

方法验证不存在 - Laravel 5.4

在 Laravel 5.4 中自定义忘记密码的电子邮件

Laravel 5.4 更改markdown邮件的主题

Laravel 5.4 - 单击电子邮件中的验证链接时未传递或发送电子邮件验证令牌令牌。

在 Laravel 5.4 中向多个抄送收件人发送电子邮件

laravel 5.4 密码重置问题——发送邮件