🧹 نظافة القوائم والتحقق

كيف تحذف الإيميلات المكررة من ملف CSV دون أن تخسر جهات اتصال حقيقية

احذف الإيميلات المكررة من ملف CSV بمفتاح مطابقة موحّد: أزل المسافات، وحوّل إلى أحرف صغيرة، وطبّق قواعد نقاط Gmail وعلامة + حيث تصحّ فقط. مع مثال محسوب.

صفوف جدول بيانات تمر عبر قمع فتندمج الصفوف المتطابقة في صف واحد
الجواب السريع

لا تقارن عمود البريد كما هو. ابنِ لكل صف مفتاح مطابقة: احذف المسافات، وحوّل العنوان إلى أحرف صغيرة، وفي نطاق gmail.com وحده احذف النقاط وكل ما بعد علامة +. الصفوف التي تشترك في المفتاح نفسه مكررة. حدّد أي صف يبقى (الأحدث غالبًا)، واحفظ ملفًا بما حذفته، ولا تلمس النقاط ولا +tag في نطاقات الشركات لأنها قد تخص أشخاصًا مختلفين.

حين تبحث عن طريقة لحذف الإيميلات المكررة من ملف CSV تجد أن معظم الشروحات تكتفي بعبارة «حدّد العمود واضغط إزالة التكرارات». هذه الطريقة لا تلتقط إلا الصفوف المتطابقة حرفًا بحرف، فيبقى Anna.Lee@Gmail.com وanna.lee@gmail.com وannalee+promo@gmail.com ثلاث جهات اتصال، ويصل الشخص نفسه ثلاث نسخ من كل حملة. والمبالغة في الاتجاه المعاكس مضرّة بالقدر نفسه: لو دمجت j.smith@company.co مع jsmith@company.co فقد تحذف زميلًا حقيقيًا. ستجد هنا كيف تختار قواعد المطابقة، وأي صف تُبقي عليه، وكيف تنفّذ ذلك في جدول بيانات أو بسكربت قصير أو داخل المتصفح.

لماذا تفوتك المطابقة الحرفية معظم المكررات؟

المكررات في ملف جهات الاتصال نادرًا ما تكون متطابقة تمامًا. فهي تأتي من نماذج تسجيل مختلفة، ومن استيراد بيانات من أكثر من أداة، ومن أشخاص يكتبون عناوينهم بطرق مختلفة قليلًا كل مرة. أشهر الاختلافات:

  • مسافات زائدة: مسافة في آخر العنوان نُسخت من نظام آخر.
  • حالة الأحرف: Omar@Example.COM مقابل omar@example.com.
  • نقاط Gmail: anna.lee@gmail.com مقابل annalee@gmail.com.
  • وسوم علامة الجمع: annalee+promo@gmail.com يكتبه مستخدم يصنّف اشتراكاته.

كل اختلاف من هذه يحتاج قرارًا مستقلًا، لأن معايير البريد ومزوّدي الصناديق الكبار لا يعاملونها بالطريقة نفسها.

ماذا تقول المعايير عن حالة الأحرف والنقاط وعلامة +؟

ينص RFC 5321، معيار بروتوكول SMTP، على أن جزء النطاق في العنوان يتبع قواعد DNS فهو غير حساس لحالة الأحرف. أما الجزء المحلي (ما قبل @) فيجب أن تعامله برامج البريد على أنه حساس لحالة الأحرف، لأن بعض الخوادم تفرّق فعلًا بين smith وSmith. ويضيف القسم نفسه أن استغلال هذا الفرق يضرّ بالتوافق وغير مستحب. عمليًا، العنوانان اللذان يختلفان في حالة الأحرف فقط يصلان في الغالب الساحق إلى الشخص نفسه، ولهذا تقارنهما أغلب قوائم التسويق بأحرف صغيرة.

