Correo en Laravel

Manejo del correo en Laravel

Montar el sistema de ficheros remoto:

sshfs usuario@alumno.me:/home/usuario/todo/ servidor -p 22

Conexión al VPS

ssh usuario@alumno.me

Enviar mensaje de prueba desde consola (para comprobar el funcionamiento del servidor de correo):

sudo apt install mailutils
mail -s "Email de prueba" paco.portada@protonmail.com <<< "Este es el cuerpo del correo"

Uso de un servidor de correo (Postfix, por ejemplo) en el propio equipo

cd ~/todo
nano .env

Fichero .env (en la carpeta del proyecto de Laravel):

MAIL_MAILER=smtp
MAIL_HOST=localhost
MAIL_PORT=25
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=info@alumno.me
MAIL_FROM_NAME="${APP_NAME}"

Laravel 9 Send Mail using Gmail SMTP Server

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

 

Envío de un email desde un formulario

Añadir las rutas en el fichero routes/web.php

<?php


use App\Http\Controllers\EmailController;



Route::get('/email', [EmailController::class, 'create']);
Route::post('/email', [EmailController::class, 'sendEmail'])->name('send.email');

Crear el controlador

php artisan make:controller EmailController

Añadir este contenido al fichero app\Http\Controllers\EmailController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Mail;

class EmailController extends Controller
{
    public function create()
    {

        return view('email');
    }

    public function sendEmail(Request $request)
    {
        $request->validate([
          'email' => 'required|email',
          'subject' => 'required',
          'content' => 'required',
        ]);

        $data = [
          'subject' => $request->subject,
          'email' => $request->email,
          'content' => $request->content
        ];

        Mail::send('email-template', $data, function($message) use ($data) {
          $message->to($data['email'])
          ->subject($data['subject']);
        });

        return back()->with(['message' => 'Email successfully sent!']);
    }
}

Crear el fichero resources\views\email.blade.php

<!DOCTYPE html>
<html>
<head>
    <title>Mail Send in Laravel</title>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- Bootstrap -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css">
    <meta name="csrf-token" content="{{ csrf_token() }}" />
</head>

<body>
    <div class="container">
        <h1>Mail Send Example</h1>
          @if(session()->has('message'))
              <div class="alert alert-success">
                  {{ session()->get('message') }}
              </div>
          @endif
        <form action="{{ route('send.email') }}" method="post">
          @csrf
            <div class="form-group">
                <label>Email:</label>
                <input type="email" name="email" class="form-control" placeholder="Enter Email">
                @error('email')
                  <span class="text-danger"> {{ $message }} </span>
                @enderror
            </div>

            <div class="form-group">
                <label>Subject:</label>
                <input type="text" name="subject" class="form-control" placeholder="Enter subject">
                @error('subject')
                  <span class="text-danger"> {{ $message }} </span>
                @enderror
            </div>

            <div class="form-group">
                <strong>Content:</strong>
                <textarea name="content" rows="5" class="form-control" placeholder="Enter Your Message"></textarea>
                @error('content')
                  <span class="text-danger"> {{ $message }} </span>
                @enderror
            </div>
            <div class="form-group">
                <button type="submit" class="btn btn-success save-data">Send</button>
                <a href={{ route('dashboard') }}>Return</a>
            </div>
        </form>
    </div>
</body>
</html>

Crear el fichero resources\views\email-template.blade.php

<div class="container">
     <div class="row justify-content-center">
         <div class="col-md-8">
             <div class="card">
                 <div class="card-header">Hello!</div>
                   <div class="card-body">
                    @if (session('resent'))
                         <div class="alert alert-success" role="alert">
                            {{ __('A fresh mail has been sent to your email address.') }}
                        </div>
                    @endif
                    {!! $content !!}
                </div>
            </div>
        </div>
    </div>
</div>

Accederemos desde el navegador a la ruta email para hacer el envío:

laravel.alumno.me/email

Error: Symfony \ Component \ Mailer \ Exception \ TransportException    Unable to connect with STARTTLS: stream_socket_enable_crypto()

Modificar el fichero config/mail.php

Añadir estas líneas a la configuración de smtp:

'auth_mode' => null,
'verify_peer' => false,
cd ~/todo

sudo nano config/mail.php
Contenido del fichero config/mail.php
'mailers' => [

'smtp' => [
    'transport' => 'smtp',
    'url' => env('MAIL_URL'),
    'host' => env('MAIL_HOST', '127.0.0.1'),
    'port' => env('MAIL_PORT', 25),
    'encryption' => env('MAIL_ENCRYPTION', 'tls'),
    'username' => env('MAIL_USERNAME'),
    'password' => env('MAIL_PASSWORD'),
    'timeout' => null,
    'local_domain' => env('MAIL_EHLO_DOMAIN'),
    'auth_mode' => null,
    'verify_peer' => false,
],

Más información:

Laravel 11 Send Email with Attachment Example

 

Deja una respuesta