Sending emails is crucial for any web application. Usually, an email is sent to notify the user of some kind of activity that has taken place on the site, for example, such as when updates have been made or when new friends have been found. In this short tutorial, I'll show you how to send emails with Gmail quickly from within a Laravel sample application by extending the functionality that we built in my last tutorial, Authentication With Laravel 4.
So, we'll take that authentication application (you can download the previous tutorial's source code on Github to give you a starting point) that we ended with last time and add in a new feature so that whenever a user registers for the site, we'll send them a confirmation email, welcoming them to the app!
Mail Configuration
Before we can send emails with Laravel 4 we need to configure the app/config/mail.php
file. In this file we can set the following options:
Option | Description |
driver |
The mailing driver you'd like to use. By default, this is set to SMTP, but you can also change it to use PHPs mail feature or Sendmail instead. |
host |
This is your SMTP server's host address. |
port |
Your SMTPs port. |
from |
This allows you to set the from field in your email, so that all emails are sent from the same address. |
encryption |
This is the encryption protocol that will be used whenever emails are sent. |
username |
This is your SMTP username. |
password |
This is your SMTP password. |
sendmail |
This is the path to where Sendmail can be found on the server, when using the sendmail driver. |
pretend |
When set to true , emails will be logged to a log file, rather than actually sending a real email message. |
Sending Mail With Gmail
For this tutorial I'm going to be using Gmail to send my email messages as it's super simple to use. All you need in order to send mail with Gmail is to have an active Gmail account, with a username and password. I'll provide you with everything else. Let's edit our app/config/mail.php
file to look something like this (I removed the comments to make the code more compact):
return array( 'driver' => 'smtp', 'host' => 'smtp.gmail.com', 'port' => 587, 'from' => array('address' => 'authapp@awesomeauthapp. com', 'name' => 'Awesome Laravel 4 Auth App'), 'encryption' => 'tls', 'username' => 'your_gmail_username', 'password' => 'your_gmail_password', 'sendmail' => '/usr/sbin/sendmail -bs', 'pretend' => false, );
Here I've left the driver
set to smtp
. I set the host
to use smtp.gmail.com
which is Gmail's SMTP server. I set the port
to 587
, the from
to a fake email address which sounds fitting for our application. I left the encryption
set to tls
and finally you'll then want to enter in your own Gmail username
and password
for your account and leave pretend
set to false
.
Sending Mail
Example Code
For this application, whenever a user successfully registers, we want to send them an email welcoming them to the site. Sending emails with Laravel is done by using the Mail::send()
method. Here's a small snippet of code, for example purposes:
Mail::send('folder.view', $data, function($message) { $message->to('registered-user@gmail. com', 'Jon Doe')->subject('Welcome to the Laravel 4 Auth App!'); });
The first argument is the view file we'd like to use in order to format our email message. The second argument is any data that we'd like to pass to that view file. The third argument is a closure which accepts a $message
object that we can use to tell the mailer who we're sending the email to and what the subject of this email will be. In this closure, you can also specify other options such as attachments, etc. This will then send out the email to the user.
Pretty easy right?
Sending Emails Upon Successful Registration
Let's now modify our UsersController
's postCreate()
action and take what we've learned about sending emails to send a welcome email message to our users, whenever they register for the app.
Within our postCreate()
action's if
statement, where we check if the validation has passed, right after where we save the user into the database, let's add in the following code:
if ($validator->passes()) { $user = new User; $user->firstname = Input::get('firstname'); $user->lastname = Input::get('lastname'); $user->email = Input::get('email'); $user->password = Hash::make(Input::get('password')); $user->save(); Mail::send('users.mails.welcome', array('firstname'=>Input::get('firstname')), function($message){ $message->to(Input::get('email'), Input::get('firstname').' '.Input::get('lastname'))->subject('Welcome to the Laravel 4 Auth App!'); }); return Redirect::to('users/login')->with('message', 'Thanks for registering!'); } else { return Redirect::to('users/register')->with('message', 'The following errors occurred')->withErrors($validator)->withInput(); }
Here we've called the Mail::send()
method and told it to use a users.mails.welcome
view file. We then pass in an array as the data that should be available within the view file, in this case we just sent in the users first name, using the Input::get('firstname')
method. Next, we create our closure and set this to send the email to the user's email address. We also set the name using the user's first and last name from the form. Lastly, we just give this a pretty generic subject(you can use whatever subject you'd like), so the user knows what all the fuss is about.
Creating the Email View File
Now we need to create our welcome
email view file. Under app/views/users
create a new folder named mails
and inside of it create a new file named welcome.blade.php
and add in the following code:
<h1>Hi, {{ $firstname }}!</h1> <p>We'd like to personally welcome you to the Laravel 4 Authentication Application. Thank you for registering!</p>
In this view file we just have some basic HTML, using the $firstname
variable that we passed as data from our controller to the view, welcoming the user to the application. There's not much to it, you can use your view files for emails just like you do for any other view.
Let's Try It Out
Make sure to start up your webserver using php artisan serve
and we can visit localhost:8000/users/register
, then create a new user:
... and then check that user's email account to verify that the email was sent successfully:
Perfect! Our email was sent.
In Conclusion
And that's all there is to sending email messages with Laravel 4 and Gmail. You can of course customize your email messages as much as you'd like to make the mail more appealing.
Now this is the most basic way to send mail with Laravel and it can slow your app down, as it sends the email, but you do have other options. You'll continue to use Laravel's mail class but instead of sending it immediately, you can queue up your emails to have them sent out in the background, without making your users wait. But this topic is best saved for a separate article.
For more information on sending email with Laravel check out the online documentation. Thanks for reading.
Comments