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');
}
}
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
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')))}})
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]">
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
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');
}
}