¿Enviar correos electrónicos de restablecimiento de contraseña en masa?

He migrado usuarios desde la base de datos del antiguo foro. ¿Existe alguna forma de enviar correos electrónicos de restablecimiento de contraseña en masa? He intentado usar la API, pero obtuve el mensaje Has realizado esta acción demasiadas veces, inténtalo de nuevo más tarde después de solicitar el envío de aproximadamente 3 correos de restablecimiento… (otras acciones de la API funcionan correctamente).

Estaría encantado de usar la consola de Ruby o la API si puedes aconsejarme cómo sortear ese límite de velocidad. Probablemente sea un límite por dirección IP, según he investigado.

[actualizado]

Parece que el RateLimiter para ‘forgot_password’ está, lamentablemente, codificado de forma rígida, así que opté por la vía del script de Ruby…

Para el restablecimiento masivo (enviar tokens de restablecimiento de contraseña a todos los usuarios), puedes hacer lo siguiente:

cd /var/discourse
./launcher enter app

Luego, crea un nuevo archivo mass-password-reset.rb usando tu editor favorito con el siguiente script:

User.all.each do |u|
  email_token = u.email_tokens.create(email: u.email)
  Jobs.enqueue(:critical_user_email, type: :forgot_password, user_id: u.id, email_token: email_token.token)
  sleep(5)
end

Y luego ejecútalo con rails r mass-password-reset.rb.

5 Me gusta

¡Genial, gracias! Recientemente migré los datos de mi antiguo foro y, al intentar restablecer manualmente las contraseñas de mis usuarios (no son muchos), me encontré con un mensaje de error. Los registros de Discourse no mostraron nada; intenté reconstruir la aplicación pero no ayudó. Luego probé tu script y ahora, a través del servicio de envío de correos electrónicos externalizado (y Sidekiq), veo que estos correos se están enviando. ¡Así que, gracias de nuevo! :slight_smile:

2 Me gusta

Lo intenté, pero el modelo de datos ha cambiado (creo que debido al correo electrónico secundario). Las direcciones de correo electrónico ahora están en el objeto Email del Usuario, creo.

2 Me gusta

Hola, ¿conseguiste algo para resolver esto? Estaba a punto de probar ese script, pero he visto tu mensaje y ahora me pregunto si lograste solucionar esto.

Creo que la mejor opción sigue siendo que restablezcan su contraseña a través del enlace de restablecimiento de contraseña. ¿Hay alguna razón por la que su usuario no pueda hacer esto?

No, sería solo una cuestión de experiencia de usuario. Hemos estado migrando nuestro antiguo foro “vanilla” y creo que la mejor experiencia para los usuarios antiguos sería recibir un correo electrónico diciendo: “Hola, hemos migrado de nuestro foro a una nueva plataforma. Puedes iniciar sesión a través de este enlace: {link}”.

Solo estoy rectificando aquí: ese script sí funciona. Solo tuve que:

cd /var/discourse
sudo ./launcher enter app

Luego crear el archivo:

// crear archivo
touch password.rb

Luego agregar el siguiente código:

email_token = nil

User.all.each do |u|
  email_token = u.email_tokens.create(email: u.email)
  Jobs.enqueue(:critical_user_email, type: :forgot_password, user_id: u.id, email_token: email_token.token)
  sleep(5)
end

Y finalmente, ejecutarlo:

rails r password.rb

Me funcionó :slight_smile:.

2 Me gusta

Ah, lo siento, quería volver a esto ayer cuando me di cuenta de que querías hacer una masiva y no una individual. Me alegro de que lo hayas resuelto. :slight_smile: :+1:

Separaré este problema para que sea más fácil de encontrar en futuras búsquedas. :mag_right:

3 Me gusta

Oye, no sé si este sigue siendo el mejor lugar para preguntar esto, pero ¿sabrías cuánto dura el correo electrónico de restablecimiento de contraseña? Sé que expira en 3 o 4 días, pero necesito saberlo porque invitaré a mis usuarios de un foro antiguo y necesito enviar un mensaje notificándoles que el correo electrónico puede haber expirado después de n días, así que necesito el tiempo específico. Saludos.

¿Cómo ejecutamos este comando por usuario o solo para una lista de usuarios en un archivo de texto? Tengo alrededor de 8000 usuarios para migrar. Estoy creando los usuarios sin problemas con la API, pero luego los correos electrónicos no se envían debido a la limitación de velocidad codificada. También configuré mi dirección IP en ACEPTAR en la IP filtrada, pero todavía no funciona. ¿Es esto algo que solo se puede hacer en la consola de Rails?

¡Gracias!

También me interesaría adaptar el script anterior para enviarlo a 1 solo usuario, para poder probarlo antes de enviarlo a todo el mundo.

Creo que usar un script de importación sería una mejor idea para crear tantos usuarios, pero eso es un tema aparte :upside_down_face:
De todos modos, alcanzarías el límite de tasa si envías el correo electrónico en el script también.

Si quieres ralentizar el proceso de envío de correos electrónicos, puedes añadir un sleep(x) (x en segundos) en el bucle ruby, y debe adaptarse a los límites de tasa existentes.

Si tienes la intención de que tu script se ejecute durante un tiempo, utiliza un gestor de sesiones como screen o tmux.

user = User.find_by(username: 'alehandrof')

if user
  email_token = user.email_tokens.create(email: user.email)
  Jobs.enqueue(:critical_user_email, type: :forgot_password, user_id: user.id, email_token: email_token.token)
end

No es necesario crear un archivo Ruby para esto; puedes ejecutarlo en la consola de Rails (./launcher enter app y luego rails c).

2 Me gusta

¡Gracias por la ayuda @Canapin!