Skip to content

Instantly share code, notes, and snippets.

@leomelzer
Created October 24, 2016 22:55
Show Gist options
  • Save leomelzer/396986a200af5cdf0868aa2286b11ba1 to your computer and use it in GitHub Desktop.
Save leomelzer/396986a200af5cdf0868aa2286b11ba1 to your computer and use it in GitHub Desktop.
Process SendGrid suppressions into SparkPost compatible format. Allows diffing of email CSVs to exclude previously bounced addresses.
#!/usr/local/bin/python3
import csv
import argparse
from os import path
def combine_suppressions(outfilename='suppressions.csv'):
suppressions = set()
suppression_map = {
'suppression_blocks.csv': 2,
'suppression_bounces.csv': 2,
'suppression_invalid_emails.csv': 1,
'suppression_spam_reports.csv': 1
}
for filename, email_index in suppression_map.items():
print('Processing %s...' % filename)
with open(filename, 'r') as file:
reader = csv.reader(file)
for row in reader:
suppressions.add(row[email_index])
with open(outfilename, 'w') as outfile:
writer = csv.writer(outfile, quoting=csv.QUOTE_ALL, lineterminator='\n')
# write header for SparkPost
writer.writerow(('recipient', 'transactional', 'non_transactional'))
for email in suppressions:
writer.writerow((email, 'true', 'true'))
def diff(emails_filename, verbose=False, suppressions_filename='suppressions.csv', suppression_index=0, email_index=1):
suppressions = set()
with open(suppressions_filename, 'r') as suppressions_file:
suppressions_reader = csv.reader(suppressions_file)
# skip header
next(suppressions_reader)
for row in suppressions_reader:
suppressions.add((row[suppression_index]))
with open('clean-%s' % path.basename(emails_filename), 'w') as emails_clean_file, open(emails_filename, 'r') as emails_file:
writer = csv.writer(emails_clean_file, quoting=csv.QUOTE_ALL, lineterminator='\n')
emails_reader = csv.reader(emails_file)
# write header
writer.writerow(next(emails_reader))
removed = 0
for row in emails_reader:
if (row[email_index]) not in suppressions:
writer.writerow(row)
else:
if verbose:
print('Removing %s' % row[email_index])
removed += 1
print('Removed %s emails and wrote output to %s' % (removed, emails_clean_file.name))
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Process suppressions and diff with sending list.')
parser.add_argument('--verbose', action='store_true', help='Print more.', default=False)
parser.add_argument('--diff', action='store_true', help='Diff Mode: Removes emails to be suppressed from the given CSV. Creates a new file called clean-*.csv in the working directory.')
parser.add_argument('--emails', type=str, dest='emails_filename', default='emails.csv', help='Email CSV filename for diff mode.')
parser.add_argument('--combine', action='store_true', help='Combine Mode: Combines the SendGrid suppression CSVs to a single CSV in SparkPost-compatible format.')
args = parser.parse_args()
if not args.diff and not args.combine:
parser.print_help()
if args.diff:
diff(args.emails_filename, verbose=args.verbose)
if args.combine:
combine_suppressions()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment