Leiten Sie alle eingehenden E-Mails an ein Python-Skript um

Leiten Sie alle eingehenden E-Mails an ein Python-Skript um

Ich möchte alle eingehenden E-Mails *@example.commit einem auf meinem Server laufenden Python-Skript verwalten, das verschiedene Aufgaben übernimmt.

  • Ich habe bereits einen DNS-MX-Eintrag für erstellt example.comund ihn an meinen Server weitergeleitet:

    mx.example.com                   MX     mailforwarder.example.com
    mailforwarder.example.com        A      1.2.3.4
    
  • Ich habe sowohl mit Postfix als auch mit Exim viel herumprobiert und nichts hat funktioniert. Daher habe ich sie alle entfernt: apt-get remove postfixund apt-get remove exim4. Jetzt bin ich bereit, mit einer Neuinstallation von einem der beiden zu beginnen (welches würde die kürzeste Lösung für diese spezielle Aufgabe bieten?)

Was sind die wichtigsten Schritte, um alle eingehenden E-Mails an ein Python-Skript weiterzuleiten *@example.com?(einschließlich: Dem MTA mitteilen, dass er E-Mails von außerhalb des Servers, aus dem gesamten Internet usw. akzeptieren soll.)

Antwort1

procmailgilt als problematischvon Philip Guenther (und ist in diesem Fall möglicherweise nutzlos, da .forwardDateien oder Ähnliches die E-Mails direkt an Ihr Programm senden und die somit unnötige Komplexität von überspringen können procmail).

Zusammenfassung: Löschen Sie den Procmail-Port. Der Code ist nicht sicher und sollte nicht als Grundlage für weitere Arbeiten verwendet werden.

Wie einige vielleicht wissen, war ich von Ende der 1990er bis 2001 der Upstream-Betreuer von Procmail.

Daher ist möglicherweise eine andere Lösung ratsam; dies hängt vom Mail Transport Agent (MTA) ab. Eine andere Möglichkeit wäre, den MTA für die Zustellung an eine lokale Datei oder IMAP zu verwenden und diese Datei oder IMAP dann von Ihrem Programm analysieren zu lassen. Dies hat den Vorteil, dass weiterhin E-Mails angenommen und irgendwo gespeichert werden; was passiert, wenn Ihr Programm fehlerhaft ist oder aus anderen Gründen nicht ausgeführt werden kann? Das ist weniger ein Problem als bei der Live-E-Mail-Zustellung ...

Exim

Wahrscheinlich kopieren Sie entweder die Sendmail- .forwardMethode oder finden heraus, wie man das in Eximese richtig macht. (Ich habe abgebrochen, weil es zu lange dauerte, die Exim-Dokumente zu durchforsten.) Es gibtelspywenn Sie das Scannen während der SMTP-Zeit im MILTER-Modus durchführen möchten ...

Postfix

https://serverfault.com/questions/258469/how-to-configure-postfix-to-pipe-all-incoming-email-to-a-script#258491

Meine Güte, das scheint lang und kompliziert zu sein.

Sendmail

Setzen Sie einen mailertableEintrag, um alle Mails für die Domäne (und .domainggf. für Subdomänen) an einen lokalen Benutzer weiterzuleiten, hierjdoe

example.com     local:jdoe
.example.com    local:jdoe

und richten Sie dann eine .forwardDatei für diesen Benutzer ein, um den erforderlichen Code auszuführen

$ cat ~jdoe/.forward
"|/etc/smrsh/process"
$ 

Das könnte so einfach sein wie

$ cat /etc/smrsh/process
#!/bin/sh
cat >> /home/jdoe/allmails
$ 

weil die E-Mails über die Standardeingabe eingespeist werden (das kann schlecht sein, wenn mehrere Instanzen davon processgleichzeitig ausgeführt werden; vermutlich behandelt Ihr eigentlicher Code solche Race Conditions oder ist anderweitig idempotent ... richtig?). Diese Methode kann auch für jeden anderen MTA funktionieren, der die Weiterleitungssyntax von Sendmail kopiert, vorausgesetzt, Sie können den MTA dazu bringen, alle E-Mails an einen bestimmten Benutzer umzuleiten.

