Laravel Contact Form Send Email using Gmail SMTP—Markdown Laravel

Sahin Uddin Rony
6 min readAug 20, 2023

--

Sending Email by Laravel

When building Laravel applications, each type of email sent by your application is represented as a “mailable” class. First, you may specify the “from” address on your message’s envelope. Within a mailable class’s content method, you may define the view, or which template should be used when rendering the email’s contents. Markdown mailable messages allow you to take advantage of the pre-built templates. Laravel is able to render beautiful, responsive HTML templates for the messages while also automatically generating a plain-text counterpart. So, Let’s start with an Laravel Contact Form Send Email using Gmail SMTP.

> Link to My Github Repository for Code Download<

Step 1: Install Laravel

This step is not required; however, if you have not created the Laravel app, then you may go ahead and execute the below command:

composer create-project laravel/laravel example-app

Step 2: Make Gmail Configuration

Make sure you must open your Gmail account then follow step 1 from 6. Finally copy password (Show Figure-1) for use setup .env file.

Follow image 1 from 6
Figure-1

Step 3: Update SMTP Details in .env File

In Third step, you must add .env file configuration with installed Laravel file. Firstly set ( MAIL_MAILER, MAIL_HOST, MAIL_PORT, MAIL_ENCRYPTION, MAIL_FROM_NAME) are fixed as figure -2 then set MAIL_USERNAME will add Gmail account name when you create at first and MAIL_PASSWORD will add your copy password(Show Figure-1). MAIL_FROM_ADDRESS and MAIL_USERNAME will same .

So, you can simply add as like following.

.env

MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=youmailname@gmail.com
MAIL_PASSWORD=lfmgwuousmtnqfas
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS= youmailname@gmail.com
MAIL_FROM_NAME="${APP_NAME}"

Figure-2

Step 4: Add Routes

Now create two routes in your web.php file one for showing Contact form and another is sending email to the user which you want.

routes\web.php

<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\MailController;
// email send
Route::get ('/',[MailController::class,'mailform']);
Route::post ('/send-mail',[MailController::class,'maildata'])->name('send_mail');

Step 5: Create View Contact Form

Now you need to create a blade file where you show the email send the form in Laravel.

resources/views/mail.blade.php

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title> Laravel mail Send Syetem </title>
</head>
<body>
<section id="contact" class="contact">
<div class="container" data-aos="fade-up">
<div class="row">
<div class="col-lg-7 mt-5 mt-lg-0 d-flex align-items-stretch">
<form action="{{ route('send_mail') }}" method="POST"
enctype="multipart/form-data">
@csrf
<div class="row">
<div class="form-group col-md-6">
<label for="exampleInputEmail">Your Name</label>
<input type="text" name="name" class="form-control" required>
</div>
<div class="form-group col-md-6">
<label for="exampleInputEmail">Your Email</label>
<input type="email" class="form-control" name="email" required>
</div>
</div>
<div class="form-group">
<label for="exampleInputEmail">Subject</label>
<input type="text" class="form-control" name="sub" required>
</div>
<div class="form-group">
<label for="exampleInputEmail">Message</label>
<textarea class="form-control" name="mess" rows="10"
required></textarea>
</div>
<div class="text-center"><button type="submit">Send Mail</button></div>
</form>
</div>
</div>
</div>
</section><! - End Contact Section →
</body>
</html>

Step 6: Create Controller

You can create a new controller or update these methods in your existing controller. Here we create a new controller you can also create a new after running the below command.

php artisan make:controller MailController

After successfully create a new controller you can update the below code in your file. Now, update code on MailController file.

app/Http/Controllers/MailController.php

<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Mail\SendMail;
use App\Mail\SendMessageToEndUser;
use Mail;
class MailController extends Controller
{
public function mailform()
{
return view('mail');
}
public function maildata(Request $request)
{
$name = $request->name;
$email = $request->email;
$sub = $request->sub;
$mess = $request->mess;
$mailData = [
'url' => 'https://sandroft.com/',
];
$send_mail = "sahincseiu@gmail.com";
Mail::to($send_mail)->send(new SendMail($name, $email, $sub, $mess));
$senderMessage = "thanks for your message , we will reply you in later";
Mail::to( $email)->send(new
SendMessageToEndUser($name,$senderMessage,$mailData));
return "Mail Send Successfully";
}
}

