1. Code
  2. PHP
  3. Laravel

Cómo Enviar Emails en Laravel

Scroll to top

Spanish (Español) translation by Rafael Chavarría (you can also view the original English article)

En este artículo, vamos a explorar la API Mail en el marco de trabajo web Laravel. Laravel saca ventaja de la popular librería SwiftMailer, la cuál es sencilla de usar y viene con una variedad de controladores de email de los cuáles elegir. En las etapas posteriores del artículo, iremos en una demostración a profundidad de los conceptos discutidos en la primera mitad del artículo.

Configurando los Prerequisitos.

Laravel implementa un envoltorio encima de la librería SwiftMailer que hace la administración de email muy sencilla de configurar y usar al mismo tiempo. Puedes encontrar los ajustes de correo por defecto en config/mail.php.

1
<?php
2
3
return [
4
5
    /*

6
    |--------------------------------------------------------------------------

7
    | Mail Driver

8
    |--------------------------------------------------------------------------

9
    |

10
    | Laravel supports both SMTP and PHP's "mail" function as drivers for the

11
    | sending of e-mail. You may specify which one you're using throughout

12
    | your application here. By default, Laravel is setup for SMTP mail.

13
    |

14
    | Supported: "smtp", "sendmail", "mailgun", "mandrill", "ses",

15
    |            "sparkpost", "log", "array"

16
    |

17
    */
18
19
    'driver' => env('MAIL_DRIVER', 'sendmail'),
20
21
    /*

22
    |--------------------------------------------------------------------------

23
    | SMTP Host Address

24
    |--------------------------------------------------------------------------

25
    |

26
    | Here you may provide the host address of the SMTP server used by your

27
    | applications. A default option is provided that is compatible with

28
    | the Mailgun mail service which will provide reliable deliveries.

29
    |

30
    */
31
32
    'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
33
34
    /*

35
    |--------------------------------------------------------------------------

36
    | SMTP Host Port

37
    |--------------------------------------------------------------------------

38
    |

39
    | This is the SMTP port used by your application to deliver e-mails to

40
    | users of the application. Like the host we have set this value to

41
    | stay compatible with the Mailgun e-mail application by default.

42
    |

43
    */
44
45
    'port' => env('MAIL_PORT', 587),
46
47
    /*

48
    |--------------------------------------------------------------------------

49
    | Global "From" Address

50
    |--------------------------------------------------------------------------

51
    |

52
    | You may wish for all e-mails sent by your application to be sent from

53
    | the same address. Here, you may specify a name and address that is

54
    | used globally for all e-mails that are sent by your application.

55
    |

56
    */
57
58
    'from' => [
59
        'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
60
        'name' => env('MAIL_FROM_NAME', 'Example'),
61
    ],
62
63
    /*

64
    |--------------------------------------------------------------------------

65
    | E-Mail Encryption Protocol

66
    |--------------------------------------------------------------------------

67
    |

68
    | Here you may specify the encryption protocol that should be used when

69
    | the application send e-mail messages. A sensible default using the

70
    | transport layer security protocol should provide great security.

71
    |

72
    */
73
74
    'encryption' => env('MAIL_ENCRYPTION', 'tls'),
75
76
    /*

77
    |--------------------------------------------------------------------------

78
    | SMTP Server Username

79
    |--------------------------------------------------------------------------

80
    |

81
    | If your SMTP server requires a username for authentication, you should

82
    | set it here. This will get used to authenticate with your server on

83
    | connection. You may also set the "password" value below this one.

84
    |

85
    */
86
87
    'username' => env('MAIL_USERNAME'),
88
89
    'password' => env('MAIL_PASSWORD'),
90
91
    /*

92
    |--------------------------------------------------------------------------

93
    | Sendmail System Path

94
    |--------------------------------------------------------------------------

95
    |

96
    | When using the "sendmail" driver to send e-mails, we will need to know

97
    | the path to where Sendmail lives on this server. A default path has

98
    | been provided here, which will work well on most of your systems.

99
    |

100
    */
101
102
    'sendmail' => '/usr/sbin/sendmail -bs',
103
104
    /*

105
    |--------------------------------------------------------------------------

106
    | Markdown Mail Settings

107
    |--------------------------------------------------------------------------

108
    |

109
    | If you are using Markdown based email rendering, you may configure your

110
    | theme and component paths here, allowing you to customize the design

111
    | of the emails. Or, you may simply stick with the Laravel defaults!

112
    |

113
    */
114
115
    'markdown' => [
116
        'theme' => 'default',
117
118
        'paths' => [
119
            resource_path('views/vendor/mail'),
120
        ],
121
    ],
122
123
];

Cuando se trata de enviar emails, Laravel soporta diferentes controladores de los cuáles elegir. Como puedes ver, el MAIL_DRIVER por defecto está establecido a smtp.