أما النقاط وعلامة الجمع فهي قواعد المزوّد لا المعيار:

  • يذكر مركز مساعدة Gmail أن النقاط لا تهم في عناوين Gmail، فالعنوانان anna.lee@gmail.com وannalee@gmail.com صندوق واحد. وتذكر الصفحة نفسها أن النقاط تغيّر العنوان في الحسابات التي تديرها جهة عمل أو مدرسة (بحسب مساعدة Gmail حتى أكتوبر 2026).
  • ويسلّم Gmail كذلك الرسائل الموجّهة إلى janedoe+school@gmail.com إلى janedoe@gmail.com؛ فما بعد + وسم يختاره صاحب الحساب.
  • وتوثّق مايكروسوفت أن ميزة plus addressing مفعّلة افتراضيًا في Exchange Online، لكن يستطيع المسؤول تعطيلها. وحين تصل رسالة إلى عنوان فيه + يبحث Exchange أولًا عن صندوق بالعنوان الكامل، ثم يعيد المحاولة دون الوسم (بحسب Microsoft Learn حتى أكتوبر 2026).

هذه النقطة الأخيرة هي سبب عدم حذف الوسوم في كل النطاقات: في نطاق شركة قد يكون sales+emea@ صندوقًا مستقلًا، أو تكون الميزة معطّلة، فلا يكون العنوان الموسوم هو العنوان المجرد نفسه.

اختر قواعد المطابقة: جدول قرار

القاعدةتُطبَّق علىآمنة؟السبب
حذف المسافات في البداية والنهايةكل الصفوفدائمًاالمسافة ليست جزءًا من عنوان صالح.
تحويل النطاق إلى أحرف صغيرةكل الصفوفدائمًاالنطاقات غير حساسة لحالة الأحرف بحسب RFC 5321.
تحويل الجزء المحلي إلى أحرف صغيرةكل الصفوفشبه دائمًايسمح المعيار بالاختلاف لكنه لا يستحبه، ونادر عمليًا.
حذف النقاط من الجزء المحليgmail.com فقطنعم لهذا النطاقيوثّق Gmail تجاهل النقاط، وتُستثنى حسابات العمل والمدارس.
حذف +taggmail.com فقط افتراضيًانعم لهذا النطاقسلوك Gmail موثّق؛ وغيره قد يعتمد العنوان الكامل أو يعطّل الميزة.
دمج العناوين «المتشابهة» بالتخمينلا شيء آليًالاصحّح نطاقات الأخطاء المعروفة فقط وراجع كل تغيير.

القواعد الثلاث الأولى تصنع مفتاحًا يصلح لأي قائمة. وقواعد Gmail تستحق الإضافة حين تكون نسبة كبيرة من قائمتك على gmail.com؛ أما في قائمة شركات بعناوين نطاقات خاصة فتأثيرها ضئيل.

مثال محسوب: ملف واحد وخمس مجموعات قواعد

هذا ملف من 12 صفًا فيه أعمدة email وname وsigned_up. الصف الثالث محاط بمسافات، وصف لينا الثاني (الصف 11) فيه مسافة في آخره، والصف 12 بلا بريد.

email,name,signed_up
anna.lee@gmail.com,Anna Lee,2026-03-02
Anna.Lee@Gmail.com,Anna,2026-05-11
 annalee@gmail.com ,Anna L.,2026-06-20
annalee+promo@gmail.com,Anna Lee,2026-07-01
omar@example.com,Omar,2026-01-15
Omar@Example.COM,Omar H.,2026-04-09
omar+news@example.com,Omar,2026-08-30
j.smith@company.co,John Smith,2026-02-10
jsmith@company.co,Jane Smith,2026-02-12
lina@outlook.com,Lina,2026-05-05
lina@outlook.com ,Lina,2026-09-14
,Unknown,2026-06-01

عددنا العناوين الفريدة بين الصفوف الأحد عشر غير الفارغة تحت كل مجموعة قواعد بسكربت بايثون:

مفتاح المطابقةجهات اتصال فريدةمكررات محذوفة
القيمة كما هي (مطابقة حرفية)110
بعد حذف المسافات101
حذف المسافات + نطاق بأحرف صغيرة (القراءة الصارمة للمعيار)101
حذف المسافات + العنوان كله بأحرف صغيرة83
ما سبق + حذف نقاط Gmail و+tag65

المجموعة الأخيرة تدمج صفوف آنا الأربعة في صف واحد، ونسختي عمر المختلفتين في حالة الأحرف في واحدة، وتترك بحق omar+news@example.com وj.smith@company.co وjsmith@company.co جهات مستقلة. وحالة جون وجين سميث توضّح السبب: في نطاق شركة قد تكون النقطة هي الفرق الوحيد بين شخصين.

