From d903f4593534a2d966e71413898aca371732379b Mon Sep 17 00:00:00 2001 From: evazion Date: Sun, 2 Jan 2022 13:38:53 -0600 Subject: [PATCH] emails: add script to fix invalid emails. Add a fix script to fix email addresses that are invalid or that contain common typos. If the email can't be fixed, usually because the fixed address is already in use by another account, then the email address is marked undeliverable. --- script/fixes/084_fix_invalid_emails.rb | 91 ++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100755 script/fixes/084_fix_invalid_emails.rb diff --git a/script/fixes/084_fix_invalid_emails.rb b/script/fixes/084_fix_invalid_emails.rb new file mode 100755 index 000000000..e1d44ed51 --- /dev/null +++ b/script/fixes/084_fix_invalid_emails.rb @@ -0,0 +1,91 @@ +#!/usr/bin/env ruby + +require_relative "../../config/environment" + +def fix(email, regex, replacement) + email.update!(address: email.address.gsub(regex, replacement)) + puts ({ old: email.address_before_last_save, new: email.address }).to_json +rescue StandardError => e + puts ({ old: email.address_was, new: email.address, error: e }).to_json + email.reload.update_attribute(:is_deliverable, false) +end + +EmailAddress.transaction do + # `foo@gmail.com ` + EmailAddress.where("address ~ '[[:space:]]'").find_each do |email| + fix(email, /[[:space:]]/, "") + end + + # foo@gmail,com foo@rambler,ru + EmailAddress.where("address ~ '@[a-z]+,[a-z]+$'").find_each do |email| + fix(email, /@([a-z]+),([a-z]+)$/, '@\1.\2') + end + + # foo@gmail.com, foo@gmail.com/ + EmailAddress.where("address ~ '\\.com.$'").find_each do |email| + fix(email, /\.com.$/, ".com") + end + + # foo@gmail.co, + EmailAddress.where("address ~ '\\.co[^m]$'").find_each do |email| + fix(email, /\.co[^m]$/, ".com") + end + + # fooqq@.com + EmailAddress.where("address ~ 'qq@\\.com$'").find_each do |email| + fix(email, /qq@\.com$/, "@qq.com") + end + + # fooaol@.com + EmailAddress.where("address ~ 'aol@\\.com$'").find_each do |email| + fix(email, /aol@\.com$/, "@aol.com") + end + + # foo@qqcom + EmailAddress.where("address ~ '@qqcom$'").find_each do |email| + fix(email, /@qqcom$/, "@qq.com") + end + + # foo@gmail foo@yahoo foo@yandex + EmailAddress.where("address ~ '@(gmail|yahoo|yandex|icloud|naver|hotmail|outlook)$'").find_each do |email| + fix(email, /@(gmail|yahoo|yandex|icloud|naver|hotmail|outlook)$/, '@\1.com') + end + + # foo@gmail. foo@gmail, + EmailAddress.where("address ~ '@[a-z]+[.,]$'").find_each do |email| + fix(email, /@([a-z]+)[.,]$/, '@\1.com') + end + + # mailto:foo@gmail.com + EmailAddress.where("address ~ '^mailto:'").find_each do |email| + fix(email, /^mailto:/, "") + end + + # foo@gmailcom foo@hotmailcom + EmailAddress.where("address ~ '@[a-z]+com$'").find_each do |email| + fix(email, /@([a-z]+)com$/, '@\1.com') + end + + # foo@gmail.com@gmail.com foo@live.com@hotmail.com + EmailAddress.where("address ~ '@[a-z]+\\.com@[a-z]+\\.com$'").find_each do |email| + fix(email, /@([a-z]+)\.com@([a-z]+)\.com$/, '@\2.com') + end + + # foo@g,ail.com + EmailAddress.where("address ~ '@g[^m]ail\\.com$'").find_each do |email| + fix(email, /@g[^m]ail\.com$/, "@gmail.com") + end + + # foo@gmai;.com + EmailAddress.where("address ~ '@gmai[^l]\\.com$'").find_each do |email| + fix(email, /@gmai[^l]\.com$/, "@gmail.com") + end + + # foo@gmail@com + EmailAddress.where("address ~ 'gmail[^.]com$'").find_each do |email| + fix(email, /gmail[^.]com$/, "@gmail.com") + end + + print "Commit? (yes/no): " + raise "abort" unless STDIN.readline.chomp == "yes" +end