كيف تحذف الإيميلات المكررة من ملف 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 تجاهل النقاط، وتُستثنى حسابات العمل والمدارس. |
حذف +tag | gmail.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
عددنا العناوين الفريدة بين الصفوف الأحد عشر غير الفارغة تحت كل مجموعة قواعد بسكربت بايثون:
| مفتاح المطابقة | جهات اتصال فريدة | مكررات محذوفة |
|---|---|---|
| القيمة كما هي (مطابقة حرفية) | 11 | 0 |
| بعد حذف المسافات | 10 | 1 |
| حذف المسافات + نطاق بأحرف صغيرة (القراءة الصارمة للمعيار) | 10 | 1 |
| حذف المسافات + العنوان كله بأحرف صغيرة | 8 | 3 |
ما سبق + حذف نقاط Gmail و+tag | 6 | 5 |
المجموعة الأخيرة تدمج صفوف آنا الأربعة في صف واحد، ونسختي عمر المختلفتين في حالة الأحرف في واحدة، وتترك بحق omar+news@example.com وj.smith@company.co وjsmith@company.co جهات مستقلة. وحالة جون وجين سميث توضّح السبب: في نطاق شركة قد تكون النقطة هي الفرق الوحيد بين شخصين.
أي صف مكرر تُبقي عليه؟
حذف المكرر يحذف الصف كله لا خلية البريد وحدها. وتنص وثائق Excel على ذلك صراحةً في ميزة إزالة التكرارات: إذا وُجد تطابق في الأعمدة المحددة حُذف الصف بالكامل مع بقية أعمدته. إذن ترتيب الصفوف هو ما يحدد أي اسم وتاريخ وسجل موافقة يبقى.
- الأحدث يبقى: رتّب بتاريخ التسجيل أو آخر نشاط من الأحدث إلى الأقدم قبل الحذف. مناسب للأسماء والتفضيلات التي تتغير.
- الأقدم يبقى: رتّب من الأقدم. مناسب حين يحمل أول صف سجل الموافقة الأصلي الذي قد تحتاجه دليلًا.
- الأكمل يبقى: رتّب بحيث تتقدم الصفوف ذات الحقول المعبّأة أكثر. مناسب لاستيراد بيانات CRM.
- الدمج: أبقِ صفًا واحدًا وانقل إليه الحقول الفارغة فيه من الصفوف الأخرى. يحتاج سكربتًا أو ميزة دمج في الـCRM.
أيًّا كان اختيارك، احفظ الصفوف المحذوفة في ملف منفصل مع سبب الحذف. فهو سجلّك إن سأل أحدهم لماذا توقفت رسائلك عنه، ويتيح لك التراجع عن قاعدة خاطئة.
الطريقة الأولى: Excel أو Google Sheets مع عمود مساعد
- احتفظ بنسخة من الملف أولًا، فإزالة التكرار تحذف صفوفًا.
- أضف عمودًا مساعدًا بجوار البريد واكتب فيه
=LOWER(TRIM(A2))ثم انسخه إلى الأسفل. - رتّب الورقة بحيث يأتي الصف الذي تريد إبقاءه أولًا (مثلًا بعمود
signed_upمن الأحدث إلى الأقدم). - حدّد البيانات واختر في Excel Data ← Remove Duplicates، أو في Sheets Data ← Data cleanup ← Remove duplicates، وفعّل العمود المساعد وحده.
- احذف العمود المساعد وصدّر الملف بصيغة 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؟
تُبقي ميزة إزالة التكرارات أول صف مطابق بحسب الترتيب الحالي وتحذف الصفوف اللاحقة كاملة. رتّب الورقة أولًا ليكون الصف الذي تريده في الأعلى.
المراجع ومزيد من القراءة
- RFC 5321 — Simple Mail Transfer Protocol، القسم 2.4
- مساعدة Gmail — النقاط لا تهم في عناوين Gmail
- مساعدة Gmail — إرسال الرسائل من عنوان أو اسم مستعار آخر
- Microsoft Learn — Plus Addressing in Exchange Online
- دعم مايكروسوفت — تصفية القيم الفريدة أو إزالة القيم المكررة
- مساعدة محررات مستندات Google — تقسيم النص وإزالة التكرار وحذف المسافات


