Laravel 10 Generate PDF and Send Email Example

Step 1: Install Laravel

composer create-project laravel/laravel PdfExample

Step 2: Install dompdf Package

 composer package by following the composer command in your laravel application. 

composer require barryvdh/laravel-dompdf

Step 3: Make Configuration

So you can simply add the following below,

.env 

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=mygoogle@gmail.com
MAIL_PASSWORD=rrnnucvnqlbsl
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=mygoogle@gmail.com
MAIL_FROM_NAME="${APP_NAME}"

Step 4: Create Mail Class

we will create email for testing using Laravel Mail facade. So let's simple run bellow command. 

php artisan make:mail MailExample

Now you will have new folder "Mail" in app directory with MailExample.php file.

app/Mail/MailExample.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 Illuminate\Mail\Mailables\Attachment;
  
class MailExample extends Mailable
{
    use Queueable, SerializesModels;
  
    public $mailData;
  
    /**
     * Create a new message instance.
     */
    public function __construct($mailData)
    {
        $this->mailData = $mailData;
    }
  
    /**
     * Get the message envelope.
     */
    public function envelope(): Envelope
    {
        return new Envelope(
            subject: $this->mailData['title'],
        );
    }
  
    /**
     * Get the message content definition.
     */
    public function content(): Content
    {
        return new Content(
            view: 'emails.myTestMail',
            with: $this->mailData
        );
    }
  
    /**
     * Get the attachments for the message.
     *
     * @return array

     */
    public function attachments(): array
    {
        return [
            Attachment::fromData(fn () => $this->mailData['pdf']->output(), 'Report.pdf')
                ->withMime('application/pdf'),
        ];
    }
}

Step 5: Add Route

routes/web.php 

<?php
  
    use Illuminate\Support\Facades\Route;
      
    use App\Http\Controllers\PDFController;
      
    /*
    |--------------------------------------------------------------------------
    | Web Routes
    |--------------------------------------------------------------------------
    |
    | Here is where you can register web routes for your application. These
    | routes are loaded by the RouteServiceProvider within a group which
    | contains the "web" middleware group. Now create something great!
    |
    */
      
    Route::get('send-email-pdf', [PDFController::class, 'index']);

Step 6: Add Controller

we require to create new controller PDFController that will manage index method of route.  

app/Http/Controllers/PDFController.php

<?php
      
      namespace App\Http\Controllers;
             
      use Illuminate\Http\Request;
      use App\Mail\MailExample;
      use PDF;
      use Mail;
          
      class PDFController extends Controller
      {
             
          /**
           * Show the application dashboard.
           *
           * @return \Illuminate\Http\Response
           */
          public function index()
          {
              $data["email"] = "your@gmail.com";
              $data["title"] = "From webthestuff.com";
              $data["body"] = "This is Demo";
          
              $pdf = PDF::loadView('emails.myTestMail', $data);
              $data["pdf"] = $pdf;
              Mail::to($data["email"])->send(new MailExample($data));

            
          }
}
            

Step 7: Create View File

resources/views/emails/myTestMail.blade.php 

<!DOCTYPE html>
<html>
<head>
    <title>webthestuff.com</title>
</head>
<body>
    <h1>{{ $title }}</h1>
    <p>{{ $body }}</p>
     
    <p>Thank you</p>
</body>
</html>

Run Laravel App:

php artisan serve

Now, Go to browser, type the given URL and view the output:

http://localhost:8000/send-email-pdf