Strg-D abfangen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
nbkr
User
Beiträge: 28
Registriert: Montag 30. Mai 2005, 11:32

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
Clython
User
Beiträge: 151
Registriert: Samstag 21. August 2004, 13:58
Wohnort: Schweiz, BE-2500

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.
nbkr
User
Beiträge: 28
Registriert: Montag 30. Mai 2005, 11:32

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.
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
ProgChild
User
Beiträge: 210
Registriert: Samstag 9. April 2005, 10:58
Kontaktdaten:

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:
nbkr
User
Beiträge: 28
Registriert: Montag 30. Mai 2005, 11:32

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.
ProgChild
User
Beiträge: 210
Registriert: Samstag 9. April 2005, 10:58
Kontaktdaten:

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.
nbkr
User
Beiträge: 28
Registriert: Montag 30. Mai 2005, 11:32

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.
Antworten