Discourse 커뮤니티 여러분께,
자체 호스팅된 Discourse 인스턴스(버전 3.5.0.beta7-dev)에서 사용자에게 대량으로 비밀번호 재설정 이메일을 자동으로 보내는 방법을 시도하고 있습니다. 사용자는 custom_username만 포함된 CSV 파일에 나열되어 있으며, 이메일 주소는 각 사용자의 Discourse 프로필에 저장되어 있습니다. 관리 패널(/u//preferences/security)에서의 수동 비밀번호 재설정은 완벽하게 작동하지만, /u/{username}/password-reset.json 엔드포인트를 사용하는 Python 스크립트는 이메일 전송에 실패합니다. 이 문제를 해결하기 위한 조언을 부탁드립니다.
수행한 작업
- 사용자 생성:
- Python 스크립트를 사용하여 POST /users.json 엔드포인트를 통해 사용자를 성공적으로 생성했습니다. 페이로드는 다음과 같습니다:
json
DaraltMetni gizle
Kopyala
{ "email": "<email>", "username": "<custom_username>", "password": "", "active": true, "approved": true, "send_welcome_message": false }
- 사용자는 관리 패널(/admin/users)에 표시되며, 이메일 주소가 프로필에 올바르게 저장됩니다.
- 수동 비밀번호 재설정:
- 관리 패널(/u//preferences/security)에서 “비밀번호 재설정” 버튼을 클릭하면 사용자의 등록 이메일 주소로 비밀번호 재설정 이메일이 전송됩니다. 이는 SMTP와 Sidekiq가 올바르게 구성되었음을 확인시켜 줍니다.
- 프로그램 기반 비밀번호 재설정:
- Python 스크립트를 사용하여 POST /u/{username}/password-reset.json을 통해 비밀번호 재설정 이메일을 보내고 있습니다. 스크립트는 다음과 같은 작업을 수행합니다:
- approved_users.csv에서
custom_username을 읽습니다 (예: kebirx-ustat45947). - GET /u/{username}.json을 통해 사용자가 존재하는지 확인합니다.
- /u/{username}/password-reset.json으로 POST 요청을 보냅니다.
- approved_users.csv에서
- 단순화된 코드:
python
DaraltMetni gizleÇalıştır
Kopyala
response = requests.post( f"{FORUM_URL}/u/{username}/password-reset.json", headers={"Api-Key": API_KEY, "Api-Username": API_USERNAME}, timeout=10 )
- 응답은 200 OK이지만, 이메일이 전송되지 않습니다. 스크립트 로그(discourse_send_welcome_emails.log)나 Sidekiq 로그에서 오류가 표시되지 않습니다.
- 이전 시도:
- POST /admin/users/{user_id}/send_welcome-email.json을 사용하려고 했지만, 404 오류가 반환되었습니다. API 문서에서 이 엔드포인트를 찾을 수 없어 /u/{username}/password-reset.json으로 전환했습니다.
환경
- Discourse 버전: 3.5.0.beta7-dev
- 설정: 자체 호스팅, https://forum.kebirxai.tr 에서 접근 가능
- API 키: 전체 권한을 가진 관리자 범위
- CSV 형식:
csv
DaraltMetni gizle
Kopyala
custom_username kebirx-ustat45947 keb21
- 로그:
- 스크립트 로그에는 각 POST /u/{username}/password-reset.json 호출에 대해 200 OK가 표시되지만, 이메일은 수신되지 않습니다.
- Sidekiq 로그(/var/www/discourse/log/sidekiq.log)와 프로덕션 로그(/var/www/discourse/log/production.log)에는 이메일 관련 오류가 표시되지 않습니다.
- /admin/email에서의 수동 테스트 이메일은 정상적으로 작동합니다.
질문
- /u/{username}/password-reset.json은 비밀번호 재설정 이메일을 프로그램 기반으로 트리거하기 위한 올바른 엔드포인트인가요? 그렇지 않다면, 대량 비밀번호 재설정 이메일을 위한 권장 엔드포인트는 무엇인가요?
- 왜 엔드포인트가 200 OK를 반환하지만 이메일이 전송되지 않을까요? 이는 API 권한, Sidekiq 큐 문제, 또는 API 트리거 이메일에 특화된 SMTP 구성과 관련이 있을까요?
- 레이트 리미팅: 레이트 리미트를 피하기 위해 사용자를 25명씩 배치로 처리하고 있습니다. /u/{username}/password-reset.json에 대한 특정 레이트 리미트가 있나요?
- 대안 접근법: 개별 API 호출 없이 여러 사용자에게 비밀번호 재설정 이메일을 트리거하는 더 효율적인 방법이 있나요? 예를 들어, 대량 엔드포인트나 Sidekiq 작업 등이 있을까요?
- 디버깅: 수동 재설정은 작동함에도 API 트리거 이메일이 전송되지 않는 이유를 파악하기 위해 어떤 로그나 설정을 확인해야 하나요?
추가 참고 사항
- 관리 패널에서의 수동 재설정이 작동하므로, SMTP(app.yml에서 구성됨)와 Sidekiq는 기능적으로 정상인 것으로 보입니다.
- 사용자가 존재하고 이메일 주소가 관리 패널에서 올바른지 확인했습니다.
- 스크립트나 서버 로그에 오류가 표시되지 않아 디버깅이 어렵습니다.
문제 해결, 대안 엔드포인트, 또는 대량 비밀번호 재설정 이메일에 대한 모범 사례에 대한 제안이 있다면 감사하겠습니다. 문서화되지 않은 API, 플러그인, 또는 구성 조정이 있다면 알려주시기 바랍니다. 감사합니다!