النقاط وأسماء + البديلة في Gmail: كيف تلتقط التسجيلات المكررة
j.doe+7@gmail.com وjdoe@gmail.com صندوق واحد. كيف تعمل عنونة Gmail، ودالة توحيد بلغتي JavaScript وPython، والحالات الحدّية التي تسبب المشكلات.
صندوق واحد وعناوين لا حصر لها
لدى Gmail قاعدتان في العنونة تجعلان إنشاء حسابات كثيرة من صندوق بريد واحد أمرًا سهلًا للغاية:
- النقاط تُتجاهل. في عناوين
@gmail.com، فإنjane.doeوjanedoeوj.a.n.e.d.o.eصندوق واحد. لاسم من عشرة أحرف مئات الصيغ بالنقاط. - كل ما بعد علامة الزائد يُتجاهل.
janedoe+test1@gmail.comوjanedoe+test2@gmail.comوغيرها تصل كلها إلىjanedoe@gmail.com. عدد الصيغ غير محدود.
إضافة إلى ذلك، @googlemail.com هي الخدمة نفسها التي يقدمها @gmail.com. كل صيغة تجتاز تأكيد البريد، لأن رسالة التأكيد تصل فعلًا. بالنسبة إلى نموذج التسجيل لديك، هؤلاء جميعًا مستخدمون مختلفون وجدد.
العنونة بعلامة الزائد ليست حكرًا على Gmail: تدعمها Fastmail وProton Mail أيضًا، وكذلك كثير من خوادم بريد الشركات. أما تجاهل النقاط فخاصية في Gmail الشخصي تحديدًا.
وحّد العنوان ثم قارن
الحل هو حفظ صيغة موحَّدة لكل عنوان بجانب الأصلي، ومقارنة التسجيلات الجديدة بها. احتفظ بالأصلي لإرسال البريد — فهو ما كتبه المستخدم، وبعض الناس يستخدمون وسوم الزائد لفرز رسائلهم.
// JavaScript function normalizeEmail(input) { const raw = input.trim().toLowerCase(); const at = raw.lastIndexOf("@"); if (at < 1) return null; let local = raw.slice(0, at); let domain = raw.slice(at + 1).replace(/\.$/, ""); if (domain === "googlemail.com") domain = "gmail.com"; const plus = local.indexOf("+"); if (plus > 0) local = local.slice(0, plus); if (domain === "gmail.com") local = local.replaceAll(".", ""); return `${local}@${domain}`; } normalizeEmail("J.Doe+trial7@GoogleMail.com"); // "jdoe@gmail.com"
# Python def normalize_email(value: str) -> str | None: raw = value.strip().lower() local, sep, domain = raw.rpartition("@") if not sep or not local: return None domain = domain.rstrip(".") if domain == "googlemail.com": domain = "gmail.com" base = local.split("+", 1)[0] or local if domain == "gmail.com": base = base.replace(".", "") return f"{base}@{domain}"
ثم أضف عمودًا وفهرسًا، واستعلم عنه عند التسجيل:
ALTER TABLE users ADD COLUMN email_normalized text; CREATE INDEX users_email_normalized ON users (email_normalized); -- at signup SELECT count(*) FROM users WHERE email_normalized = $1;
حالات حدّية تسبب المشكلات
- لا تحذف النقاط خارج Gmail الشخصي. لدى معظم المزودين، وفي نطاقات الشركات على Google Workspace، فإن
jane.doe@وjanedoe@شخصان مختلفان. حذف النقاط هناك يدمج غرباء معًا. - حذف علامة الزائد لدى المزودين الآخرين مجرد تخمين. في كل مكان تقريبًا يكون وسم الزائد اسمًا بديلًا، لكن يحق لخادم البريد معاملة
+كحرف عادي. اعتبر التطابق خارج Gmail إشارة لا دليلًا. - لا ترفض وسم الزائد بحد ذاته. كثير من الحريصين يستخدمون
name+service@gmail.comفي كل موقع. وسم الزائد على صندوق جديد أمر طبيعي؛ أما على صندوق له حساب بالفعل فهذه هي الإشارة. - حوّل إلى أحرف صغيرة قبل المقارنة، واحذف المسافات والنقاط في النهاية. عمليًا، لا يفرّق المزودون بين الأحرف الكبيرة والصغيرة في الجزء المحلي.
- لدى مزودين آخرين أنظمة أسماء بديلة خاصة بهم (عناوين Yahoo المؤقتة، وأسماء Outlook البديلة في الحساب نفسه). لن تلتقطها بالتوحيد — هنا يأتي دور إشارات الجهاز والشبكة.
ماذا تفعل عند التطابق
التطابق بعد التوحيد يعني أن الحساب الجديد يستقبل البريد في صندوق له حساب لديك بالفعل. في الغالب ليس الرد الصحيح رسالة خطأ بل تنبيه لطيف: «لديك حساب بهذا البريد بالفعل — هل تريد تسجيل الدخول؟». وبالنسبة إلى التجارب والرصيد المجاني، فهو أيضًا سبب قوي لعدم منح التجربة أو إحالة التسجيل إلى المراجعة. راجع كيف تمنع إساءة استخدام التجربة المجانية لمسار قرار كامل.
كيف يتعامل Attrelix مع ذلك
كل فحص يوحّد العنوان (نقاط Gmail، ووسوم الزائد، وgooglemail.com، ونطاقات Proton)، ويبحث عن حسابات قائمة بالصندوق نفسه، ويضيف السبب alias_of_existing عند العثور على أحدها. لا يُغيَّر العنوان الأصلي في بياناتك أبدًا، وتُعاد الحسابات المرتبطة في الرد كي ترى المجموعة كاملة.
الخلاصة
- يتجاهل Gmail النقاط ووسوم الزائد؛ ويتجاهل كثير من المزودين وسوم الزائد.
- احفظ عنوانًا موحَّدًا بجانب الأصلي وأنشئ له فهرسًا.
- احذف النقاط في Gmail الشخصي فقط؛ واعتبر التطابقات الأخرى إشارات.
- عند التطابق اقترح تسجيل الدخول ولا تمنح تجربة ثانية.