Emailserver (POP3, SMTP und IMAP)

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
kieselsteini
User
Beiträge: 3
Registriert: Donnerstag 3. September 2009, 10:39

Hallo liebes Forum und liebe Python Gemeinde.

Ich habe vor einer Woche mit Python angefangen zu programmieren, da ich mich mal von den "Zwängen" der Java EE Programmierung befreien wollte.

Als kleine Einstiegsprojekt habe ich mich an einen Emailserver gewagt, der sowohl als POP3 als auch als SMTP Server funktioniert. IMAP ist leider noch sehr in den Kinderschuhen da ich mich a) mit Python noch nicht recht auskenne und b) IMAP ein Drecks-Protokoll ist (sorry *g).

Es würde mich freuen, wenn ein paar Python Profis sich das mal ansehen würden und ihren Senf dazu abgeben würden. Is das "pythonic", verstoße ich gegen ein paar "goldene Regeln" der Python Programmierung? Was würden die Pros besser machen?

Natürlich freue mich über jede Zeile Code die den Server verbessert. Zumindest auf meinem Test-Rechner lief dieser Code ~48h ohne Probleme durch wobei er Mails von 3 gut besuchten Mailinglisten bekam.

Hier ist der Code zu finden: http://pastie.org/604334

Vielen Dank und ich freue mich schon auf die Antworten :D
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Ich habe es nur ganz grob überflogen, vom Code her sieht es ganz vernünftig aus. Du solltest allerdings die ganzen if/elif-Kaskaden durch Dictionaries ersetzen. Deine Funktionen sind so lang, die kann doch kein Mensch mehr überblicken ;-)

Für die ganzen "self.outlines.append"-Aufrufe solltest du dir vielleicht mal eine Methode basteln ;-)

Auch das Starten der verschiedenen Serverarten kannst du mit einem Dictionary erschlagen. Du brauchst auch keine drei "start_..."-Funktionen, das ist mein einer einzigen erledigt.

Das du auch Adressen wie ".....@............-......de" für gültig befindest weißt du wahrscheinlich selber.

Sebastian
Das Leben ist wie ein Tennisball.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Desweiteren wäre ein Pastebin mit Syntax-Highlighting zu emfpehlen - wie z.B. paste.pocoo.org :-)
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

Coole Idee 8)

Allerdings finde ich diese riesigen if Verschachtelungen echt grausam zu lesen. Evt. wäre ja da eine Lösung basierend auf Dictionaries besser. Grade diese command == Geschichte bietet sich ja dazu an.

Außerdem finde ich es nicht gut, die Statuscodes (250 hello %s, nice to meet you, etc.) fest im Quelltext zu schreiben, da würde ich etwas ausserhalb bevorzugen. Keine Ahnung, wie da der Standard ist, aber dann könnte man auch Meldungen auf Deutsch oder so versenden.

Aber das ist nur meine Meinung ...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

frabron hat geschrieben:Keine Ahnung, wie da der Standard ist, aber dann könnte man auch Meldungen auf Deutsch oder so versenden.
Was bringen eingedeutschte Meldungen die eh von keinem gelesen werden?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

Wenn man ständig Kunden aus drei oder mehr Ländern mit unterschiedlichen Sprachen hat, ist das irgendwann ein Reflex, alle Strings so vorzubereiten, dass sie übersetzt werden können :) Immer schön die Strings aus der Programmlogik extrahieren, so dass sie bei Bedarf geändert werden können.

Ob das jetzt hier Sinn macht, kann ich natürlich nicht sagen, dazu kenne ich mich nicht genug mit Mailprotokollen aus. Gerade bei der SMTP Klasse fiel mir das aber ins Auge ...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Zu bedenken ist, dass die Texte zum Wire-Protokoll gehören und, obzwar da Variationen AFAIR erlaubt sind würde ich davon abraten etwas anderes als ASCII auszugeben, da SMTP nicht garantiert 8-Bit safe ist - hängt immer ab was man da für eine Gegenstelle hat.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
kieselsteini
User
Beiträge: 3
Registriert: Donnerstag 3. September 2009, 10:39

Hallo Zusammen.

Erstmal vielen Dank für eure Ratschläge und Hilfestellungen. Ich habe gleich mal gesucht was Dicts sein sollen und dann gleich mal den Mailserver dahingehend aufgeräumt. Keine langen if/else Kaskaden mehr, sondern schön alles in commands Dictionaries untergebracht.

Zur Mehrsprachigkeit der Server-Antworten: Das ist eigentlich nicht notwendig, weil der Benutzer im Regelfall diese Meldungen nicht zu Gesicht bekommt und sie ganz eigentlich auch komplett weggelassen werden könnten. Die Mailclients werten bei SMTP eh nur die Statuscodes aus und bei POP3 die +OK / -ERR Antworten.

Das Problem mit der Emailadresse sehe ich nicht (bin auch kein Regexp Profi). Für mein Empfinden werden da nur offizielle Mailadressen akzeptiert. Für bessere Regexp Vorschläge bin ich offen :)

So jetzt noch eine Frage an die Python-Profis. Wenn ich jetzt eine Relay-Funktionalität einbauen möchte (SMTP-AUTH is ja schon dafür implementiert), dann benutze ich die smtplib die in Python schon mit an Bord ist oder? Da ja der Relay einer Nachricht auch noch dauern kann, sollte ich das in Threads auslagern ?! Ist ein Threading Modell oder ein Forking Modell besser? Habe gelesen, dass Python bei Threading Probleme mit Mehrkernprozessoren hat bzw. diese nicht gut ausnutzt.

So. Zu guter letzt noch der aktuelle Code: http://paste.pocoo.org/show/137942/
Sorry für das alte pastebin, aber Opera hat mit pocoo Probleme. Konnte nur mim Feuerfuchs den Code absetzen.

Freu mich auf weitere Kommentare
Zuletzt geändert von kieselsteini am Freitag 4. September 2009, 10:23, insgesamt 1-mal geändert.
Benutzeravatar
tiax
User
Beiträge: 152
Registriert: Samstag 23. Juli 2005, 17:28
Kontaktdaten:

Zum Thema Mailadressen-prüfendes Regexp: Probier's gar nicht erst. Da kann man so viele Fälle übersehen, die wider erwarten doch gültig sind. Etwa Sonderzeichen, Kommentare, exotische TLDs wie .aero, etc ;)
Ne invoces expellere non possis
[url=xmpp://florian@florianheinle.de]xmpp:florian@florianheinle.de[/url]
saqdefaq
User
Beiträge: 3
Registriert: Dienstag 29. September 2009, 17:53

Zum Thema Email-Adresse kann ich das hier empfehlen: Klick mich!
Antworten