Nov. 13, 2025
9:35 p.m.
Thank you Mark. I was able to fix the problem with this bit of Claude code for "mailman-web shell":
from allauth.account.models import EmailAddress from django.db.models.functions import Lower
# Get all email addresses all_emails = EmailAddress.objects.all()
# Group by user_id and lowercase email seen = {} to_delete = []
for email_obj in all_emails: key = (email_obj.user_id, email_obj.email.lower())
if key in seen:
# We have a duplicate - decide which to keep
existing = seen[key]
# Keep verified over unverified
if email_obj.verified and not existing.verified:
to_delete.append(existing.id)
seen[key] = email_obj
# Keep primary over non-primary
elif email_obj.primary and not existing.primary:
to_delete.append(existing.id)
seen[key] = email_obj
# Keep lowercase version
elif email_obj.email == email_obj.email.lower():
to_delete.append(existing.id)
seen[key] = email_obj
else:
to_delete.append(email_obj.id)
else:
seen[key] = email_obj
print(f"Will delete {len(to_delete)} duplicate entries")
# Delete duplicates if to_delete: EmailAddress.objects.filter(id__in=to_delete).delete() print("Duplicates removed!")