Created
October 24, 2016 22:55
-
-
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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