Dies setzt voraus , dass mailertabledie Unterstützung aktiviert und confFORWARD_PATHeingestellt ist, dass Sendmail den Code ausführen darf (beachten Sie smrsh(8)jedoch, dass einige Anbieter das Verzeichnis ändern könnten, ohne die Dokumentation zu aktualisieren (Ausführen strings /the/path/to/smrsh | fgrep /könnte hilfreich sein)) und dass etwas wie Selinux nicht ebenfalls Probleme verursacht.

Eine weitere Option für Sendmail ist die Verwendung eines MILTER wieMIMEDefangund führen Sie dort die erforderliche Geschäftslogik aus. (Verschiedene andere MTAs unterstützen MILTER oder haben etwas Ähnliches.)

Simple Mail Transfer Protocol-Daemon (OpenBSD)

Aus einem Blick aufsmtpd.conf(5)(aktualisiert für Änderungen in OpenBSD 6.4)

action "mymda" mda "/path/to/your/command" user jdoe
match from any for domain example.com action "mymda"

Antwort2

Dies schien eine recht häufig gestellte Frage zu sein... Ich fand, dass dies bereits beantwortet wurde, was ich auch vorschlagen würde. Procmail ist ein lokaler Zustelldienst... wasIch findebedeutet, dass etwas die E-Mail bereits vom Netzwerk empfangen und an procmail zur lokalen Zustellung oder anderen Filterung übergeben hat. In diesem Fall wäre das Postfix. Nachdem ich Postfix in der Produktion eingesetzt habe, weiß ich, dass es ein solides und sehr flexibles Tool für die benutzerdefinierte E-Mail-Verarbeitung ist.

https://serverfault.com/questions/258469/how-to-configure-postfix-to-pipe-all-incoming-email-to-a-script#258491

Antwort3

Mir gefällt der Mail-in-a-Box-Stack, der Postfix und Dovecot verwendet. Sobald Sie diese installiert haben, können Sie Folgendes tun, um beim Empfang von E-Mails an bestimmte Adressen ein Skript auszuführen:

  1. Erstellen Sie Ihr Skript (z. B. mail_processor.py) im /usr/lib/dovecot/sieve-execute/Verzeichnis:

    #!/usr/bin/python3
    from sys import stdin
    with open('/var/log/mail_processor.log', 'a') as logfile:
        for line in stdin:
            print(line.rstrip(), file=logfile)
    
    • Stellen Sie sicher, dass Ihr Skript und Ihre Zieldateien über die richtigen Berechtigungen verfügen:

      $ chmod +rx /usr/lib/dovecot/sieve-execute/mail_processor.py
      $ chmod 0777 /var/log/mail_processor.log
      
  2. Aktivieren Sie das sieve_extprogramsPlugin:

    • Ändern Sie \etc\dovecot\conf.d\90-sieve.confden Plugin-Abschnitt von mit Folgendem:

      sieve_extensions = +vnd.dovecot.execute
      sieve_plugins = sieve_extprograms
      sieve_execute_bin_dir = /usr/lib/dovecot/sieve-execute
      
    • Taubenschlag neu laden:

      $ service dovecot restart
      
  3. Siebfilter erstellen (z. B. in Roundcube gehe zu settings-> filters-> actions-> edit filter set):

    require ["vnd.dovecot.execute"];
    # rule:[mail processing]
    if true
    {
        execute :pipe "mail_processor.py";
    }
    

mail_processor.pyJetzt wird die gesamte E-Mail, die an ein Postfach mit diesem Siebfilter zugestellt wird , zur Bearbeitung weitergeleitet .

Pigeonhole Sieve: Extprograms-Pluginals Referenz

verwandte Informationen