أهلاً بمجتمع Discourse،
أحاول أتمتة إرسال رسائل البريد الإلكتروني لإعادة تعيين كلمة المرور بشكل جماعي للمستخدمين على نسختي المستضافة ذاتيًا من Discourse (الإصدار 3.5.0.beta7-dev). يتم سرد المستخدمين في ملف CSV يحتوي فقط على custom_username، ويتم تخزين عناوين بريدهم الإلكتروني في ملفاتهم الشخصية على Discourse. بينما تعمل إعادة تعيين كلمة المرور يدويًا من لوحة الإدارة (/u//preferences/security) بشكل مثالي، فإن نص Python الخاص بي الذي يستخدم نقطة النهاية /u/{username}/password-reset.json يفشل في إرسال رسائل البريد الإلكتروني. سأكون ممتنًا لأي توجيه بشأن استكشاف هذه المشكلة وإصلاحها.
ما قمت به
-
إنشاء المستخدم:
- لقد قمت بإنشاء المستخدمين بنجاح عبر نقطة النهاية POST /users.json باستخدام نص Python. الحمولة هي:
{ "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. النص:
- يقرأ
custom_usernameمنapproved_users.csv(على سبيل المثال، kebirx-ustat45947). - يتحقق من وجود المستخدم عبر GET /u/{username}.json.
- يرسل طلب POST إلى /u/{username}/password-reset.json.
- الكود المبسط:
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:
custom_username kebirx-ustat45947 keb21 -
السجلات:
- تظهر سجلات النص 200 OK لكل استدعاء POST /u/{username}/password-reset.json، ولكن لم يتم استلام أي رسائل بريد إلكتروني.
- لا تظهر سجلات Sidekiq (/var/www/discourse/log/sidekiq.log) وسجلات الإنتاج (/var/www/discourse/log/production.log) أي أخطاء متعلقة بالبريد الإلكتروني.
- تعمل رسائل البريد الإلكتروني التجريبية اليدوية من /admin/email بشكل جيد.
أسئلة
- هل /u/{username}/password-reset.json هي نقطة النهاية الصحيحة لتشغيل رسائل البريد الإلكتروني لإعادة تعيين كلمة المرور برمجيًا؟ إذا لم يكن كذلك، فما هي نقطة النهاية الموصى بها لرسائل البريد الإلكتروني لإعادة تعيين كلمة المرور بشكل جماعي؟
- لماذا قد تعيد نقطة النهاية 200 OK ولكن لا ترسل رسائل البريد الإلكتروني؟ هل يمكن أن يكون هذا مرتبطًا بأذونات API، أو مشكلات في قائمة انتظار Sidekiq، أو تكوين SMTP الخاص برسائل البريد الإلكتروني التي تم تشغيلها بواسطة API؟
- تحديد المعدل: أقوم بمعالجة المستخدمين في دفعات من 25 لتجنب تحديد المعدل. هل هناك حدود معدل محددة لـ /u/{username}/password-reset.json؟
- نهج بديلة: هل هناك طريقة أكثر كفاءة لتشغيل رسائل البريد الإلكتروني لإعادة تعيين كلمة المرور لعدة مستخدمين دون استدعاءات API فردية؟ على سبيل المثال، نقطة نهاية جماعية أو مهمة Sidekiq؟
- التصحيح: ما هي السجلات أو الإعدادات التي يجب علي التحقق منها لتحديد سبب عدم إرسال رسائل البريد الإلكتروني التي تم تشغيلها بواسطة API، على الرغم من عمل عمليات إعادة التعيين اليدوية؟
ملاحظات إضافية
- تعمل إعادة التعيين اليدوية من لوحة الإدارة، لذا يبدو أن SMTP (المكون في app.yml) و Sidekiq يعملان.
- لقد تحققت من وجود المستخدمين وأن عناوين بريدهم الإلكتروني صحيحة في لوحة الإدارة.
- لا تظهر أي أخطاء في سجلات النص أو الخادم، مما يجعل التصحيح صعبًا.
أي اقتراحات بشأن استكشاف الأخطاء وإصلاحها، أو نقاط نهاية بديلة، أو أفضل الممارسات لرسائل البريد الإلكتروني لإعادة تعيين كلمة المرور بشكل جماعي ستكون موضع تقدير كبير. إذا كانت هناك واجهات برمجة تطبيقات غير موثقة، أو إضافات، أو تعديلات في التكوين، فيرجى إخباري. شكرًا لك!