Error al utilizar la clase "Notification" en Laravel, no se envían los correos electrónicos

Publicado por Lynn
hace 4 meses

Hola a todos,

Estoy trabajando en un proyecto en Laravel y estoy intentando enviar notificaciones por correo electrónico utilizando la clase "Notification". Sin embargo, estoy teniendo problemas y los correos electrónicos no se envían correctamente.

Aquí está mi código:

use Illuminate\Notifications\Notification;
use Illuminate\Notifications\Messages\MailMessage;

class MyNotification extends Notification
{

    public function __construct($data)
    {
        $this->data = $data;
    }

    public function via($notifiable)
    {
        return ['mail'];
    }

    public function toMail($notifiable)
    {
        return (new MailMessage)
                    ->subject('Nuevo mensaje')
                    ->line('Tienes un nuevo mensaje.')
                    ->action('Ver mensaje', url('/messages/' . $this->data['message_id']))
                    ->line('Gracias por usar nuestra aplicación!');
    }
}

Y esto es lo que estoy intentando hacer en mi controlador:

use App\Notifications\MyNotification;

public function sendNotification($data)
{
    $user = User::find(1);

    $user->notify(new MyNotification($data));

    return "Notificación enviada!";
}

He verificado que la dirección de correo electrónico proporcionada a través del notifiable sea correcta y que el controlador esté llamando correctamente al método "notify".

Sin embargo, no recibo ningún correo electrónico y no veo ningún error en los registros de Laravel. ¿Alguien tiene alguna idea de lo que podría estar sucediendo aquí? ¿Hay algo que me esté perdiendo?

Un gran agradecimiento de antemano por su ayuda.

Respuesta de Gordon Shumway
hace 4 meses

¡Hola, Lynn!

Si los correos no se están enviando pero tampoco surgen errores en los logs, podría ser que Laravel esté enviando los correos a tu “log” o a otro driver de desarrollo en lugar de a un servidor SMTP real. Aquí tengo algunas sugerencias para solucionar el problema:

  1. .env y configuración del correo: Asegúrate de que en tu archivo .env estés utilizando las credenciales correctas de tu servidor de correo y el driver que deseas utilizar.

    Por ejemplo, para usar SMTP, tu archivo .env debería tener algo similar a:

    MAIL_MAILER=smtp
    MAIL_HOST=smtp.servidor.com
    MAIL_PORT=587
    MAIL_USERNAME=tu.usuario@dominio.com
    MAIL_PASSWORD=tu_contraseña
    MAIL_ENCRYPTION=tls
    MAIL_FROM_ADDRESS=noresponder@dominio.com
    MAIL_FROM_NAME="${APP_NAME}"

    Después de actualizar .env, ejecuta php artisan config:cache para limpiar la caché de la configuración.

  2. Colas de trabajo: Si estás usando colas para enviar correos electrónicos, asegúrate de que el worker está corriendo con php artisan queue:work.

  3. Logs: Revisa los logs de Laravel en storage/logs/laravel.log para cualquier error relacionado con el envío de correos electrónicos.

  4. Eventos y Listeners: Asegúrate de no tener listeners o eventos que estén interceptando la notificación y evitando que se envíe.

  5. Mail Fake: Si estás escribiendo tests, Laravel podría estar utilizando Mail::fake() en algún lugar de tu código de pruebas, lo que impediría el envío real de correos.

  6. Notifiable: Comprueba que tu modelo User implementa la interfaz Notifiable y usa el trait:

    use Illuminate\Notifications\Notifiable;
    
    class User extends Authenticatable
    {
       use Notifiable;
       // ...
    }

Asumiendo que tu configuración para las notificaciones está correcta y el User modelo está bien configurado, deberías revisar estos elementos que te mencioné. Si todo parece estar en orden, te recomendaría realizar un test simple con el envío de un correo directamente desde una ruta para así asegurarte de que no es un problema de conexión con el servidor de correo:

Route::get('/test-email', function () {
    Mail::raw('Correo de prueba', function ($message) {
        $message->to('destino@dominio.com')->subject('Test Email');
    });
    return 'Se ha enviado el correo de prueba';
});

Espero que esto te ayude a encontrar la solución. ¡Mucho éxito con tu proyecto!