web-dev-qa-db-ja.com

laravel 5.4メールに画像を埋め込む

_5.2_インストールをlaravel=に_5.3_にアップグレードし、次に公式のアップグレード方法に従って_5.4_にアップグレードしました。

現在、新しい機能の1つを使用して、マークダウン形式の電子メールを作成しようとしています。

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');
    }
}
_
15
Angelin Calu

古い$ message-> embedは、Markdownメールではうまく機能しないようです。 あなたがコメントで言及したように、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

18
Christophvh

これを試して:

<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')))}})
8
Mikael

この便利なパッケージも使用できます

https://github.com/eduardokum/laravel-mail-auto-embed

READMEから取得

その使用は非常に簡単で、通常はマークダウンを記述します。

@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:[email protected]">
3
cyberfly

私の問題を解決しました!

  <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('[email protected]')->subject('Contact Form || abc.com');
            $message->from($r->email);
            // ->setBody($r->user_message); // assuming text/plain

        });

Localhostにいる場合、base_path関数の代わりにpublic_pathを使用できます

2
John

以下を試すことができます:

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');
    }
}
0
Tony Chung