حذف المسافاتمن الطرفينأحرف صغيرةالعنوان كلهقواعد Gmailgmail.com فقطرتّب ثم أبقِ واحدًاسجّل المحذوف
خطوات بناء مفتاح المطابقة قبل حذف المكررات

أي صف مكرر تُبقي عليه؟

حذف المكرر يحذف الصف كله لا خلية البريد وحدها. وتنص وثائق Excel على ذلك صراحةً في ميزة إزالة التكرارات: إذا وُجد تطابق في الأعمدة المحددة حُذف الصف بالكامل مع بقية أعمدته. إذن ترتيب الصفوف هو ما يحدد أي اسم وتاريخ وسجل موافقة يبقى.

  1. الأحدث يبقى: رتّب بتاريخ التسجيل أو آخر نشاط من الأحدث إلى الأقدم قبل الحذف. مناسب للأسماء والتفضيلات التي تتغير.
  2. الأقدم يبقى: رتّب من الأقدم. مناسب حين يحمل أول صف سجل الموافقة الأصلي الذي قد تحتاجه دليلًا.
  3. الأكمل يبقى: رتّب بحيث تتقدم الصفوف ذات الحقول المعبّأة أكثر. مناسب لاستيراد بيانات CRM.
  4. الدمج: أبقِ صفًا واحدًا وانقل إليه الحقول الفارغة فيه من الصفوف الأخرى. يحتاج سكربتًا أو ميزة دمج في الـCRM.

أيًّا كان اختيارك، احفظ الصفوف المحذوفة في ملف منفصل مع سبب الحذف. فهو سجلّك إن سأل أحدهم لماذا توقفت رسائلك عنه، ويتيح لك التراجع عن قاعدة خاطئة.

الطريقة الأولى: Excel أو Google Sheets مع عمود مساعد

  1. احتفظ بنسخة من الملف أولًا، فإزالة التكرار تحذف صفوفًا.
  2. أضف عمودًا مساعدًا بجوار البريد واكتب فيه =LOWER(TRIM(A2)) ثم انسخه إلى الأسفل.
  3. رتّب الورقة بحيث يأتي الصف الذي تريد إبقاءه أولًا (مثلًا بعمود signed_up من الأحدث إلى الأقدم).
  4. حدّد البيانات واختر في Excel Data ← Remove Duplicates، أو في Sheets Data ← Data cleanup ← Remove duplicates، وفعّل العمود المساعد وحده.
  5. احذف العمود المساعد وصدّر الملف بصيغة CSV بترميز UTF-8 حتى لا تفسد الأسماء العربية.

يُبقي التطبيقان صفًا واحدًا لكل مفتاح ويحذفان البقية. وتذكر مايكروسوفت أن Excel يحتفظ بأول ظهور، ويقارن القيمة المعروضة في الخلية لا القيمة المخزّنة، وتنصح بتصفية القيم الفريدة أو تمييزها أولًا للتحقق من النتيجة. وتذكر صفحة مساعدة Google أن Sheets يعدّ القيم التي تختلف في حالة الأحرف فقط مكررة، وأن خيار Trim whitespace لا يحذف المسافات غير القابلة للكسر، وهذا سبب إضافي لبناء المفتاح بنفسك (بحسب دعم مايكروسوفت ومساعدة محررات مستندات Google حتى أكتوبر 2026). معادلات قواعد Gmail في الجداول تطول كثيرًا، فإن احتجتها فاستعمل السكربت أو الأداة أدناه.

الطريقة الثانية: سكربت بايثون قصير يمكنك مراجعته

يعتمد على المكتبة القياسية وحدها. يبقي الصف الأحدث لكل مفتاح، ويكتب العنوان بعد حذف مسافاته، ويحفظ كل صف محذوف مع سببه.

import csv

def match_key(email, gmail_rules=True):
    e = email.strip().lower()
    local, _, domain = e.rpartition('@')
    if gmail_rules and domain == 'gmail.com':
        local = local.split('+')[0].replace('.', '')
    return local + '@' + domain

