Laravel mail: pasar cadena en lugar de ver


Quiero enviar un correo electrónico de confirmación usando laravel. La función laravel Mail:: send () solo parece aceptar una ruta a un archivo en el sistema. El problema es que mis mailtemplates se almacenan en la base de datos y no en un archivo en el sistema.

¿Cómo puedo pasar contenido sin formato al correo electrónico?

Ejemplo:

$content = "Hi,welcome user!";

Mail::send($content,$data,function(){});
Author: jrenk, 2014-10-01

6 answers

Actualización: En Laravel 5 puede usar raw en su lugar:

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

Así es como lo haces:

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
});
 63
Author: Jarek Tkaczyk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-09 00:44:20

Para correos electrónicos Html

Mail::send(array(), array(), function ($message) use ($html) {
  $message->to(..)
    ->subject(..)
    ->from(..)
    ->setBody($html, 'text/html');
});
 35
Author: Sajjad Ashraf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-03 18:22:39

La clase Mailer pasa una cadena a addContent que a través de otros métodos llama a views->make(). Como resultado, pasar una cadena de contenido directamente no funcionará, ya que intentará cargar una vista con ese nombre.

Lo que tendrá que hacer es crear una vista que simplemente haga eco $content

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

Y luego inserte su cadena en esa vista en tiempo de ejecución.

$content = "Hi,welcome user!";

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

Mail::send('mail-template', $data, function() { });
 13
Author: Ben Swinburne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-01 11:25:39

Si estaba utilizando mailables. Puedes hacer algo como esto en el método build :

public function build()
{

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

Y simplemente siga adelante y cree la vista blade email.blade.php en su carpeta de recursos.

Luego en la hoja puede hacer referencia a su cadena usando la sintaxis de hoja de laravel

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

O

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

Si su texto sin procesar contiene marcas html Espero que esto funcione para aquellos que tienen plantillas almacenadas en la base de datos y quieren aprovechar la clase Mailables en Laravel.

 1
Author: Matthew Odedoyin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-07 16:40:03

No está directamente relacionado con la pregunta, pero para aquellos que buscan establecer la versión de texto sin formato de su correo electrónico mientras mantienen la versión HTML personalizada, puede usar este ejemplo :

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 se pregunta "¿pero por qué no establecer el primer argumento como texto plano ?", Hice una prueba y solo toma la parte html, ignorando la parte raw.

Si necesita usar una variable adicional, la función anónima necesitará que use la instrucción use() de la siguiente manera:

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

Esperanza les ayuda a ustedes.

 0
Author: Anwar Nairi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-06 09:14:37

Para enviar html sin procesar, texto, etc. utilizando Laravel Mailables puede

Override Mailable- > send () en tu Mailable y allí, usa el método en respuestas anteriores:

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

No es necesario llamar a this this->view() en tu función de compilación.

 0
Author: patrox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-01 11:47:42