Samstag, 9. November 2013, 12:43 Uhr

E-Mail-Adressen aus einer Textdatei auslesen und mit imapfilter in einen Unterordner verschieben

Seit ich ein Smartphone besitze, verschiebe ich mittels dem alle 5 Minuten per cron-Job auf meinem privaten Server laufenden imapfilter unwichtige E-Mails in Unterordner, damit ich mich auf die wesentlichen Mails konzentrieren kann.

Der grösste Unterordner in meinem privaten E-Mail-Account heisst „_UNPERSOENLICH“ und enthält all den Newsletter-Plunder, welchen man die Woche hindurch so zugeschickt erhält. Die imapfilter-Regel, welche die treffenden E-Mail-Absender herausfiltert und dorthin verschiebt, ist mittlerweile auf über 60 Zeilen (d.h. 60 Absenderadressen) angewachsen. In der imapfilter-Konfigurationsdatei sieht dies dann in etwa so aus:

...
messages = mbox.INBOX:contain_from('domain1.ch') +
           mbox.INBOX:contain_from('domain2.org') +
           mbox.INBOX:contain_from('user@domain3.com')
           ...
           mbox.INBOX:contain_from('userxy@domain112.com')
messages:move_messages(mbox['_UNPERSOENLICH'])
...

Heute habe ich mich dazu entschieden, diese E-Mail-Adressen aus der Konfigurationsdatei herauszulösen, in einer Textdatei zusammenzufassen (je eine E-Mail-Adresse pro Zeile) und dann imapfilter diese Textdatei einlesen zu lassen und die Absenderadressen in einer Schleife in meiner INBOX zu suchen und gegebenenfalls in den Unterordner zu verschieben.

Äusserst hilfreich war dabei die Hilfe, wie man Lua zu einem solchen Vorhaben bewegt (imapfilter setzt auf Lua auf): File Read In Lua?

Basierend auf dieser Antwort habe ich folgenden Code in meine imapfilter-Konfigurationsdatei aufgenommen:

...
function file_exists(file)
  local f = io.open(file, "rb")
  if f then f:close() end
  return f ~= nil
end

function lines_from(file)
  if not file_exists(file) then return {} end
  lines = {}
  for line in io.lines(file) do 
    lines[#lines + 1] = line
  end
  return lines
end
...
-- Unpersoenlich
local file = '../filters/private-unpersoenlich.txt'
local lines = lines_from(file)

for key,email in pairs(lines) do
--  print('line[' .. key .. ']', email)
  messages = mbox.INBOX:contain_from(email)
  messages:move_messages(mbox['_UNPERSOENLICH'])
end
...

Im Ordner oberhalb desjenigen Ordners, welcher die imapfilter-Konfigurationsdateien enthält (für jeden meiner Accounts existiert eine solche Konfigurationsdatei), gibt es nun einen Ordner filters, welcher momentan die Datei private-unpersoenlich.txt enthält.

Mit den obengenannten Funktionen und Konstrukten wird die Textdatei ausgelesen und in eine Lua-Tabelle (in anderen Programmiersprachen wohl als Array bezeichnet) gespeichert (lines_from(). Anschliessend gehe ich mit einem for-Loop durch die Tabelle, filtere den Absender (contain_from()) und verschiebe treffende E-Mail-Nachrichten in den Ordner „_UNPERSOENLICH“ (move_messages(mbox['_UNPERSOENLICH'])).

Tags: , , , , , , , ,
Labels: Linux

Ein Kommentar Kommentare

Liechti sagt:

Kennst du Sieve? Das wäre wohl aus meiner Sicht einfacher, benutzerfreundlicher und effezienter als „imapfilter“ über einen Cronjob.

Kommentar erfassen