with open('contacts.csv', newline='', encoding='utf-8') as f:
    reader = csv.DictReader(f)
    fields = reader.fieldnames
    rows = list(reader)

rows.sort(key=lambda r: r['signed_up'], reverse=True)  # newest first wins

kept, removed = {}, []
for r in rows:
    if not r['email'].strip():
        removed.append({**r, 'reason': 'blank email'})
        continue
    k = match_key(r['email'])
    if k in kept:
        removed.append({**r, 'reason': 'duplicate of ' + kept[k]['email']})
    else:
        r['email'] = r['email'].strip()
        kept[k] = r

with open('contacts_clean.csv', 'w', newline='', encoding='utf-8') as f:
    w = csv.DictWriter(f, fieldnames=fields)
    w.writeheader()
    w.writerows(kept.values())

with open('contacts_removed.csv', 'w', newline='', encoding='utf-8') as f:
    w = csv.DictWriter(f, fieldnames=fields + ['reason'])
    w.writeheader()
    w.writerows(removed)

على ملف المثال يبقي 6 صفوف وينقل 6 إلى contacts_removed.csv: خمسة مكررات والصف الفارغ. لاحظ أن العنوان الباقي لآنا هو annalee+promo@gmail.com لأنه أحدث تسجيل لها، ولا مشكلة في ذلك: فهو يصل إلى الصندوق نفسه، وهو آخر عنوان أعطته لك. التواريخ بصيغة YYYY-MM-DD تترتب صحيحًا كنص، أما الصيغ الأخرى فتحتاج تحويلًا أولًا.

الطريقة الثالثة: داخل المتصفح دون رفع القائمة

إن لم ترغب في كتابة معادلات أو كود، فالأداة أدناه تقبل قائمة ملصوقة أو ملف CSV، وتحافظ على بقية الأعمدة، وتقارن العناوين بأحرف صغيرة، وفيها خيار لمعاملة نقاط Gmail و+tag على أنها تكرار في gmail.com وgooglemail.com. تبقي الأداة أول ظهور، فرتّب الملف أولًا إن أردت أن يبقى الأحدث. وتعرض عدد الصفوف المحذوفة وأسبابها، وتعمل كلها داخل متصفحك.

منظّف قوائم البريدإزالة المكرر والخاطئ وتصحيح النطاقات وتقسيم القائمة حسب المزوّدافتح الأداة →

أخطاء شائعة

  • إزالة التكرار على الصف كله. صفّان للشخص نفسه بتاريخين مختلفين ليسا صفين متطابقين، فلن يُحذف شيء. طابق بمفتاح البريد وحده.
  • تطبيق قواعد Gmail على كل النطاقات. هذا يدمج أشخاصًا مختلفين في نطاقات الشركات وحسابات Google Workspace حيث للنقاط معنى.
  • نسيان الترتيب. «إبقاء الأول» في ملف غير مرتب يبقي أي صف صادف أنه استُورد أولًا، وغالبًا ما يكون أقدم اسم وتفضيلات.
  • عدم حفظ الصفوف المحذوفة. من دونها لا تستطيع الرد على سؤال عن الموافقة ولا التراجع عن خطأ.
  • التوقف عند المكررات. القائمة الخالية من التكرار قد تبقى فيها عناوين غير صالحة ترتد. افحص الصيغة واحذف حالات الارتداد الدائم المعروفة قبل الإرسال.

إزالة التكرار خطوة واحدة من العناية بالقائمة. ولإكمال الروتين اقرأ دليل نظافة قوائم البريد، وقواعد صيغة عنوان البريد الصحيح، وكيف يعمل التحقق من البريد (الصيغة وMX وSMTP). وإن استمر الارتداد بعد التنظيف فيشرح دليل رمز الارتداد 550 5.1.1 ما يجب حذفه.

أسئلة شائعة

هل البريد الإلكتروني حساس لحالة الأحرف؟

النطاق ليس حساسًا. ينص RFC 5321 على أن برامج البريد يجب أن تعامل ما قبل @ على أنه حساس لحالة الأحرف، لكنه يذكر أن الاعتماد على ذلك غير مستحب. عمليًا، العناوين المختلفة في حالة الأحرف فقط تصل إلى الشخص نفسه، فتقارنها أغلب القوائم بأحرف صغيرة.

