es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Limitar la tasa de correos electrónicos enviados con Laravel.

Estoy creando un foro con Laravel y tan pronto como se reciba un nuevo mensaje privado o un nuevo mensaje en un hilo en el que el usuario ha participado, se enviará un correo electrónico. Sin embargo, tengo un problema: si un usuario recibe 60 mensajes privados en una hora, entonces recibirá 60 mensajes privados para notificarle que tiene un nuevo mensaje.

¿Es posible limitar el número de correos electrónicos enviados por hora, por ejemplo? ¿Hay algún atributo que se pueda cambiar en algún lugar?

Aquí tienes un ejemplo de la función para encontrar el destinatario y enviar el mensaje privado en el controlador de mensajes (MessagesController):

public function newPrivateMessage(Thread $thread, $urlToAccess){
    /* Obtenemos el ID de la persona conectada */
    $userId = Auth::id();
    /* Obtenemos el otro usuario de la discusión */
    $user = $thread->participants->where('user_id', '<>', $userId)->first();
    $userName = User::find($user->user_id);
    /* Para el destinatario, enviamos un correo electrónico */
    Mail::to($userName->email)->send(new NewPrivateMessageMail($user,$urlToAccess));
}

Y he creado una clase “NewPrivateMessage” dentro de la carpeta “http” con este comando Artisan: php artisan make:mail NewPrivateMessage.

public function __construct($user,$urlToAccess)
{
    $this->data = $user;
    $this->url = $urlToAccess;
}

public function build()
{
    return $this
       ->subject('Nuevo mensaje privado')
       ->markdown('emails.markdown-newPrivateMessage');
}

Cordialmente

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible limitar la cantidad de correos electrónicos enviados por hora. Una forma de lograr esto es utilizando las colas integradas y la funcionalidad de límite de velocidad de Laravel.

    Primero, debes configurar una conexión de cola en tu aplicación de Laravel. Esto se puede hacer mediante la configuración de una conexión de base de datos o Redis en el archivo config/queue.php. En segundo lugar, debes agregar un listener a la cola que envía los correos electrónicos. Puedes lograr esto creando una nueva clase de trabajo, llamémosla EnviarNuevoCorreoElectronicoMensajePrivado, e implementando el método handle() para enviar el correo electrónico. Dentro del método newPrivateMessage() en el MessagesController, en lugar de llamar a Mail::to()->send(), debes despachar el trabajo EnviarNuevoCorreoElectronicoMensajePrivado a la cola utilizando el método dispatch().

    Una vez que hayas configurado la cola y el trabajo, puedes usar la funcionalidad de límite de velocidad de Laravel para limitar la cantidad de correos electrónicos enviados por hora. Laravel proporciona un método conveniente llamado throttle() que te permite limitar la frecuencia de una tarea específica. En la clase EnviarNuevoCorreoElectronicoMensajePrivado, puedes utilizar el método throttle() para limitar la cantidad de correos electrónicos enviados por hora. Por ejemplo:

    public function handle()
    {
        $userId = $this->data->user_id;
        $user = User::find($userId);
    
        // Envía el correo electrónico aquí
    
        $this->release(3600)->throttle(60);
    }
    

    En el ejemplo anterior, utilizamos el método release() para devolver el trabajo a la cola después de 3600 segundos (1 hora). También utilizamos el método throttle() para limitar que el trabajo se ejecute solo 60 veces dentro de esa hora. Esto significa que una vez que un usuario alcanza su límite de 60 correos electrónicos, cualquier trabajo adicional despachado durante esa hora se retrasará hasta la siguiente hora.

    Al utilizar colas y límite de velocidad, puedes asegurarte de que tu aplicación no abrume a tus usuarios con demasiados correos electrónicos y ayudar a prevenir abusos.

Comments are closed.