# mailrules.sieve # Automatische mailsortering voor hans@australius.nl # Upload via: python3 upload_sieve.py # # Noot: fileinto-paden zijn relatief aan de persoonlijke namespace. # Op Dovecot-servers met INBOX. als prefix: voeg "INBOX." toe aan elke # fileinto-waarde als mail niet aankomt (zie SIEVE_PREFIX in upload_sieve.py). require [ "fileinto", "redirect", "copy", "date", "variables", "mime", "foreverypart", "imap4flags" ]; # ════════════════════════════════════════════════════════════════════════════ # 1. FACTUREN (altijd eerst — vóór nieuwsbrieven en diensten) # PDF-bijlagen worden doorgestuurd naar boekhouding@australius.nl # (alleen voor nieuwe mail, geen terugwerkende kracht) # ════════════════════════════════════════════════════════════════════════════ if anyof ( header :contains "Subject" ["factuur", "Factuur", "invoice", "Invoice", "rekening", "Rekening", "nota", "Nota", "betaalverzoek", "Betaalverzoek", "receipt", "Receipt", "orderbevestiging", "Orderbevestiging", "order confirmation", "betaling ontvangen", "payment received", "uw factuur", "Uw factuur", "your invoice", "Your invoice", "je factuur"] ) { # Kwartaal bepalen op basis van ontvangstdatum if currentdate :matches "year" "*" { set "jaar" "${1}"; } if anyof (currentdate :is "month" "1", currentdate :is "month" "2", currentdate :is "month" "3") { set "kwartaal" "Q1"; } elsif anyof (currentdate :is "month" "4", currentdate :is "month" "5", currentdate :is "month" "6") { set "kwartaal" "Q2"; } elsif anyof (currentdate :is "month" "7", currentdate :is "month" "8", currentdate :is "month" "9") { set "kwartaal" "Q3"; } else { set "kwartaal" "Q4"; } # PDF aanwezig → doorsturen naar boekhouding (nieuwe mail vanaf activatiedatum) foreverypart { if anyof ( header :mime :param "filename" :matches "Content-Disposition" ["*.pdf", "*.PDF"], header :mime :is "Content-Type" "application/pdf" ) { redirect :copy "boekhouding@australius.nl"; break; } } fileinto "Financieel.Facturen.${jaar}.${kwartaal}"; stop; } # ════════════════════════════════════════════════════════════════════════════ # 2. BANK & VERZEKERING # ════════════════════════════════════════════════════════════════════════════ if address :domain :is "From" ["nl.abnamro.com", "abnamro.nl"] { fileinto "Financieel.Bank.ABN AMRO"; stop; } if address :domain :is "From" ["icscards.nl", "icsmarketing.icscards.nl", "service.icscards.nl"] { fileinto "Financieel.Bank.ICS"; stop; } if address :domain :is "From" ["npex.nl"] { fileinto "Financieel.Bank.NPEX"; stop; } if address :domain :is "From" ["snelstart.nl"] { fileinto "Financieel.Bank.SnelStart"; stop; } if address :domain :is "From" ["tellow.nl"] { fileinto "Financieel.Bank.Tellow"; stop; } if address :domain :is "From" ["unive.nl", "nieuwsbrief.unive.nl"] { fileinto "Financieel.Verzekering.Univé"; stop; } if address :domain :is "From" ["heinenoord.nl"] { fileinto "Financieel.Verzekering.VEZA"; stop; } # ════════════════════════════════════════════════════════════════════════════ # 3. WERK / OPDRACHTEN # ════════════════════════════════════════════════════════════════════════════ if address :domain :is "From" ["flextender.nl"] { fileinto "Werk.Opdrachten.Flextender"; stop; } if address :domain :is "From" ["onestopsourcing.nl"] { fileinto "Werk.Opdrachten.OneStopSourcing"; stop; } if address :domain :is "From" ["immens.nu"] { fileinto "Werk.Opdrachten.IMMENS"; stop; } if address :domain :is "From" ["circle8.nl"] { fileinto "Werk.Opdrachten.Circle8"; stop; } if address :domain :is "From" ["getthere.nl"] { fileinto "Werk.Opdrachten.Get There"; stop; } if address :domain :is "From" ["huckr.ai"] { fileinto "Werk.Opdrachten.Huckr"; stop; } if address :domain :is "From" ["hey.meetjamie.ai"] { fileinto "Werk.Opdrachten.Jamie"; stop; } if address :domain :is "From" ["futurexl.nl"] { fileinto "Werk.Opdrachten.FutureXL"; stop; } if address :domain :is "From" ["boip.int"] { fileinto "Werk.Overig.BOIP"; stop; } if address :domain :is "From" ["groningen.nl", "groningenbereikbaar.nl"] { fileinto "Werk.Overig.Gemeente Groningen"; stop; } # ════════════════════════════════════════════════════════════════════════════ # 4. MOBILITEIT / EV # ════════════════════════════════════════════════════════════════════════════ if address :domain :is "From" ["eneco-emobility.com", "eneco.nl"] { fileinto "Mobiliteit.EV.Eneco eMobility"; stop; } if address :domain :is "From" ["shellrecharge.com"] { fileinto "Mobiliteit.EV.Shell Recharge"; stop; } if address :domain :is "From" ["fastned.nl"] { fileinto "Mobiliteit.EV.FastNed"; stop; } if address :domain :is "From" ["opngo.com"] { fileinto "Mobiliteit.EV.OPnGO"; stop; } if address :domain :is "From" ["tesla.com"] { fileinto "Mobiliteit.EV.Tesla"; stop; } if address :domain :is "From" ["mmsn.nl"] { fileinto "Mobiliteit.EV.Mitsubishi"; stop; } if address :domain :is "From" ["alfen.com"] { fileinto "Mobiliteit.EV.Alfen"; stop; } # ════════════════════════════════════════════════════════════════════════════ # 5. MOBILITEIT / OV & REIZEN # ════════════════════════════════════════════════════════════════════════════ if address :domain :is "From" ["ns.nl", "email.ns.nl"] { fileinto "Mobiliteit.OV & Reizen.NS"; stop; } if address :domain :is "From" ["booking.com"] { fileinto "Mobiliteit.OV & Reizen.Booking"; stop; } if address :domain :is "From" ["flitsmeister.nl"]{ fileinto "Mobiliteit.OV & Reizen.Flitsmeister"; stop; } # ════════════════════════════════════════════════════════════════════════════ # 6. BESTELLINGEN & BEZORGING # ════════════════════════════════════════════════════════════════════════════ if address :domain :is "From" ["postnl.nl", "edm.postnl.nl", "notificatie.postnl.nl"] { fileinto "Bestellingen.PostNL"; stop; } if address :domain :is "From" ["dhlparcel.nl", "dhlecommerce.nl"] { fileinto "Bestellingen.DHL"; stop; } if address :domain :is "From" ["gls-netherlands.com"] { fileinto "Bestellingen.GLS"; stop; } if address :domain :is "From" ["bol.com", "feedback.bol.com"] { fileinto "Bestellingen.bol"; stop; } if address :domain :is "From" ["coolblue.nl", "coolblue.eu"] { fileinto "Bestellingen.Coolblue"; stop; } if address :domain :is "From" ["allekabels.nl"] { fileinto "Bestellingen.Allekabels"; stop; } if address :domain :is "From" ["vikingdirect.nl", "delivery.vikingdirect.nl", "online.vikingdirect.nl"] { fileinto "Bestellingen.Viking"; stop; } if address :domain :is "From" ["123inkt.nl", "m.123inkt.nl"] { fileinto "Bestellingen.123inkt"; stop; } if address :domain :is "From" ["officecentre.nl"] { fileinto "Bestellingen.Office Centre"; stop; } if address :domain :is "From" ["sligro.nl"] { fileinto "Bestellingen.Sligro"; stop; } if address :domain :is "From" ["makro.nl"] { fileinto "Bestellingen.Makro"; stop; } if address :domain :is "From" ["smartphonehoesjes.nl"] { fileinto "Bestellingen.Smartphonehoesjes"; stop; } # ════════════════════════════════════════════════════════════════════════════ # 7. DIENSTEN / HOSTING # ════════════════════════════════════════════════════════════════════════════ if address :domain :is "From" ["strato.com", "news.strato.com", "marketingradar.strato.com"] { fileinto "Diensten.Hosting.STRATO"; stop; } if address :domain :is "From" ["transip.nl"] { fileinto "Diensten.Hosting.TransIP"; stop; } if address :domain :is "From" ["letsencrypt.org"] { fileinto "Diensten.Hosting.Lets Encrypt"; stop; } if address :domain :is "From" ["backblaze.com"] { fileinto "Diensten.Hosting.Backblaze"; stop; } # ════════════════════════════════════════════════════════════════════════════ # 8. DIENSTEN / TELECOM # ════════════════════════════════════════════════════════════════════════════ if address :domain :is "From" ["kpn.com", "campagnes.kpn.com"] { fileinto "Diensten.Telecom.KPN"; stop; } if address :domain :is "From" ["zakelijk.vodafone.nl", "vodafone.nl"] { fileinto "Diensten.Telecom.Vodafone"; stop; } # ════════════════════════════════════════════════════════════════════════════ # 9. DIENSTEN / SOFTWARE # ════════════════════════════════════════════════════════════════════════════ if address :domain :is "From" ["cursor.com"] { fileinto "Diensten.Software.Cursor"; stop; } if address :domain :is "From" ["1password.com"] { fileinto "Diensten.Software.1Password"; stop; } if address :domain :is "From" ["home.sophos.com", "cleverbridge.com"] { fileinto "Diensten.Software.Sophos"; stop; } if address :domain :is "From" ["cogsciapps.com"] { fileinto "Diensten.Software.CogSci Apps"; stop; } if address :domain :is "From" ["claude.com"] { fileinto "Diensten.Software.Claude"; stop; } if address :domain :is "From" ["microsoft365.com"] { fileinto "Diensten.Software.Microsoft Teams"; stop; } if address :domain :is "From" ["getmatter.com"] { fileinto "Diensten.Software.Matter"; stop; } if address :domain :is "From" ["mindnode.com"] { fileinto "Diensten.Software.MindNode"; stop; } if address :domain :is "From" ["papersapp.com"] { fileinto "Diensten.Software.Papers"; stop; } if address :domain :is "From" ["team.kahoot.com"] { fileinto "Diensten.Software.Kahoot"; stop; } if address :domain :is "From" ["perplexity.ai"] { fileinto "Diensten.Software.Perplexity"; stop; } # ════════════════════════════════════════════════════════════════════════════ # 10. NIEUWSBRIEVEN / LEREN # ════════════════════════════════════════════════════════════════════════════ if address :domain :is "From" ["coursera.org", "email.coursera.org", "m.mail.coursera.org", "m.learn.coursera.org"] { fileinto "Nieuwsbrieven.Leren.Coursera"; stop; } if address :domain :is "From" ["technologyreview.com", "fulfillment.technologyreview.com"] { fileinto "Nieuwsbrieven.Leren.MIT Technology Review"; stop; } if address :domain :is "From" ["mit.edu"] { fileinto "Nieuwsbrieven.Leren.MIT Open Learning"; stop; } if address :domain :is "From" ["storytellingwithdata.com"]{ fileinto "Nieuwsbrieven.Leren.Storytelling with Data"; stop; } if address :domain :is "From" ["linkingyourthinking.com"] { fileinto "Nieuwsbrieven.Leren.Nick Milo"; stop; } if anyof ( address :domain :is "From" ["evakeiffenheim.com"], header :contains "List-ID" "evakeiffenheim" ) { fileinto "Nieuwsbrieven.Leren.Eva Keiffenheim"; stop; } if address :domain :is "From" ["tiggelaar.nl"] { fileinto "Nieuwsbrieven.Leren.Ben Tiggelaar"; stop; } if address :domain :is "From" ["briankeating.com"] { fileinto "Nieuwsbrieven.Leren.Brian Keating"; stop; } if address :domain :is "From" ["beehiiv.com", "mail.beehiiv.com"] { fileinto "Nieuwsbrieven.Leren.AI Report"; stop; } if address :domain :is "From" ["elizabethbutlermd.com"] { fileinto "Nieuwsbrieven.Leren.Elizabeth Butler"; stop; } # ════════════════════════════════════════════════════════════════════════════ # 11. NIEUWSBRIEVEN / NIEUWS & VAKBLADEN # ════════════════════════════════════════════════════════════════════════════ if address :domain :is "From" ["crisismanager.nl"] { fileinto "Nieuwsbrieven.Nieuws & Vakbladen.Vakblad Crisismanager"; stop; } if address :domain :is "From" ["jaarbeurs.nl"] { fileinto "Nieuwsbrieven.Nieuws & Vakbladen.Computable"; stop; } if address :domain :is "From" ["presentation-guru.com"]{ fileinto "Nieuwsbrieven.Nieuws & Vakbladen.The Presentation Guru"; stop; } # ════════════════════════════════════════════════════════════════════════════ # 12. NIEUWSBRIEVEN / OVERIG # ════════════════════════════════════════════════════════════════════════════ if address :domain :is "From" ["lendahand.com"] { fileinto "Nieuwsbrieven.Overig.Lendahand"; stop; } if address :domain :is "From" ["thegoodroll.nl"] { fileinto "Nieuwsbrieven.Overig.The Good Roll"; stop; } # ════════════════════════════════════════════════════════════════════════════ # 13. TECHNISCH # ════════════════════════════════════════════════════════════════════════════ if anyof ( header :contains "Subject" ["DMARC", "SPF", "DKIM"], header :contains "From" "dmarc" ) { fileinto "Technisch.DMARC"; stop; } if anyof ( header :contains "Subject" ["delivery failed", "undeliverable", "mailer-daemon", "mail delivery"], address :is "From" "mailer-daemon@australius.nl" ) { fileinto "Technisch"; stop; }