#!/hint/python3 # -*- indent-tabs-mode: t -*- import os import os.path import subprocess import datetime import re import email.utils # # Mail attribute utilities def parse_address(x): return email.utils.parseaddr(str(x))[1] def parse_addresses(x): return [p[1] for p in email.utils.getaddresses([str(x)])] def match_re(x, pat): return re.fullmatch(pat, x, re.IGNORECASE) def match_glob(x, glob): if '@' in glob: if glob.startswith('@'): return x.lower().endswith(glob.lower()) return x.lower() == glob.lower() else: return x.lower().endswith('@'+glob.lower()) or x.lower().endswith('.'+glob.lower()) def originator_addresses(mail): return [p[1] for p in email.utils.getaddresses([ str(mail['From']), str(mail['Sender']), str(mail['Reply-To']), ]) if p[1] != ''] def destination_addresses(mail): return [p[1] for p in email.utils.getaddresses([ str(mail['To']), str(mail['Cc']), str(mail['Bcc']), ]) if p[1] != ''] def all_addresses(mail): return originator_addresses(mail) + destination_addresses(mail) def mailman_domain(mail, domain): """ Return a string that is the list-name for a mailman domain """ m = match_re(parse_address(mail["List-Id"]), "(.*)\."+re.escape(domain)) if m: return m.group(1) if mail["List-Id"] != "": return None for addr in destination_addresses(mail): m = match_re(addr, "(.*)@"+re.escape(domain)) if m: ret = m.group(1) if mail["Subject"].contains("["+ret+"]"): return ret return None def ezmlm_domain(mail, domain): """ Return a string that is the list-name for a ezmlm domain """ m = match_re(parse_address(mail["List-Id"]), "(.*)\."+re.escape(domain)) if m: return m.group(1) if mail["List-Id"] != "": return None ml = [s.strip() for s in str(mail["Mailing-List"]).split(";")] if 'run by ezmlm' in ml: contacts = [s[7:].strip() for s in ml if s.startswith('contact ')] for contact in contacts: m = match_re(contact, "(.+)-help@"+re.escape(domain)) if m: return m.group(1) for addr in destination_addresses(mail): m = match_re(addr, "(.*)@"+re.escape(domain)) if m: return m.group(1) return None def majordomo_domain(mail, domain): """ Return a string that is the list-name for a majordomo domain """ m = match_re(parse_address(mail["List-Id"]), "(.*)\."+re.escape(domain)) if m: return m.group(1) if mail["List-Id"] != "": return None for addr in destination_addresses(mail): m = match_re(addr, "(.*)@"+re.escape(domain)) if m: return m.group(1) return None def github_domain(mail): """ Return a string that is the list-name for a GitHub domain """ m = match_re(parse_address(mail["List-Id"]), "(.*)\."+re.escape("github.com")) if m: return ".".join(reversed(m.group(1).split("."))) return None def is_from(mail, address): return any(match_glob(addr, address) for addr in originator_addresses(mail)) def is_from_re(mail, address): return any(match_re(addr, address) for addr in originator_addresses(mail)) def is_to_or_from(mail, address): return any(match_glob(addr, address) for addr in all_addresses(mail)) def is_to_or_from_re(mail, address): return any(match_re(addr, address) for addr in all_addresses(mail)) def is_me(address): return any(match_glob(address, glob) for glob in ["@lukeshu.com", "lukeshu@sbcglobal.net", "lukeshu@parabola.nu", "lukeshu@purdue.edu", "shumakl@purdue.edu"]) def is_to_me(mail): return any(is_me(addr) for addr in destination_addresses(mail)) # # bogofilter utilites def bogofilter_auto(mail): p = subprocess.Popen( ["bogofilter", "-u", "-v", "-I", mail.path], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) (output, _) = p.communicate() processor.log("*** Bogofilter result: {0!r}".format(output.rstrip())) if p.returncode not in [0, 1, 2]: processor.log_error( "Error running bogofilter: Return code = {0!r}".format( p.returncode)) return p.returncode def bogofilter_ham(mail): subprocess.call(["bogofilter", "-S", "-n", "-I", mail.path]) def bogofilter_spam(mail): subprocess.call(["bogofilter", "-N", "-s", "-I", mail.path]) # # The core of my filters def ensure_folder(folder): dir = processor.maildir_base+"/"+folder if not os.path.isfile(dir+"/maildirfolder"): os.makedirs(dir+"/tmp", 0o777, True) os.makedirs(dir+"/new", 0o777, True) os.makedirs(dir+"/cur", 0o777, True) open(dir+"/maildirfolder", 'a').close() subprocess.call(['make', '-C', os.environ['XDG_CONFIG_HOME']]) def move_ham(mail, folder): now = datetime.datetime.now() # now = email.utils.parsedate_to_datetime('%s' % mail["Date"]) big_folders = [ ".software.nongnu.qemu-devel", ".software.kernel.git", ".software.gnu.emacs-devel", ".software.sourceware.libc-alpha", ] if folder in big_folders: folder += ".%02d" % now.month folder = "MAIN/Ham."+str(now.year)+folder ensure_folder(folder) mail.move(folder) def move_other(mail, typ): now = datetime.datetime.now() folder = "MAIN/"+typ+"."+str(now.year) ensure_folder(folder) mail.move(folder) def my_whitelist(mail): return ( False # Specific people or is_to_or_from(mail, "Bryan@ChankTunUnGi.onmicrosoft.com") or is_to_or_from(mail, "bill-auger@peers.community") or is_to_or_from(mail, "cacnedcomms@gmail.com") or is_from(mail, "3174451635@mms.att.net") or is_from(mail, "AnimalRescueoftheRockies@mailman.bloomerang-mail.com") or is_from(mail, "Firecrafter38@wildapricot.org") or is_from(mail, "MAILER-DAEMON@yahoo.com") or is_from(mail, "Promo@email.newegg.com") or is_from(mail, "flynn@kodachi.com") or is_from(mail, "info@email2.mysimplemobile.com") or is_from(mail, "luke.t.shumaker@gmail.com") or is_from(mail, "margieshu@gmail.com") or is_from(mail, "margieshu@sbcglobal.net") or is_from(mail, "no-reply@sns.amazonaws.com") or is_from(mail, "TrackingUpdates@fedex.com") or is_to_or_from(mail, "shupetech.com") or is_from(mail, "gunbarrelod@gmail.com") # Gunbarrel Optometry or is_from(mail, "oral-b@reorder.com") # Software wildcard domains or is_to_or_from(mail, "fsf.org") or is_to_or_from(mail, "gnu.org") or is_to_or_from(mail, "nongnu.org") or is_to_or_from(mail, "opengroup.org") or is_to_or_from(mail, "parabola.nu") or is_to_or_from(mail, "parabolagnulinux.org") or is_to_or_from(mail, "puri.sm") or is_to_or_from(mail, "reproducible-builds.org") or is_to_or_from(mail, "sfconservancy.org") or is_to_or_from(mail, "sourceware.org") or is_to_or_from(mail, "sr.ht") or is_to_or_from(mail, "vger.kernel.org") or is_from(mail, "datawire.io") or is_from(mail, "debian.org") or is_from(mail, "google.com") or is_from(mail, "keyboard.io") or is_from(mail, "pine64.com") # Living situation domains # Colorado or is_from(mail, "meadowcreekapartments@emailrelay.com") or is_from(mail, "@aircommunities.com") or is_from(mail, "@kingsleyassociates.com") or is_from(mail, "@luxerone.com") or is_from(mail, "@mail.welcomehome.com") or is_from(mail, "@myaimcohome.com") or is_from(mail, "@myaircommunitieshome.com") or is_from(mail, "aimco.com") or is_from(mail, "alerts.comcast.net") or is_from(mail, "boulder.noshdelivery.co") or is_from(mail, "colorado.gov") or is_from(mail, "conservicemail.com") or is_from(mail, "emails.xfinity.com") or is_from(mail, "entrata.com") or is_from(mail, "govdelivery.com") or is_from(mail, "realpage.com") or is_from(mail, "residentportal.com") or is_from(mail, "state.co.us") or is_from(mail, "bch.org") or is_from(mail, "mailer@messages.lhmailer.com") # Thomas Bogan DDS or is_from(mail, "bouldercountyvotes.org") # Massachusetts or is_from(mail, "eversource.com") or is_from(mail, "getgreenmountainenergy.com") or is_from(mail, "greenmountain.com") or is_from(mail, "kelleyryan.com") or is_from(mail, "mbta.com") or is_from(mail, "nationalgrid.com") or is_from(mail, "nationalgridus.com") or is_from(mail, "rcn.com") or is_from(mail, "rcn.net") or is_from(mail, "state.ma.us") # Indiana or is_from(mail, "vectren.com") or is_from(mail, "vectrenemail.com") # Other wildcard domains or is_from(mail, "academia-mail.com") # academia.edu or is_from(mail, "accounts.google.com") or is_from(mail, "alibaba.com") or is_from(mail, "amazon.com") or is_from(mail, "amctheatres.com") or is_from(mail, "att-mail.com") or is_from(mail, "backerkit.com") or is_from(mail, "bricklink.com") or is_from(mail, "butcherbox.com") or is_from(mail, "careereco.com") or is_from(mail, "carta.com") or is_from(mail, "chewy.com") or is_from(mail, "chiefdelphi.com") or is_from(mail, "ciholas.com") or is_from(mail, "circleci.com") or is_from(mail, "discoursemail.com") or is_from(mail, "docker.com") or is_from(mail, "docusign.net") or is_from(mail, "dominos.com") or is_from(mail, "e.healthequity.com") or is_from(mail, "ebay.com") or is_from(mail, "emailbcbsma.com") or is_from(mail, "eorderstart.com") or is_from(mail, "etsy.com") or is_from(mail, "eyemed.com") or is_from(mail, "facebookmail.com") or is_from(mail, "firefox.com") or is_from(mail, "flyfrontier.com") or is_from(mail, "gandi.net") or is_from(mail, "gencon.com") or is_from(mail, "github.com") or is_from(mail, "globeasphalt.net") or is_from(mail, "goodwillindy.org") or is_from(mail, "groupmemailer.com") or is_from(mail, "grubhub.com") or is_from(mail, "guru.com") or is_from(mail, "hellofresh.com") or is_from(mail, "hulumail.com") or is_from(mail, "intuit.com") or is_from(mail, "kickstarter.com") or is_from(mail, "lego.com") or is_from(mail, "linkedin.com") or is_from(mail, "list.cr.yp.to") or is_from(mail, "lpi.org") or is_from(mail, "lulzbot.com") or is_from(mail, "lyftmail.com") or is_from(mail, "mail.disneyplus.com") or is_from(mail, "mail.plus.espn.com") or is_from(mail, "mail.scribd.com") or is_from(mail, "maildl.att-mail.com") or is_from(mail, "massdrop.com") or is_from(mail, "msdlt.k12.in.us") or is_from(mail, "naviabenefits.com") or is_from(mail, "netflix.com") or is_from(mail, "netlify.com") or is_from(mail, "newegg.com") or is_from(mail, "nintendo.com") or is_from(mail, "oldnational.com") or is_from(mail, "oralb.com") or is_from(mail, "orderstart.com") or is_from(mail, "ordertrack.wireless.att-mail.com") or is_from(mail, "oreillyauto.com") or is_from(mail, "patreon.com") or is_from(mail, "paypal.com") or is_from(mail, "peacocktv.com") or is_from(mail, "plugable.com") or is_from(mail, "post.oreilly.com") or is_from(mail, "proxyvote.com") or is_from(mail, "publishingconcepts.com") # National Eagle Scout Association thing or is_from(mail, "qobuz.com") or is_from(mail, "raphnet-tech.com") or is_from(mail, "raphnet.com") or is_from(mail, "raphnet.net") or is_from(mail, "redditmail.com") or is_from(mail, "redhat.com") or is_from(mail, "rockauto.com") or is_from(mail, "scaleway.com") or is_from(mail, "scaleway.net") or is_from(mail, "schwab.com") or is_from(mail, "scouting.org") or is_from(mail, "seeed.cc") or is_from(mail, "slack.com") or is_from(mail, "solutionsinplastic.com") or is_from(mail, "startcom.org") or is_from(mail, "steampowered.com") or is_from(mail, "target.com") or is_from(mail, "travelers.com") or is_from(mail, "uhc.com") # united health care or is_from(mail, "ultramobile.com") or is_from(mail, "united.com") # airlines or is_from(mail, "unitedhealthcare.com") or is_from(mail, "upwork.com") or is_from(mail, "usfirst.org") or is_from(mail, "wikimedia.org") or is_from(mail, "wolframalpha.com") or match_re(parse_address(mail["List-Id"]), ".*\.(gnu|gnome|archlinux|parabolagnulinuxlibre|fedorahosted)\.org") or match_re(parse_address(mail["List-Id"]), ".*\.parabola\.nu") or match_re(parse_address(mail["List-Id"]), ".*\.lists\.arthurdejong\.org") or mail["Subject"].contains("[Dev]") or mail["Subject"].contains("[Maintenance]") or mail["Subject"].contains("[PATCH") or mail["Subject"].contains("[systemd-devel]") ) def my_blacklist(mail): return ( False or ((mail['Subject'] == "Предложение") and (email.utils.parseaddr(str(mail['From']))[0] == "Aleksandr")) or ((mail['Subject'] == "Сотрудничество") and (email.utils.parseaddr(str(mail['From']))[0] == "Александр Николаевич")) or ((mail['Subject'] == "Сотрудничество") and (email.utils.parseaddr(str(mail['From']))[0] == "Alex")) or ((mail['Subject'] == "Ответьте на предложение (Respond to the offer)") and (email.utils.parseaddr(str(mail['From']))[0] == "Alex")) or ((mail['Subject'] == "Offer (Предложение)") and (email.utils.parseaddr(str(mail['From']))[0] == "Aleksandr")) # 126.com or is_from(mail, "adalul@126.com") or is_from(mail, "dangshiganggu614@126.com") or is_from(mail, "dhutvnjj5566@126.com") or is_from(mail, "jiushiyao554321@126.com") or is_from(mail, "junlong16515@126.com") or is_from(mail, "keqijiaozhuo2891@126.com") or is_from(mail, "lisawu1985@126.com") or is_from(mail, "massagegun@126.com") or is_from(mail, "rondtang@126.com") or is_from(mail, "sefunm1@126.com") or is_from(mail, "smile202999@126.com") or is_from(mail, "taoji22157902@126.com") # 163.com or is_from(mail, "13277914293@163.com") or is_from(mail, "allycrystal@163.com") or is_from(mail, "andycbd@163.com") or is_from(mail, "anpingboliwiremesh@163.com") or is_from(mail, "bouncesportswear@163.com") or is_from(mail, "chinaagent2015@163.com") or is_from(mail, "gavinsolar11@163.com") or is_from(mail, "handsomeartsdec@163.com") or is_from(mail, "hsly_toby@163.com") or is_from(mail, "huixinrj01@163.com") or is_from(mail, "jerry_truck@163.com") or is_from(mail, "jessicaw8708@163.com") or is_from(mail, "liangtongluo@163.com") or is_from(mail, "megliuextract@163.com") or is_from(mail, "mincsx@163.com") or is_from(mail, "nbdef1@163.com") or is_from(mail, "newhopeglassmirror@163.com") or is_from(mail, "sally121386@163.com") or is_from(mail, "sdfghjklxczc@163.com") or is_from(mail, "smile6677888@163.com") or is_from(mail, "steelbottle@163.com") or is_from(mail, "sunonwirecloth2021@163.com") or is_from(mail, "windyzhong2013@163.com") or is_from(mail, "xingdui369@163.com") or is_from(mail, "zmevergreen@163.com") # gmail.com or is_from(mail, "affasonrabi@gmail.com") or is_from(mail, "bellawilliams9060@gmail.com") or is_from(mail, "carlsen.monika@gmail.com") or is_from(mail, "chiboy062@gmail.com") or is_from(mail, "dinamckenna1894@gmail.com") or is_from(mail, "edmondpamela60@gmail.com") or is_from(mail, "evelynrichards10@gmail.com") or is_from(mail, "farisethill630@gmail.com") or is_from(mail, "h.vandrad@gmail.com") or is_from(mail, "hanksrugo@gmail.com") or is_from(mail, "harrykuunda@gmail.com") or is_from(mail, "henrygunter835@gmail.com") or is_from(mail, "ibrahimidewu4@gmail.com") or is_from(mail, "jessicadaniel7833@gmail.com") or is_from(mail, "jimmymoore265@gmail.com") or is_from(mail, "laviis7111@gmail.com") or is_from(mail, "lishalu25@gmail.com") or is_from(mail, "lw23675851@gmail.com") or is_from(mail, "mamadele79@gmail.com") or is_from(mail, "mimihassan971@gmail.com") or is_from(mail, "mrs.doris.david02@gmail.com") or is_from(mail, "odemartha01@gmail.com") or is_from(mail, "roseamedin02@gmail.com") or is_from(mail, "sdltdkggl3455@gmail.com") or is_from(mail, "sgtkalamanthey@gmail.com") or is_from(mail, "sgtkaylama@gmail.com") or is_from(mail, "sgtkaylamanthey612@gmail.com") or is_from(mail, "weboutloock4@gmail.com") # other or is_from(mail, "info@frejgon.ru") or is_from(mail, "sale3@victoriapcb.com") or is_from(mail, "bcbssettlement.com") or is_from(mail, "factor75.com") or is_from(mail, "hannahjohnson8856@gmail.com") or is_from(mail, "web@equiposhosteleria.com") or (email.utils.parseaddr(str(mail['From']))[0] == "Louis Vuitton") or (email.utils.parseaddr(str(mail['From']))[0] == "BOOM OF SALES") ) def my_filters(mail): if mail["From"].contains("Parabola Website Notification "): move_ham(mail, ".software.parabola.dev.web-notif") return if is_to_me(mail) and mail["List-Id"] != "" and mail['Cc'] != "": if not is_from(mail, "notifications@github.com") and not is_from(mail, "gerrit2@projects.savoirfairelinux.com"): move_ham(mail, ".mailinglist-dup") return # .software.POSIX (custom mlm, I think) if is_to_or_from(mail, "austin-group-l@opengroup.org"): move_ham(mail, ".software.POSIX") return # .software.* (GNU Mailman) for pair in [ [ 'lists.archlinux.org' , 'archlinux' ], # @sbcglobal.net and @lukeshu.com ; problems delivering to Yahoo! (new: https://archlinux.org/news/arch-linux-mailing-list-id-changes/) [ 'archlinux.org' , 'archlinux' ], # @sbcglobal.net and @lukeshu.com ; problems delivering to Yahoo! (old: https://archlinux.org/news/arch-linux-mailing-list-id-changes/) [ 'gnome.org' , 'gnome' ], # https://mail.gnome.org/mailman/options/networkmanager-list/lukeshu@lukeshu.com [ 'gnu.org' , 'gnu' ], # https://lists.gnu.org/mailman/options/bug-librejs/lukeshu@lukeshu.com [ 'listas.trisquel.info' , 'trisquel' ], [ 'lists.arthurdejong.org' , 'arthurdejong' ], [ 'lists.fedorahosted.org' , 'fedorahosted' ], [ 'lists.freedesktop.org' , 'freedesktop' ], # https://lists.freedesktop.org/mailman/options/systemd-devel/lukeshu@lukeshu.com [ 'lists.parabola.nu' , 'parabola' ], # https://lists.parabola.nu/mailman/options/dev/lukeshu@lukeshu.com [ 'lists.reproducible-builds.org' , 'reproducible-builds' ], # https://lists.reproducible-builds.org/options/rb-general/lukeshu@lukeshu.com [ 'nongnu.org' , 'nongnu' ], # https://lists.nongnu.org/mailman/options/gnu-linux-libre/lukeshu@lukeshu.com [ 'redhat.com' , 'redhat' ], # https://www.redhat.com/mailman/options/pam-list/lukeshu@lukeshu.com [ 'lists.stanford.edu' , 'stanford' ], # https://mailman.stanford.edu/mailman/options/liberationtech-jobs/lukeshu@lukeshu.com [ 'mailman.stanford.edu' , 'stanford' ], ]: list = mailman_domain(mail, pair[0]) if list: move_ham(mail, ".software."+pair[1]+"."+list) return # .software.* (EZMLM) for pair in [ [ 'list.cr.yp.to', 'djb' ], [ 'sourceware.org', 'sourceware' ], ]: list = ezmlm_domain(mail, pair[0]) if list: move_ham(mail, ".software."+pair[1]+"."+list) return if is_from(mail, "sourceware-bugzilla@sourceware.org"): move_ham(mail, ".software.sourceware-bugzilla") return # .software.* (Majordomo) for pair in [ [ 'vger.kernel.org', 'kernel' ] ]: list = majordomo_domain(mail, pair[0]) if list: move_ham(mail, ".software."+pair[1]+"."+list) return # .software.GitHub if is_to_or_from(mail, "github.com"): list = github_domain(mail) if list: move_ham(mail, ".software.GitHub."+list) return move_ham(mail, ".software.GitHub") return # .software.parabola if ( False or is_to_or_from(mail, "1984.is") or is_to_or_from(mail, "ceata.org") or is_to_or_from(mail, "endefensadelsl.org") or is_to_or_from(mail, "hyperbola.info") or is_to_or_from(mail, "kiwwwi.com.ar") or is_to_or_from(mail, "parabola.nu") or is_to_or_from(mail, "parabolagnulinux.org") or is_to_or_from(mail, "xylon.me.uk") or False or is_to_or_from(mail, "bill-auger@peers.community") or is_to_or_from(mail, "eliotime3000@openmailbox.org") or is_to_or_from(mail, "g4jc@openmailbox.org") or is_to_or_from(mail, "jon@whiteheat.org.uk") or is_to_or_from(mail, "parabola@openmailbox.org") or is_to_or_from(mail, "srw@openmailbox.org") ): move_ham(mail, ".software.parabola") return # .software.TravisCI if is_from(mail, "builds@travis-ci.org") or is_from(mail, "builds@travis-ci.com"): move_ham(mail, ".software.TravisCI") return # .software.CircleCI if is_from(mail, "builds@circleci.com"): move_ham(mail, ".software.CircleCI") return # .software for address in [ "archlinux.org", "canonical.org", "circleci.com", "cnuk.org", "core3.amsl.com", "defectivebydesign.org", "eff.org", "fedorahosted.org", "foocorp.net", "fsf.org", "gitorious.org", "gnome.org", "gnu.org", "ietf.org", "kde.org", "kernel.org", "launchpad.net", "mozilla.org", "nongnu.org", "savoirfairelinux.com", "sourceforge.com", "thyrsus.com", "travis-ci.com", "travis-ci.org", ]: if is_to_or_from(mail, address): move_ham(mail, ".software") return if mail["Subject"].contains("[PATCH"): move_ham(mail, ".software") return # .servers if ( False or is_from(mail, "gandi.net") or is_from(mail, "ramhost.us") or is_from(mail, "startcom.org") or is_from(mail, "startssl.com") or is_from(mail, "vultr.com") or (is_from(mail, "@2co.com") and mail["Subject"].contains("RAM Host")) or is_from(mail, "localhost") or is_from(mail, "local") or is_from(mail, "lan") or is_from(mail, "lukeshu.com") or is_from(mail, "sns.amazonaws.com") or is_from(mail, "no-reply-aws@amazon.com") or is_from(mail, "rsync.net") ): move_ham(mail, ".servers") return # .MeadowCreek if ( False or is_from(mail, "meadowcreekapartments@emailrelay.com") or is_from(mail, "@aircommunities.com") or is_from(mail, "@kingsleyassociates.com") or is_from(mail, "@mail.welcomehome.com") or is_from(mail, "@myaimcohome.com") or is_from(mail, "@myaircommunitieshome.com") or is_from(mail, "aimco.com") or is_from(mail, "conservicemail.com") or is_from(mail, "entrata.com") or is_from(mail, "realpage.com") or is_from(mail, "residentportal.com") ): move_ham(mail, ".MeadowCreek") return # .MeadowCreek.LuxerOne if is_from(mail, "@luxerone.com"): move_ham(mail, ".MeadowCreek.LuxerOne") return # .bills if ( False or is_from(mail, "eversource.com") or is_from(mail, "getgreenmountainenergy.com") or is_from(mail, "greenmountain.com") or is_from(mail, "kelleyryan.com") or is_from(mail, "mbta.com") or is_from(mail, "nationalgrid.com") or is_from(mail, "nationalgridus.com") or is_from(mail, "oldnational.com") or is_from(mail, "rcn.com") or is_from(mail, "rcn.net") or is_from(mail, "tello.com") or is_from(mail, "travelers.com") or is_from(mail, "ultramobile.com") ): move_ham(mail, ".bills") return if is_from(mail, "alerts.comcast.net"): move_ham(mail, ".bills.xfinity") return if is_from(mail, "emails.xfinity.com"): move_ham(mail, ".bills.xfinity.probable-spam") return # .shopping if ( False # special or (is_from(mail, "messages@email.oreillyauto.com") and mail["Subject"].contains("rder")) or (is_from(mail, "no-reply@lyftmail.com") and mail["Subject"].contains("Your ride")) or (is_from(mail, "no-reply@dmsguild.com") and mail["Subject"].contains("Thank you for your Dungeon Masters Guild order")) or (is_from(mail, "foresee.com") and email.utils.parseaddr(str(mail['From']))[0] == "OReillyAuto.com") # @ or is_from(mail, "auto-confirm@amazon.com") or is_from(mail, "order-update@amazon.com") or is_from(mail, "payments-messages@amazon.com") or is_from(mail, "shipment-tracking@amazon.com") or is_from(mail, "atoz-guarantee-no-reply@amazon.com") or is_from(mail, "sales@covertinstruments.com") or is_from(mail, "googlestore-noreply@google.com") or is_from(mail, "shop@raphnet.com") or is_from(mail, "orders@eat.grubhub.com") # no @ or is_from(mail, "boulder.noshdelivery.co") or is_from(mail, "dominos.com") or is_from(mail, "electroware.pl") or is_from(mail, "eorderstart.com") # Rusty Melon or is_from(mail, "etsy.com") or is_from(mail, "inhouseorders.io") # Yurihana or is_from(mail, "order.homedepot.com") or is_from(mail, "orderstart.com") # Rusty Melon or is_from(mail, "pine64.com") or is_from(mail, "rockauto.com") # Snarf's or is_from(mail, "rrtusa.com") # Snarf's or is_from(mail, "stripe.com") # Yurihana or is_from(mail, "swathestore.com") ): move_ham(mail, ".shopping") return if is_from(mail, "butcherbox.com"): move_ham(mail, ".shopping.ButcherBox") return if is_from(mail, "hellofresh.com"): move_ham(mail, ".shopping.HelloFresh") return # .Social.* if is_from_re(mail, ".*[@.]facebook(|mail)\.com"): move_ham(mail, ".Social.Facebook") return if is_from(mail, "identi.ca"): move_ham(mail, ".Social.Identica") return if is_from(mail, "twitter.com"): move_ham(mail, ".Social.Twitter") return if is_from(mail, "xkcd.com"): move_ham(mail, ".Social.xkcd") return if is_from(mail, "linkedin.com"): move_ham(mail, ".Social.LinkedIn") return if is_from(mail, "redditmail.com"): move_ham(mail, ".Social.Reddit") return if is_from(mail, "discord.com"): move_ham(mail, ".Social.Discord") return if is_from(mail, "bingo@patreon.com"): move_ham(mail, ".Social.Patreon") return if is_from(mail, "githubcommunity@discoursemail.com"): move_ham(mail, ".Social.GitHubForum") return # .jobs.* if is_from(mail, "guru.com"): move_ham(mail, ".jobs.Guru") return if is_from(mail, "glassdoor.com"): move_ham(mail, ".jobs.Glassdoor") return if is_from(mail, "bountysource.com"): move_ham(mail, ".jobs.Bountysource") return if is_from(mail, "upwork.com"): move_ham(mail, ".jobs.Upwork") return if is_from(mail, "datawire.io"): move_ham(mail, ".jobs.Datawire") return # .BSA if ( False or mail["List-Id"].contains("troopmailinglist.troop276.net") or mail["Subject"].matches("troop") or mail["Subject"].matches("merit\s*badge") or is_to_or_from(mail, "t276_announcements@att.net") or is_to_or_from(mail, "Bryan@ChankTunUnGi.onmicrosoft.com") or is_to_or_from(mail, "basu@maharjan.org") or is_to_or_from(mail, "cacnedcomms@gmail.com") or is_to_or_from(mail, "crossroadsbsa.org") or is_to_or_from(mail, "dhoyt@yourhomecompany.com") or is_to_or_from(mail, "dllargent@comcast.net") or is_to_or_from(mail, "eldredmac@comcast.net")# MacDonell or is_to_or_from(mail, "jsting@sbcglobal.net") or is_to_or_from(mail, "mitchprather@sbcglobal.net") or is_to_or_from(mail, "muellerindy@yahoo.com") or is_to_or_from(mail, "mytroop.us") or is_to_or_from(mail, "oa_wap@yahoo.com") or is_to_or_from(mail, "salupo_vincent_p@lilly.com") or is_to_or_from(mail, "scouting.org") or is_to_or_from(mail, "solorzano.luis@rocketmail.com") or is_to_or_from(mail, "trdindy@comcast.net") or is_to_or_from(mail, "wjensen111@aol.com") ): move_ham(mail, ".BSA") return # .FRC for address in [ "ni.com", "usfirst.org", "firstinspires.org" ]: if is_to_or_from(mail, address): move_ham(mail, ".FRC") return # .FRC.829 if ( False or mail["Subject"].matches("\b829\b") or is_to_or_from(mail, "wcxctrack829@aim.com") # Pat or is_to_or_from(mail, "william.walk@gmail.com") ): move_ham(mail, ".FRC.829") return # .FRC.1024 if ( False or mail["Subject"].matches("\b1024\b") or mail["Subject"].matches("kil-?a-?bytes") or is_to_or_from(mail, "BBonahoom@stanleyworks.com") or is_to_or_from(mail, "bryanbonahoom@gmail.com") or is_to_or_from(mail, "allison.m.babcock@gmail.com") or is_to_or_from(mail, "cdewalt3@yahoo.com") or is_to_or_from(mail, "dave.nelson@ecolab.com") or is_to_or_from(mail, "dickaustin190@yahoo.com") or is_to_or_from(mail, "djnels1@comcast.net") # Dave and Julie Nelson or is_to_or_from(mail, "gamefreak207@gmail.com") # Brett Leedy or is_to_or_from(mail, "jason.zielke@gmail.com") or is_to_or_from(mail, "jeffreysmith@msdlt.k12.in.us") or is_to_or_from(mail, "sarahlittell@comcast.net") or is_to_or_from(mail, "silioso@gmail.com") or is_to_or_from(mail, "skiplittell@comcast.net") or is_to_or_from(mail, "tswilson4801@att.net") ): move_ham(mail, ".FRC.1024") return # .FRC.4272 if ( False or mail["Subject"].matches("\b4272\b") or mail["Subject"].contains("[ME297]") or is_to_or_from(mail, "firstteam4272@gmail.com") or is_to_or_from(mail, "@tscstudents.net") or is_to_or_from(mail, "@tsc.k12.in.us") or is_to_or_from(mail, "ericjoelsells@gmail.com") or is_to_or_from(mail, "abenyeho@purdue.edu") or is_to_or_from(mail, "alexhenry@purdue.edu") or is_to_or_from(mail, "Henry65@purdue.edu") or is_to_or_from(mail, "chang282@purdue.edu") ): move_ham(mail, ".FRC.4272") return # .Purdue.* if ( False or mail["Subject"].contains("[PASE]") or is_to_or_from(mail, "Purduealumni@purdue.edu") or is_to_or_from(mail, "pase@purdue.edu") ): move_ham(mail, ".Purdue.PASE") return if mail["Subject"].contains("[PLUG]"): move_ham(mail, ".Purdue.PLUG") return if is_to_or_from(mail, "@cerias.purdue.edu"): move_ham(mail, ".Purdue.CERIAS") return if ( False or is_to_or_from(mail, "purduehackers@gmail.com") or is_to_or_from(mail, "royfu@purdue.edu") or is_to_or_from(mail, "usmannkhan@purdue.edu") ): move_ham(mail, ".Purdue.Hackers") return if ( False or mail["Subject"].contains("[CS Opportunity Update]") or mail["Subject"].contains("[CS Majors]") ): move_ham(mail, ".Purdue.CS") return if ( False or is_to_or_from(mail, "askcco@purdue.edu") or is_to_or_from_re(mail, "pmx-auto-approve\+.*@purdue\.edu") or is_to_or_from(mail, "evertrue@purdue.edu") or is_to_or_from(mail, "college.response@purdue.edu") or is_to_or_from(mail, "purduepresident@purdue.edu") or is_to_or_from(mail, "@prf.org") ): move_ham(mail, ".Purdue.misc") return # .misc.* if is_from(mail, "schwab.com"): move_ham(mail, ".misc.schwab") return if is_from(mail, "ebay.com"): move_ham(mail, ".misc.ebay") return if is_from(mail, "paypal.com"): move_ham(mail, ".misc.paypal") return if is_from(mail, "intuit.com"): move_ham(mail, ".misc.Intuit") return if is_from(mail, "qobuz.com"): move_ham(mail, ".misc.Qobuz") return if ( False or is_to_or_from(mail, "margieshu@sbcglobal.net") or is_to_or_from(mail, "margieshu@gmail.com") or is_to_or_from(mail, "3174451635@mms.att.net") ): move_ham(mail, ".misc.Mom") return if ( False or is_from(mail, "carta.com") or is_from(mail, "proxyvote.com") ): move_ham(mail, ".misc.stocks") return if is_to_or_from(mail, "freelancer.com"): move_ham(mail, ".misc.Freelancer") return for address in [ "lpi.org", "pearson.com", "ciscotraining-notify@cisco.com", ]: if is_from(mail, address): move_ham(mail, ".misc.CompTIA") return if ( False or mail["From"].contains("newsletter") or mail["From"].contains("announcements") or mail["Subject"].contains("newsletter") or mail["Message-Id"].contains("@sailthru.com") or False or (mail["From"].contains("@sparkfun.com") and mail["Message-Id"].contains("rsgsv.net")) or (mail["From"].contains("no-reply@kickstarter.com") and mail["Message-Id"].contains(".sendgrid.net")) or (mail["From"].contains("no-reply@kickstarter.com") and ( False or mail["Subject"].contains("Projects We Love:") or mail["Subject"].contains("Project Update"))) or mail["From"].contains("Info@mailing.jamendo.com") or mail["From"].contains("Promo@email.newegg.com") or mail["From"].contains("Promo@promo.newegg.com") or mail["From"].contains("auto@comicsbyemail.com") or mail["From"].contains("info@demandprogress.org") or mail["From"].contains("info@email2.mysimplemobile.com") or mail["From"].contains("info@massdrop.com") or mail["From"].contains("info@lulzbot.com") or mail["From"].contains("oreilly.com") or mail["From"].contains("reply-to@e.digikey.com") or mail["From"].contains("communication@communications.bmv.in.gov") or mail["From"].contains("sales@solutionsinplastic.com") or mail["From"].contains("social@goodwillindy.org") or mail["From"].contains("support@support.digitalocean.com") or mail["From"].contains("@pardonsnowden.org") or mail["List-Id"].contains("sparkpostmail.com") or mail["List-Id"].contains("mcsv.net") or is_from(mail, "AnimalRescueoftheRockies@mailman.bloomerang-mail.com") or is_from(mail, "support@vetsfirstchoice.com") or is_from(mail, "customersupport@eatajs.com") or is_from(mail, "boulder@noshdelivery.co") or is_from(mail, "disneyplus@mail.disneyplus.com") or is_from(mail, "fanservices@mail.plus.espn.com") or is_from(mail, "ORewards@e3.oreillyauto.com") or is_from(mail, "store-news@amazon.com") ): move_ham(mail, ".misc.Newsletters") return if ( False or (is_from(mail, "no-reply@patreon.com") and mail["Subject"].contains("Patreon log in attempt")) or (is_from(mail, "noreply@lyftmail.com") and mail["Subject"].contains("New Login")) or (is_from(mail, "service@notice.alibaba.com") and mail["Subject"].contains("Verification Code")) or (is_from(mail, "service@notice.alibaba.com") and mail["Subject"].contains("Verification Code")) or mail["Subject"].contains("password") or mail["Subject"].contains("account") or mail["From"].contains("accounts") or is_from(mail, "account-update@amazon.com") ): move_ham(mail, ".misc.accounts") return if is_from(mail, "alibaba.com"): move_ham(mail, ".shopping.alibaba") return move_ham(mail, "") # # call the above def handle_incoming_ham_training(mail): bogofilter_ham(mail) handle_incoming_ham(mail) def handle_incoming_spam_training(mail): bogofilter_spam(mail) handle_incoming_spam(mail) def handle_incoming_ham(mail): my_filters(mail) def handle_incoming_spam(mail): if my_blacklist(mail): move_other(mail, "SpammySpam") else: move_other(mail, "Spam") def handle_incoming_unknown(mail): # Whitelist if my_whitelist(mail): handle_incoming_ham_training(mail) return # Blacklist if my_blacklist(mail): handle_incoming_spam_training(mail) return spam = bogofilter_auto(mail) if spam == 0: handle_incoming_spam(mail) return elif spam == 1: handle_incoming_ham(mail) return elif spam == 2: move_other(mail, "MysteryMeat") return else: move_other(mail, "BogoFail") return # hook the above functions into the maildirproc processor processor.maildir_base = "~/Maildir" processor.auto_reload_rcfile = True handle_mapping = { # "REMOTES/ATT/Inbox": handle_incoming_unknown, # "REMOTES/ATT/Bulk Mail": handle_incoming_unknown, # fucking Yahoo! "REMOTES/lukeshu/INBOX": handle_incoming_unknown, "QUEUES/Unknown": handle_incoming_unknown, "QUEUES/Spam": handle_incoming_spam_training, "QUEUES/SpamNoTrain": handle_incoming_spam, "QUEUES/Ham": handle_incoming_ham_training, } for folder in handle_mapping: ensure_folder(folder) processor.maildirs = handle_mapping.keys() for mail in processor: handle_mapping[mail.maildir](mail)