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
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émoslaEnviarNuevoCorreoElectronicoMensajePrivado
, e implementando el métodohandle()
para enviar el correo electrónico. Dentro del métodonewPrivateMessage()
en elMessagesController
, en lugar de llamar aMail::to()->send()
, debes despachar el trabajoEnviarNuevoCorreoElectronicoMensajePrivado
a la cola utilizando el métododispatch()
.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 claseEnviarNuevoCorreoElectronicoMensajePrivado
, puedes utilizar el métodothrottle()
para limitar la cantidad de correos electrónicos enviados por hora. Por ejemplo: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étodothrottle()
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.