Si vas a usar el controlador smtp para enviar correos entonces también se requiere establecer otros ajustes relacionados como MAIL_HOSTMAIL_PORTMAIL_ENCRYPTIONMAIL_USERNAME, y MAIL_PASSWORD.

Por el otro lado, si vas a usar el controlador sendmail, entonces quieres asegurar que la ruta de sistema sendmail está establecida al valor correcto en el archivo config/mail.php.

También puedes establecer la dirección from que será usada mientras se mandan correos bajo la llave from. Y finalmente, si quieres usar generación de correo basado en marcado, puedes establecer esos ajustes bajo la llave markdown.

La cereza del pastel es que también podrías usar proveedores de correo de terceros como Mailgun, Mandrill, SES, y SparkPost. Si estás usando uno de esos servicios, necesitas asegurar que estableces los ajustes correspondientes en el archivo config/services.php.

Así que esa fue una introducción básica a los ajustes relacionados de API en Laravel. De la siguiente sección en adelante, iremos a través de un ejemplo personalizado que te muestra cómo enviar emails.

Crea la Clase Mailable

En esta sección, crearemos la clase mailable, la cuál será usada para enviar emails. La clase mailable es responsable de enviar emails usando un mailer que es configurado en el archivo config/mail.php. De hecho, Laravel ya proporciona un comando artisan que nos permite crear una plantilla base.

1
php artisan make:mail DemoEmail

Eso debería crear una plantilla de email en blanco en app/Mail/DemoEmail.php, como se muestra en el siguiente código.

1
<?php
2
3
namespace App\Mail;
4
5
use Illuminate\Bus\Queueable;
6
use Illuminate\Mail\Mailable;
7
use Illuminate\Queue\SerializesModels;
8
use Illuminate\Contracts\Queue\ShouldQueue;
9
10
class DemoEmail extends Mailable
11
{
12
    use Queueable, SerializesModels;
13
14
    /**

15
     * Create a new message instance.

16
     *

17
     * @return void

18
     */
19
    public function __construct()
20
    {
21
        //

22
    }
23
24
    /**

25
     * Build the message.

26
     *

27
     * @return $this

28
     */
29
    public function build()
30
    {
31
        return $this->view('view.name');
32
    }
33
}

Reemplacemos los contenidos de ese archivo con lo siguiente.

1
<?php
2
3
namespace App\Mail;
4
5
use Illuminate\Bus\Queueable;
6
use Illuminate\Mail\Mailable;
7
use Illuminate\Queue\SerializesModels;
8
use Illuminate\Contracts\Queue\ShouldQueue;
9
10
class DemoEmail extends Mailable
11
{
12
    use Queueable, SerializesModels;
13
    
14
    /**

15
     * The demo object instance.

16
     *

17
     * @var Demo

18
     */
19
    public $demo;
20
21
    /**

22
     * Create a new message instance.

23
     *

24
     * @return void

25
     */
26
    public function __construct($demo)
27
    {
28
        $this->demo = $demo;
29
    }
30
31
    /**

32
     * Build the message.

33
     *

34
     * @return $this

35
     */
36
    public function build()
37
    {
38
        return $this->from('sender@example.com')
39
                    ->view('mails.demo')
40
                    ->text('mails.demo_plain')
41
                    ->with(
42
                      [
43
                            'testVarOne' => '1',
44
                            'testVarTwo' => '2',
45
                      ])
46
                      ->attach(public_path('/images').'/demo.jpg', [
47
                              'as' => 'demo.jpg',
48
                              'mime' => 'image/jpeg',
49
                      ]);
50
    }
51
}

Hay dos métodos importantes que la clase mailable generalmente implementa---__construct y build. El método __construct es usado para inicializar objetos que se supone debes usar en la platilla de correo. Por el otro lado, el método build es usado para iniciar valores más específicos de email como de, vista de plantilla, adjuntos y similares.

En nuestro caso, hemos pasado el objeto $demo como un argumento de constructor, y está asignado a la propiedad pública demo.

En el método build, hemos iniciado una configuración específica de email.

  • El from es usado para establecer una dirección de correo que será usada como una dirección de remitente.
  • Usando el método view, puedes establecer la plantilla de email que será usada mientras se envía un email usando este mailable. En nuestro caso, lo establecimos a mails.demo, y este significa que necesitas crear un archivo de vista de plantilla en resources/views/mails/demo.blade.php.
  • Después, el método text es usado para establecer la versión de texto plano de una plantilla de email.
  • Como acabamos de discutir, el método __construct es usado para establecer objetos que serán usados en la plantilla de email, también puedes usar el método with que te permite establecer los datos de vista de un mensaje.
  • Después, hemos usado el método attach para adjuntar una imagen con un mensaje.

Por supuesto, necesitamos crear plantillas de email que se supone usaremos mientras enviamos emails. Continua y crea un archivo resources/views/mails/demo.blade.php como se muestra en el siguiente código.

