Hola Comunidad de Discourse,
Estoy intentando automatizar el envío de correos electrónicos de restablecimiento de contraseña en masa para los usuarios de nuestra instancia de Discourse autoalojada (versión 3.5.0.beta7-dev). Los usuarios están listados en un archivo CSV que contiene solo custom_username, y sus direcciones de correo electrónico están almacenadas en sus perfiles de Discourse. Si bien el restablecimiento manual de contraseña desde el panel de administración (/u//preferences/security) funciona perfectamente, mi script de Python que utiliza el endpoint /u/{username}/password-reset.json no logra enviar correos electrónicos. Agradecería cualquier orientación para solucionar este problema.
Lo que he hecho
-
Creación de usuarios:
- He creado usuarios exitosamente a través del endpoint POST /users.json utilizando un script de Python. La carga útil es:
{ "email": "<email>", "username": "<custom_username>", "password": "", "active": true, "approved": true, "send_welcome_message": false }- Los usuarios aparecen en el panel de administración (/admin/users) y sus direcciones de correo electrónico se almacenan correctamente en sus perfiles.
-
Restablecimiento manual de contraseña:
- Desde el panel de administración (/u//preferences/security), al hacer clic en el botón “Restablecer contraseña”, se envía un correo electrónico de restablecimiento de contraseña a la dirección de correo electrónico registrada del usuario, lo que confirma que SMTP y Sidekiq están configurados correctamente.
-
Restablecimiento programático de contraseña:
- Estoy utilizando un script de Python para enviar correos electrónicos de restablecimiento de contraseña a través de POST /u/{username}/password-reset.json. El script:
- Lee
custom_usernamede approved_users.csv (por ejemplo, kebirx-ustat45947). - Verifica que el usuario exista a través de GET /u/{username}.json.
- Envía una solicitud POST a /u/{username}/password-reset.json.
- Lee
- Código simplificado:
response = requests.post( f"{FORUM_URL}/u/{username}/password-reset.json", headers={"Api-Key": API_KEY, "Api-Username": API_USERNAME}, timeout=10 )- La respuesta es 200 OK, pero no se envían correos electrónicos. No aparecen errores en los registros del script (discourse_send_welcome_emails.log) ni en los registros de Sidekiq.
- Estoy utilizando un script de Python para enviar correos electrónicos de restablecimiento de contraseña a través de POST /u/{username}/password-reset.json. El script:
-
Intento anterior:
- Intenté usar POST /admin/users/{user_id}/send_welcome-email.json, pero devolvió un error 404. No pude encontrar este endpoint en la documentación de la API, así que cambié a /u/{username}/password-reset.json.
Entorno
-
Versión de Discourse: 3.5.0.beta7-dev
-
Configuración: Autoalojado, accesible en https://forum.kebirxai.tr
-
Clave API: Con ámbito de administrador y permisos completos
-
Formato CSV:
custom_username kebirx-ustat45947 keb21 -
Registros:
- Los registros del script muestran 200 OK para cada llamada POST a /u/{username}/password-reset.json, pero no se reciben correos electrónicos.
- Los registros de Sidekiq (/var/www/discourse/log/sidekiq.log) y los registros de producción (/var/www/discourse/log/production.log) no muestran errores relacionados con el correo electrónico.
- Los correos electrónicos de prueba manuales desde /admin/email funcionan bien.
Preguntas
- ¿Es /u/{username}/password-reset.json el endpoint correcto para activar programáticamente los correos electrónicos de restablecimiento de contraseña? Si no es así, ¿cuál es el endpoint recomendado para correos electrónicos de restablecimiento de contraseña en masa?
- ¿Por qué el endpoint podría devolver 200 OK pero no enviar correos electrónicos? ¿Podría estar relacionado con permisos de API, problemas en la cola de Sidekiq o una configuración SMTP específica para correos electrónicos activados por API?
- Limitación de velocidad: Estoy procesando usuarios en lotes de 25 para evitar límites de velocidad. ¿Existen límites de velocidad específicos para /u/{username}/password-reset.json?
- Enfoques alternativos: ¿Existe una forma más eficiente de activar correos electrónicos de restablecimiento de contraseña para varios usuarios sin llamadas API individuales? Por ejemplo, ¿un endpoint masivo o un trabajo de Sidekiq?
- Depuración: ¿Qué registros o configuraciones debo verificar para identificar por qué no se envían los correos electrónicos activados por API, a pesar de que los restablecimientos manuales funcionan?
Notas adicionales
- El restablecimiento manual desde el panel de administración funciona, por lo que SMTP (configurado en app.yml) y Sidekiq parecen funcionales.
- He verificado que los usuarios existen y que sus direcciones de correo electrónico son correctas en el panel de administración.
- No aparecen errores en los registros del script ni del servidor, lo que dificulta la depuración.
Cualquier sugerencia sobre depuración, endpoints alternativos o mejores prácticas para correos electrónicos de restablecimiento de contraseña en masa sería muy apreciada. Si existen APIs no documentadas, plugins o ajustes de configuración, por favor háganmelo saber. ¡Gracias!