Step 7: Generating Mailable Class with Markdown (Two Part)

Part — 7.1: Send Email to Admin

To generate a mailable with a corresponding Markdown template, you may use the — markdown option of the make:mail Artisan command. So, let’s run bellow command.

php artisan make:mail SendMail - markdown=SendMail

now, let’s update code on SendMail.php file as bellow:

app/Mail/SendMail.php

<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
// use App\Http\Controllers\MailController;
class SendMail extends Mailable
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*/
public $name, $email, $sub, $mess;
public function __construct($name, $email, $sub, $mess)
{
$this->name = $name;
$this->email = $email;
$this->sub = $sub;
$this->mess = $mess;
}
/**
* Get the message envelope.
*/
public function envelope(): Envelope
{
return new Envelope(
// subject: 'Sandroft Website Mail',
subject: $this->sub,
);
}
/**
* Get the message content definition.
*/
public function content(): Content
{
return new Content(
// view: 'sand',
markdown: 'email_to_admin',
);
}
/**
* Get the attachments for the message.
*
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
return [];
}
}

Part — 7.2: Send Reply Email to User

To generate a mailable with a corresponding Markdown template, you may use the — markdown option of the make:mail Artisan command. So, let’s run bellow command.

php artisan make:mail SendMessageToEndUser - markdown=SendMessageToEndUser

now, let’s update code on SendMessageToEndUser.php file as bellow:

app/Mail/ SendMessageToEndUser.php

<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
class SendMessageToEndUser extends Mailable
{
use Queueable, SerializesModels;
public $senderMessage = '';
public $name = '';
public $url = '';
public $mailData;
/**
* Create a new message instance.
*/
public function __construct( $name, $senderMessage,$mailData )
{
$this->name = $name;
$this->senderMessage = $senderMessage;
$this->mailData = $mailData;
}
/**
* Get the message envelope.
*/
public function envelope(): Envelope
{
return new Envelope(
subject: 'Send Message To End User',
);
}
/**
* Get the message content definition.
*/
public function content(): Content
{
return new Content(
// view: 'enduser-mail',
markdown: 'reply_email',
);
}
/**
* Get the attachments for the message.
*
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
return [];
}
}

Step 8: Make View File for Email Body (Two Part)

In this framework email body content has been get from view file. We below we have made one

Part — 8.1: Create Blade View for Send Email to Admin

When we send an email then we need a template that shows the message.

resources/views/email_to_admin.blade.php

@component('mail::message')
# Name: {{ $name }}
# Email: {{ $email }}<br>
Subject: {{ $sub }} <br><br>
Message:<br> {{ $mess }}
{{ - @component('mail::button', '$url')
Visit Our Website
@endcomponent - }}
Thanks,
{{ config('app.name') }}
@endcomponent

Part — 8.2: Create Blade View for Send Reply Email to User

resources/views/reply_email.blade.php

@component('mail::message')
# Hi {{ $name }},
{{ - # {{ $senderMessage }} - }}
Receive your email. I will try quicly answer.
@component('mail::button', ['url' => $mailData['url']])
Visit Our Website
@endcomponent
Thanks,
{{ config('app.name') }}
@endcomponent

Final Step: Run Laravel App.

All the required steps have been done, now you have to type the given below command and hit enter to run the Laravel app:

php artisan serve

Now, go to your web browser, type the given URL and view the app output:

http://localhost:8000/mail

Output:

Great! You successfully lean Email Send Example in Laravel 10. I hope it works for you. If you have any questions don’t hesitate to drop a message or contact my email sahincseiu@gmail.com.

My another article ->

Laravel: Email Subscribe (Newsletter) using Gmail SMTP

--

--

Sahin Uddin Rony

Hello! I'm Co-Founder at Sandroft and a passionate web developer and SEO Specialist who loves about Laravel and Programming. www.linkedin.com/in/sahinuddinrony/