Step-by-step instructions to configure mail function with Lumen php framework (Lumen sends email by SMTP). It uses the Laravel mail library and SMPT. You can also use the MailMug.net sandbox account for email testing. MailMug is providing fake SMTP testing accounts.
Step 1: Add Laravel mail library to Lumen
The email library is not included with the Lumen framework. We need to install it by the composer.
Go to the Lumen root folder and execute the following code.
composer require illuminate\mail
Step 2: Configure the mail service
Edit bootstrap/app.php file. Uncommand $app->withFacades(); and register Illuminate\Mail\MailServiceProvider::class then add $app->configure(‘mail’);
$app->withFacades();
$app->register(Illuminate\Mail\MailServiceProvider::class);
After creating the configuration file, you should register the mailer and its aliases within your bootstrap/app.php
file.
$app->configure('app');
$app->configure('mail');
$app->alias('mail.manager', Illuminate\Mail\MailManager::class);
$app->alias('mail.manager', Illuminate\Contracts\Mail\Factory::class);
$app->alias('mailer', Illuminate\Mail\Mailer::class);
$app->alias('mailer', Illuminate\Contracts\Mail\Mailer::class);
$app->alias('mailer', Illuminate\Contracts\Mail\MailQueue::class);
Step 3: Add SMTP credentials to the ENV file
Create a free SMTP sandbox account from Mailmug.net. We can easily test email functions from MailMug.
MAIL_MAILER=smtp
MAIL_HOST="smtp.mailmug.net"
MAIL_PORT=2525
MAIL_USERNAME="lz5e45osxdq0uruxb"
MAIL_PASSWORD="kbs6mfhifn8di3gi"
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="your.email@mail.com"
MAIL_FROM_NAME="${APP_NAME}"
Step 4: Add config/mail.php file
Create a config folder then Copy the code from the following code and paste it to the config/mail.php file.
<?php
return [
/*
|--------------------------------------------------------------------------
| Default Mailer
|--------------------------------------------------------------------------
|
| This option controls the default mailer that is used to send any email
| messages sent by your application. Alternative mailers may be setup
| and used as needed; however, this mailer will be used by default.
|
*/
'default' => env('MAIL_MAILER', 'smtp'),
/*
|--------------------------------------------------------------------------
| Mailer Configurations
|--------------------------------------------------------------------------
|
| Here you may configure all of the mailers used by your application plus
| their respective settings. Several examples have been configured for
| you and you are free to add your own as your application requires.
|
| Laravel supports a variety of mail "transport" drivers to be used while
| sending an e-mail. You will specify which one you are using for your
| mailers below. You are free to add additional mailers as required.
|
| Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2",
| "postmark", "log", "array", "failover"
|
*/
'mailers' => [
'smtp' => [
'transport' => 'smtp',
'url' => env('MAIL_URL'),
'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
'port' => env('MAIL_PORT', 587),
'encryption' => env('MAIL_ENCRYPTION', 'tls'),
'username' => env('MAIL_USERNAME'),
'password' => env('MAIL_PASSWORD'),
'timeout' => null,
'local_domain' => env('MAIL_EHLO_DOMAIN'),
],
'ses' => [
'transport' => 'ses',
],
'mailgun' => [
'transport' => 'mailgun',
// 'client' => [
// 'timeout' => 5,
// ],
],
'postmark' => [
'transport' => 'postmark',
// 'client' => [
// 'timeout' => 5,
// ],
],
'sendmail' => [
'transport' => 'sendmail',
'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'),
],
'log' => [
'transport' => 'log',
'channel' => env('MAIL_LOG_CHANNEL'),
],
'array' => [
'transport' => 'array',
],
'failover' => [
'transport' => 'failover',
'mailers' => [
'smtp',
'log',
],
],
],
/*
|--------------------------------------------------------------------------
| Global "From" Address
|--------------------------------------------------------------------------
|
| You may wish for all e-mails sent by your application to be sent from
| the same address. Here, you may specify a name and address that is
| used globally for all e-mails that are sent by your application.
|
*/
'from' => [
'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
'name' => env('MAIL_FROM_NAME', 'Example'),
],
/*
|--------------------------------------------------------------------------
| Markdown Mail Settings
|--------------------------------------------------------------------------
|
| If you are using Markdown based email rendering, you may configure your
| theme and component paths here, allowing you to customize the design
| of the emails. Or, you may simply stick with the Laravel defaults!
|
*/
'markdown' => [
'theme' => 'default',
'paths' => [
resource_path('views/vendor/mail'),
],
],
];
Step 5: Create an Email Controller
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Mail;
class EmailController extends Controller
{
public function send() {
$data = array('name'=>'Test Name');
Mail::send('mail', $data, function($message) {
$message->to('your-email@gmail.com', 'Test Name')->subject('Test Mail from MailMug');
$message->from('info@name.com','your Name');
});
echo "Email Sent. Check your inbox.";
}
}
Step 6: Edit routes/web.php file
$router->get('/send', 'EmailController@send');
Step 7: Create resources/views/mail.blade.php file
Example
<p>Hi... How are you?</p>
Step 8: Test it
Navigate your-domain/send. Then it will send an email by MailMug.
Step 9: Add production email SMTP
Configure production email credentials from cPanel, plesk, or other server admin panel. Then copy SMPT credentials and paste them to .env
file.