إرسال رسائل إعادة تعيين كلمة المرور بكميات كبيرة؟

لقد قمت بنقل المستخدمين من قاعدة بيانات المنتدى القديمة. هل توجد طريقة لإرسال رسائل بريد إلكتروني لإعادة تعيين كلمة المرور بشكل جماعي؟ لقد حاولت استخدام واجهة برمجة التطبيقات (API) لكنني تلقيت رسالة “لقد قمت بتنفيذ هذا الإجراء عددًا كبيرًا جدًا من المرات، حاول مرة أخرى لاحقًا.” بعد طلب إرسال حوالي 3 رسائل لإعادة تعيين كلمة المرور. (تعمل إجراءات واجهة برمجة التطبيقات الأخرى بشكل جيد)

سأكون سعيدًا باستخدام وحدة تحكم Ruby أو واجهة برمجة التطبيقات إذا كنت تستطيعين إرشادي حول كيفية تجاوز حد المعدل هذا. على الأرجح أن الحد هو لكل عنوان IP كما قمت بالتحقيق.

[مُحدّث]

يبدو أن RateLimiter الخاص بـ ‘forgot_password’ مُشفّر بشكل ثابت للأسف، لذا اتبعتُ طريقة سكريبت Ruby…

لإعادة التعيين الجماعي (إرسال رموز إعادة تعيين كلمة المرور لجميع المستخدمين)، يمكنك فعل ما يلي:

cd /var/discourse
./launcher enter app

ثم قم بإنشاء ملف جديد mass-password-reset.rb باستخدام محررك المفضل مع السكربت التالي:

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

ثم قم بتشغيله باستخدام الأمر rails r mass-password-reset.rb

5 إعجابات

رائع، شكرًا لك! لقد قمت مؤخرًا بنقل البيانات من منتداي القديم، وعندما حاولت إعادة تعيين كلمات المرور للمستخدمين يدويًا (وليسوا بأعداد كبيرة)، واجهت رسالة خطأ. لم تظهر سجلات Discourse أي شيء، وحاولت إعادة بناء التطبيق دون جدوى. ثم جربت السكريبت الخاص بك، والآن أرى عبر خدمة إرسال البريد الإلكتروني الخارجية (و Sidekiq) أن هذه الرسائل تُرسل. شكرًا مرة أخرى! :slight_smile:

إعجابَين (2)

لقد جربت ذلك، لكن نموذج البيانات تغير الآن (أعتقد أنه بسبب البريد الإلكتروني الثانوي). أعتقد أن عناوين البريد الإلكتروني موجودة الآن في كائن بريد المستخدم.

إعجابَين (2)

مرحباً، هل توصلت إلى حل لهذا؟ كنت على وشك تجربة هذا النص البرمجي ولكني رأيت رسالتك وأتساءل الآن عما إذا كنت قد تمكنت من حل هذه المشكلة.

أعتقد أن الخيار الأفضل لا يزال هو جعلهم يعيدون تعيين كلمة المرور الخاصة بهم من خلال رابط إعادة تعيين كلمة المرور. هل هناك سبب لعدم تمكن المستخدم الخاص بك من القيام بذلك؟

لا، ستكون مجرد مسألة تجربة مستخدم. لقد كنا نقوم بترحيل منتدانا القديم (vanilla forum) وأعتقد أن أفضل تجربة للمستخدمين القدامى ستكون تلقي بريد إلكتروني يقول “مرحبًا، لقد انتقلنا من منتدانا إلى منصة جديدة. يمكنك تسجيل الدخول عبر هذا الرابط: {link}”.

فقط للتصحيح هنا - هذا النص البرمجي يعمل بالفعل. كان علي فقط:\n\ncd /var/discourse\nsudo ./launcher enter app\n\n\nثم إنشاء الملف:\n\n// إنشاء ملف\ntouch password.rb\n\n\nثم إضافة الكود التالي:\n\nemail_token = nil\n\nUser.all.each do |u|\n email_token = u.email_tokens.create(email: u.email)\n Jobs.enqueue(:critical_user_email, type: :forgot_password, user_id: u.id, email_token: email_token.token)\n sleep(5)\nend\n\n\nوأخيرًا، تشغيله:\n\nrails r password.rb\n\n\nلقد نجح معي :slight_smile:."

إعجابَين (2)

آه، آسف، كان من المفترض أن أعود إلى هذا أمس عندما أدركت أنك أردت القيام بعملية جماعية وليس عملية فردية. يسعدني أنك اكتشفت الأمر على أي حال. :slight_smile: :+1:
سأقوم بتقسيم هذه المشكلة لتسهيل العثور عليها في عمليات البحث المستقبلية. :mag_right:

3 إعجابات

مرحباً، لا أعرف ما إذا كان هذا لا يزال أفضل مكان لطرح هذا السؤال، ولكن هل تعرف كم من الوقت يستمر بريد إعادة تعيين كلمة المرور؟ أعرف أنه ينتهي بعد 3 أو 4 أيام ولكن أحتاج إلى معرفة ذلك لأنني سأدعو مستخدمي من منتدى قديم وأحتاج إلى إرسال رسالة لإعلامهم بأن البريد قد يكون منتهي الصلاحية بعد ن أيام لذا أحتاج إلى الوقت المحدد. شكراً

كيف يمكننا تشغيل هذا الأمر على أساس كل مستخدم على حدة أو فقط لقائمة المستخدمين في ملف نصي؟ لدي حوالي 8000 مستخدم لنقلهم. أقوم بإنشاء المستخدمين بشكل جيد باستخدام واجهة برمجة التطبيقات (API)، ولكن بعد ذلك لا يتم إرسال رسائل البريد الإلكتروني بسبب تحديد المعدل المبرمج مسبقًا. لقد قمت أيضًا بتعيين عنوان IP الخاص بي إلى ACCEPT في IP المُصفى، ولكن لا يزال الأمر لا يعمل. هل هذا شيء يمكن القيام به فقط في وحدة تحكم Rails؟

شكرا لك!

أود أيضًا أن أهتم بتكييف النص أعلاه لإرساله إلى مستخدم واحد فقط، حتى أتمكن من اختباره قبل إرساله إلى الجميع.

أعتقد أن استخدام برنامج نصي للاستيراد سيكون فكرة أفضل لإنشاء هذا العدد الكبير من المستخدمين، ولكن هذا خارج الموضوع :upside_down_face:
على أي حال، ستصل إلى الحد الأقصى للمعدل إذا أرسلت البريد الإلكتروني في البرنامج النصي أيضًا.

إذا كنت ترغب في إبطاء عملية إرسال البريد الإلكتروني، يمكنك إضافة sleep(x) (x بالثواني) في حلقة روبي (ruby)، ويجب تكييفها مع أي (أي) حدود للمعدل.

إذا كنت تنوي تشغيل البرنامج النصي الخاص بك لفترة من الوقت، فاستخدم مدير جلسات مثل screen أو 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

لا حاجة لإنشاء ملف روبي (Ruby) لهذا؛ يمكنك تشغيله في وحدة تحكم Rails (./launcher enter app ثم rails c).

إعجابَين (2)

شكراً للمساعدة @Canapin!