web-dev-qa-db-fra.com

laravel 5.4 incorporer l'image dans mail

Je viens de mettre à niveau mon installation 5.2 de laravel vers 5.3 et ensuite vers 5.4 en suivant les méthodes officielles de mise à niveau.

J'essaie maintenant d'utiliser l'une des nouvelles fonctionnalités pour créer un courrier électronique au format markdown.

Selon la documentation disponible sur: https://laravel.com/docs/5.4/mail#view-data

Pour incorporer une image en ligne, utilisez la méthode embed sur la variable $message dans votre modèle de courrier électronique. Laravel rend automatiquement la variable $message disponible pour tous vos modèles de courrier électronique. Vous n'avez donc pas à vous soucier de la transmettre manuellement:

Cependant, ceci:

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

produira l'erreur suivante:

Variable non définie: message

Est-ce que je manque quelque chose? Ou y a-t-il quelque chose de non documenté dans les guides de mise à niveau?

Éditer plus tard:

J'appelle la fonction email avec:

\Mail::to($user)->send(new WelcomeCandidate($user, $request->input('password')));

Et WelcomeCandidate ressemble à:

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

Il semble que l'ancien message $ message-> embed ne fonctionne pas bien avec les emails Markdown. Comme vous l'avez mentionné dans les commentaires, il semble cassé depuis le 5.4

Mais vous pouvez juste l'essayer comme ceci dans votre email de démarque:

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

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

Comme indiqué ici: https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet#images

Référence de la fonction d'actif: https://laravel.com/docs/5.4/helpers#method-asset

15
Christophvh

Essaye ça:

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

ou

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

Vous pouvez également utiliser ce paquet utile

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

Tiré du readme

Son utilisation est très simple, vous écrivez votre démarque normalement:

@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

Lors de l'envoi, il remplacera le lien qui serait normalement généré:

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

par une pièce jointe intégrée à l'image:

<img src="cid:[email protected]">
3
cyberfly

Résolu mon problème!

  <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

        });

Si vous êtes dans localhost, vous pouvez utiliser public_path au lieu de la fonction base_path

1
John

Vous pouvez essayer ce qui suit: 

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