هل john.smith@gmail.com هو نفسه johnsmith@gmail.com؟

نعم في حسابات Gmail الشخصية: تذكر Google أن النقاط لا تهم في عناوين Gmail. أما الحسابات التي تديرها شركة أو مدرسة على نطاقها الخاص فالنقاط فيها تغيّر العنوان.

هل أحذف عناوين علامة + من قائمتي؟

لا تحذفها، فالشخص اختار هذا العنوان. يمكنك معاملة name+tag@gmail.com على أنه تكرار لـname@gmail.com. أما في النطاقات الأخرى فأبقها مستقلة ما لم تكن متأكدًا من أن المزوّد يتجاهل الوسم.

كيف أحذف التكرار من ملف CSV دون Excel؟

استعمل Google Sheets (Data ثم Data cleanup ثم Remove duplicates)، أو سكربت بايثون قصيرًا يبني مفتاحًا موحّدًا لكل صف، أو منظّف قوائم يعمل في المتصفح ويقارن محليًا.

أي صف مكرر يُبقيه Excel؟

تُبقي ميزة إزالة التكرارات أول صف مطابق بحسب الترتيب الحالي وتحذف الصفوف اللاحقة كاملة. رتّب الورقة أولًا ليكون الصف الذي تريده في الأعلى.

المراجع ومزيد من القراءة

  1. RFC 5321 — Simple Mail Transfer Protocol، القسم 2.4
  2. مساعدة Gmail — النقاط لا تهم في عناوين Gmail
  3. مساعدة Gmail — إرسال الرسائل من عنوان أو اسم مستعار آخر
  4. Microsoft Learn — Plus Addressing in Exchange Online
  5. دعم مايكروسوفت — تصفية القيم الفريدة أو إزالة القيم المكررة
  6. مساعدة محررات مستندات Google — تقسيم النص وإزالة التكرار وحذف المسافات

مقالات ذات صلة

نظافة القوائم والتحقق

الاشتراك المزدوج (double opt-in) مقابل المفرد: أيهما يناسب قائمتك البريدية؟

قارن الاشتراك المزدوج بالمفرد في إثبات الموافقة والعناوين الخاطئة والشكاوى ونمو القائمة، مع معادلة نقطة التعادل لتجربتهما على أرقامك أنت.

8 دقيقة قراءة
نظافة القوائم والتحقق

كيف تتحقق من عناوين البريد الإلكتروني بالجملة: ماذا تثبت فحوص الصياغة وMX وSMTP فعلًا

كيف تتحقق من عناوين البريد بالجملة: الطبقات من الصياغة وسجلّات MX إلى فحص SMTP، وماذا تثبت كل منها وكيف تتجنب الإضرار بالسمعة.

8 دقيقة قراءة
نظافة القوائم والتحقق

رمز ارتداد SMTP 550 5.1.1: ماذا يعني وكيف تصلحه

الرمز 550 5.1.1 يعني أن صندوق المستلم غير موجود. تعلّم قراءته والتمييز بينه وبين 5.1.2 و5.2.2 و5.7.1 وتنظيف قائمتك بشكل صحيح.

5 دقيقة قراءة

أحدث الأدوات

أدوات مجانية أُضيفت حديثًا — تعمل في متصفحك دون رفع بياناتك

كل الأدوات →

أزل خلفية الصور داخل المتصفح بنموذج U²-Net الصغير عبر ONNX Runtime Web مع استبدال بلون أو صورة وتنزيل PNG شفاف

نموذج محلي

ابنِ JSON صالحًا لـ workflow في n8n بمعالج: اختر المحفز والخطوات ومعالجة الأخطاء بأحدث إصدارات العقد من الكتالوج

محلي

ابحث في عقد n8n (أكثر من 430) بالاسم والنوع والإصدارات، واقرأ شرحًا للشائعة منها، وألصق workflow لشرح عقده وكشف الإصدارات الأقدم

محلي

الصق سطر سجل OpenClaw (gateway، config، cron، heartbeat، القنوات) لتحصل على السبب الأرجح وخطوات الإصلاح وأمر مفيد، مع اختبار بوابة محلية

محلي