Seite 1 von 1

Strg-D abfangen

Verfasst: Donnerstag 21. Juli 2005, 08:57
von nbkr
Hallo,

ich schreibe mir gerade einen Mailinglistenserver in Python. Soweit läuft die Kiste schon als Daemon, aber ich hab noch ein Problem die Mails an den Server zu liefern. Ich will dass der Benutzer bzw. ein Script eine Telnetverbindung zum Server aufmacht, die Mail eingibt und die Eingabe mit STRG-D beendet. Telnetverbindung, Benutzerauthentifizierung usw, läuft schon, nur das STRG-D klappt nicht. Ich hatte schon überlegt, dass man einfach ein bestimmtes Zeichen als "Ende" Symbol ausmacht, aber wenn das in der Mail vorkommt funktioniert es nicht. Deshalb dachte ich STRG-D wäre besser.

Nur wie sende ich ich mit Python STRG-D und wie lese ich es, es ist ja kein druckbares Zeichen.

Gruß
nbkr

Verfasst: Donnerstag 21. Juli 2005, 09:31
von Clython
Laut meinen Nachforschungen auf Google gibt es für das End-of-File keine Escape Sequenz (wie z.B. \n für Newline). Das liegt wohl daran, dass man im Python Interpreter EOF als Programmende benutzt.

Als alternative musst du halt selber eine Escape-Sequenz definieren, die bestimmt nicht in der Mail vorkommen wird.

Verfasst: Donnerstag 21. Juli 2005, 10:11
von nbkr
Danke für die Antwort. Dann werde ich es wohl so machen müssen, dass der Client eine Art Boundary liefert bevor er die Mail absetzt. Da kann ich ja vorher prüfen ob das in der Mail vorkommt.

Re: Strg-D abfangen

Verfasst: Sonntag 24. Juli 2005, 14:25
von Gast
nbkr hat geschrieben:Ich will dass der Benutzer bzw. ein Script eine Telnetverbindung zum Server aufmacht, die Mail eingibt und die Eingabe mit STRG-D beendet. Telnetverbindung, Benutzerauthentifizierung usw, läuft schon, nur das STRG-D klappt nicht.

Nur wie sende ich ich mit Python STRG-D und wie lese ich es, es ist ja kein druckbares Zeichen.
SMTP (das Protokoll, das alle Mailserver sonst für Mailtransport verwenden) benutzt einen Punkt auf einer Zeile für sich als 'end of data indicator':

http://www.faqs.org/rfcs/rfc2821.html

'The mail data is terminated by a line containing only a period, that
is, the character sequence "<CRLF>.<CRLF>" '

(CRLF ist "\r\n" als Zeilenende bei SMTP)

Grüße
Michael

Verfasst: Sonntag 24. Juli 2005, 15:50
von ProgChild
Hi,
ich denke, dass ich eine Bessere lösung für dein Problem hab. Du musst einfach nur stdin bis zum EOF einlesen. Ganz einfach:

Code: Alles auswählen

#!/usr/bin/env python
import sys

print "Gib einen Text ein:"
str = sys.stdin.read()

print 
print "Deine Eingabe"
print "============================"
print str
:wink:

Verfasst: Montag 25. Juli 2005, 10:59
von nbkr
Hallo,

danke für die Tipps. Das beim SMTP Protokoll die Mails mit . beendet werden wusste ich schon, allerdings will ich ja keinen Mailserver schreiben, sondern einfach ein Mailinglistensystem, welches als Server läuft, also das Senden der Mails an die Mitglieder der Liste übernimmt, aber auch mit einem Webinterface kommunzieren kann. Insofern ist das das SMTP Protokoll für mich nur am Rande wichitg.

Bis EOF zu lesen dürfte nicht wirklich funktionieren, da der Client ja nach dem Eingeben der Mail noch weitere Befehle absetzen kann (und sei es nur ein QUIT um die Verbindung zu beenden). Das würde dann auch in die Mail mit reinrutschen.

Das Abliefern der Mail funktioniert inzwischen recht gut, nur mit dem Analysieren kämpfe ich noch ein wenig, ich bekomme den From Header nicht ausgelesen. Aber dazu vielleicht später mehr.

Verfasst: Montag 25. Juli 2005, 12:56
von ProgChild
nbkr hat geschrieben: Bis EOF zu lesen dürfte nicht wirklich funktionieren, da der Client ja nach dem Eingeben der Mail noch weitere Befehle absetzen kann (und sei es nur ein QUIT um die Verbindung zu beenden). Das würde dann auch in die Mail mit reinrutschen.
Das verstehe ich jetzt nicht. Wenn du das Script oben mal unter read_text.py abspeicherst und dann folgendes in deine Shell eingibst.

Code: Alles auswählen

$ echo "Hallo" | python read_text.py
Dann kommt als Ausgabe:
Gib einen Text ein:

Deine Eingabe
============================
Hallo
Wenn du also ein Script hast, das per Shellaufruf eine Mail an alle Mitglieder deiner Mailingliste verschicken soll, geht es nicht einfacher. Andere Optionen kannst du z.b. über die Komandozeile einstellen lassen.

Verfasst: Montag 25. Juli 2005, 13:03
von nbkr
Da liegt wohl ein Mißverständnis vor. Der Server bekommt die Mails nicht über STDIN gepipet. Der Server macht einen Socket auf und wartet auf Clients. Die Clients können unterschiedlich sein, eine Weboberfläche, eine spezieller GUI Client, etc.

Diese Clients verbinden sich mit dem Server, authentifizieren sich, liefern die Mail, machen was immer sie wollen, loggen sich wieder aus.

Insofern hilft mir das EOF in dem Fall nichts. Wo es was hilft ist, wenn ich einen Connector zu Postfix/Sendmail/Procmail, ö.ä. schreibe.

Der Connector wird dann die Mail per Pipe von Procmail bekommen, sich mit dem Server verbinden und die Mail abliefern. Da funktioniert das Einlesen von EOF, aber eben nicht beim Server direkt.

Man könnte noch anbringen, dass es besser wäre wenn der Server direkt auf Pipes reagieren würde, das funktioniert aber nicht, das der Server im Daemonmodus (also im Hintergrund läuft), da dürfte das Pipen nicht direkt gehen. Außerdem ist man so ein wenig flexibler was die Clients angeht.