web-dev-qa-db-fra.com

Laravel mail: passe chaîne au lieu de vue

Je veux envoyer un e-mail de confirmation en utilisant laravel . La fonction laravel Mail :: send () ne semble accepter qu'un chemin d'accès à un fichier du système . base de données et non dans un fichier sur le système.

Comment puis-je transmettre du contenu brut à l'e-mail?

Exemple:

$content = "Hi,welcome user!";

Mail::send($content,$data,function(){});
31
nexana

update: Dans Laravel 5 vous pouvez utiliser raw à la place:

Mail::raw('Hi, welcome user!', function ($message) {
  $message->to(..)
    ->subject(..);
});

Voici comment vous le faites:

Mail::send([], [], function ($message) {
  $message->to(..)
    ->subject(..)
    // here comes what you want
    ->setBody('Hi, welcome user!'); // assuming text/plain
    // or:
    ->setBody('<h1>Hi, welcome user!</h1>', 'text/html'); // for HTML rich messages
});
70
Jarek Tkaczyk

Pour les emails en HTML

Mail::send(array(), array(), function ($message) use ($html) {
  $message->to(..)
    ->subject(..)
    ->from(..)
    ->setBody($html, 'text/html');
});
35
Sajjad Ashraf

La classe Mailer transmet une chaîne à addContent qui, via diverses autres méthodes, appelle views->make(). En conséquence, le passage direct d'une chaîne de contenu ne fonctionnera pas car il essaiera de charger une vue portant ce nom.

Ce que vous devez faire est de créer une vue qui reproduit simplement $content

// mail-template.php
<?php echo $content; ?>

Et puis insérez votre chaîne dans cette vue au moment de l'exécution.

$content = "Hi,welcome user!";

$data = [
    'content' => $content
];

Mail::send('mail-template', $data, function() { });
13
Ben Swinburne

Si vous utilisiez des mailables. Vous pouvez faire quelque chose comme ceci dans la méthode de construction:

public function build()
{

    return $this->view('email')
        ->with(['html'=>'This is the message']);
}

Et vous venez de créer la vue de lame email.blade.php dans votre dossier de ressources.

Ensuite, dans la lame, vous pouvez référencer votre chaîne en utilisant la syntaxe laravel blade

 <html>
    <body>
      {{$html}}
    </body>
  </html>

ou 

 <html>
            <body>
              {!!$html!!}
            </body>
          </html>

Si votre texte brut contient une balise html J'espère que cela fonctionnera pour ceux qui ont des modèles stockés dans la base de données et qui souhaitent tirer parti de la classe Mailables de Laravel.

1
Matthew Odedoyin

Ce n'est pas directement lié à la question, mais pour ceux qui cherchent à définir la version en texte brut de votre email tout en conservant la version HTML personnalisée, vous pouvez utiliser cet exemple:

Mail::raw([], function($message) {
    $message->from('[email protected]', 'Company name');
    $message->to('[email protected]');
    $message->subject('5% off all our website');
    $message->setBody( '<html><h1>5% off its awesome</h1><p>Go get it now !</p></html>', 'text/html' );
    $message->addPart("5% off its awesome\n\nGo get it now!", 'text/plain');
});

Si vous demandiez "mais pourquoi ne pas définir le premier argument en texte brut?", J'ai fait un test et il ne prend que la partie html, en ignorant la partie brute.

Si vous devez utiliser une variable supplémentaire, la fonction anonyme vous demandera d'utiliser l'instruction use() comme suit:

Mail::raw([], function($message) use($html, $plain, $to, $subject, $formEmail, $formName){
    $message->from($fromEmail, $fromName);
    $message->to($to);
    $message->subject($subject);
    $message->setBody($html, 'text/html' ); // dont miss the '<html></html>' if the email dont contains it to decrease your spam score !!
    $message->addPart($plain, 'text/plain');
});

J'espère que cela vous aidera.

0
Anwar

Pour envoyer du HTML brut, du texte, etc. à l’aide de Laravel Mailables, vous pouvez:

écrasez Mailable-> send () dans votre Mailable et utilisez la méthode des réponses précédentes:

send([], [], function($message){ $message->setBody() } )

Pas besoin d'appeler $ this-> view () à votre fonction de construction du tout.

0
patrox