1
Hello <i>{{ $demo->receiver }}</i>,
2
<p>This is a demo email for testing purposes! Also, it's the HTML version.</p>
3
4
<p><u>Demo object values:</u></p>
5
6
<div>
7
<p><b>Demo One:</b>&nbsp;{{ $demo->demo_one }}</p>
8
<p><b>Demo Two:</b>&nbsp;{{ $demo->demo_two }}</p>
9
</div>
10
11
<p><u>Values passed by With method:</u></p>
12
13
<div>
14
<p><b>testVarOne:</b>&nbsp;{{ $testVarOne }}</p>
15
<p><b>testVarTwo:</b>&nbsp;{{ $testVarTwo }}</p>
16
</div>
17
18
Thank You,
19
<br/>
20
<i>{{ $demo->sender }}</i>

También, creemos la versión de texto plano de ese archivo en resources/views/mails/demo_plain.blade.php.

1
Hello {{ $demo->receiver }},
2
This is a demo email for testing purposes! Also, it's the HTML version.
3
4
Demo object values:
5
6
Demo One: {{ $demo->demo_one }}
7
Demo Two: {{ $demo->demo_two }}
8
9
Values passed by With method:
10
11
testVarOne: {{ $testVarOne }}
12
testVarOne: {{ $testVarOne }}
13
14
Thank You,
15
{{ $demo->sender }}

Así que esa fue la clase mailable a tu disposición, y no hemos terminado aún ya que necesitamos usar la fachada Mail para de hecho enviar correos. En la siguiente sección, exploraremos cómo puedes usar la Fachada Mail para enviar emials usando la clase Mailable DemoEmail que acabamos de crear en esta sección.

Terminando

En esta sección, crearemos un ejemplo para demostrar cómo puedes usar la clase Mailable que fue creada en la última sección.

Creemos un archivo controlador en app/Http/Controllers/MailController.php con los siguientes contenidos.

1
<?php
2
namespace App\Http\Controllers;
3
4
use App\Http\Controllers\Controller;
5
use App\Mail\DemoEmail;
6
use Illuminate\Support\Facades\Mail;
7
8
class MailController extends Controller
9
{
10
    public function send()
11
    {
12
        $objDemo = new \stdClass();
13
        $objDemo->demo_one = 'Demo One Value';
14
        $objDemo->demo_two = 'Demo Two Value';
15
        $objDemo->sender = 'SenderUserName';
16
        $objDemo->receiver = 'ReceiverUserName';
17
18
        Mail::to("receiver@example.com")->send(new DemoEmail($objDemo));
19
    }
20
}

Es importante notar que hemos incluido la Fachada Illuminate\Support\Facades\Mail que será usada para enviar un email. En el método send, la siguiente declaración es responsable de enviar un correo inicializando el Mailable App\Mail\DemoEmail en el primer lugar.

1
Mail::to("receiver@example.com")->send(new DemoEmail($objDemo));

El método to de la Fachada Illuminate\Support\Facades\Mail devuelve una instancia de la clase \Illuminate\Mail\PendingMail, que ya contiene un mailer apropiado configurado en el archivo config/mail.php.

Y finalmente, usamos el método send de la clase \Illuminate\Mail\PendingMail que envía un email de verdad.

Para probarlo, agreguemos una ruta asociada en el archivo routes/web.php.

1
// Email related routes

2
Route::get('mail/send', 'MailController@send');

Y con eso en su lugar, puedes ejecutar la URL http://tu-sitio-laravel.com/mail/send para ver si funciona como se espera.

Por otro lado, si quieres probar tus plantillas de email rápidamente, sin enviar emails de verdad, hay una provisión en Laravel que te permite registrar todos los correos de salida.

Para lograr eso, necesitas establecer el valor de MAIL_DRIVER a log en el archivo config/mail.php. Después, podrías ejecutar la URL antes mencionada e inspeccionar el archivo de registro para revisar si la plantilla de email se registró ahí.

Si todo sale bien, deberías ver un email siendo registrado al archivo storage/logs/laravel.log.

Eso es prácticamente todo en cuanto a la característica de correo respecta en Laravel, y eso concluye este artículo también.

Conclusión

Hoy recorrimos la API de correo que viene integrada en Laravel, y esta también soporta una variedad de controladores.

Comenzando con conceptos básicos, implementamos la clase mailable que es un elemento esencial en la API de correo en Laravel a medida que avanzamos. Al final, también probamos la clase mailable creando un controlador personalizado para ver si funcionaba de verdad.

Si apenas estás comenzando con Laravel o estás buscando expandir tu conocimiento, sitio o aplicación con extensiones, tenemos una variedad de cosas que puedes estudiar en Envato Market.

¡Me encantaría conocer tu retroalimentación en la forma de peticiones y comentarios usando la sección de abajo!