Mail-Programm-Beispiel

Fionn Behrens Fionn.Behrens at unix-ag.org
Sun Jul 26 02:42:30 EDT 1998


Status: RO

Hi TTie269993 at aol.com,

on 25-Jul-98 you wrote:

> Ich suche nach einem Mailprogramm, daß mit Python erstellt ist und das man
> nachvollziehen kann. Vorallem den Zusammenhang von Sockets mit Mail
> versenden.
> 
> Weiss irgendjemand ein solches Programm.

ja.

(das wäre im Prinzip schon die Antwort auf Deine Frage, aber ich nehme an,
 Du willst es auch haben :-)

Ich muß zugeben, ich war immer zu faul, Mail selber auf Socketebene zu
versenden. Darum nutzen alle meine Programme sendmail, welches sich dann
ja automatisch um korrekte Header und die gesamte Abwicklung kümmert.
Ein entsprechender Codeschnipsel:

#----------------------------------------------------------------------------

from posix import popen

  try:
    mail = popen("sendmail -t","w")
    mail.write("To: "+zieladresse+"\n")
#    mail.write("Reply-To: "+replyaddr+"\n")
    mail.write("Subject: "+mail_subject+"\n\n")
    mail.write(mailtext)
    mail.close()
  except:
    print "Mail pipe to"+zieladresse+"NOT open!"

#----------------------------------------------------------------------------

Falls Du natürlich kein sendmail oder gar kein Betriebssystem hast, also
möglicherweise mit DOS oder WinDOS geschlagen bist, dann mußt Du wohl oder
übel auf Socken zurückgreifen. Inwieweit das Sockenhandling ähnlich den
Posix-Socken ist, weiß ich natürlich nicht, aber das Öffnen eines Sockets
setze ich mal als simple Übung voraus. Dann ist es am einfachsten, die
stattfindende Kommunikation mit dem SMTP RFC in der einen Hand und telnet
an der andern zu Fuß durchzuspielen. Ich habe das mal mit NNTP gemacht,
es geht relativ fix. Die wichtigsten Zeilen hier:

#----------------------------------------------------------------------------

  drain = socket(AF_INET, SOCK_STREAM)
  try:
    drain.connect("localhost",119)  #### hier statt dessen den smtp port ####
  except error, msg:
    print "Connection to nntpserver failed:",error,msg
    exit(1)

  print "connected to server."

  get_reply(drain,"200") #### alle replies bei smtp sind numerisch gekenn-
                         #### zeichnet, es reicht, jeweils auf die 
[...]                    #### passenden nummern zu warten.

    drain.send("POST\n") 
    get_reply(drain,"340")
    drain.send(header)
    drain.send("Message-ID: "+msgid)
    if lastpost >0:
      drain.send("Supersedes: "+lastid+"\n")
    drain.send("X-Newsreader: File posted with "+VERSION+"\n")
    drain.send("Lines: "+str(lines)+"\n\n")
    drain.send(body+signature)
    drain.send(".\n")

#           -----------------------------------------------------

def get_reply(socket,reply):
  sfile = socket.makefile()
  out = ""
  timeout = 5
  match = 0
  start = int(time())

  while not match:
    r,w,x = select([sfile],[],[],1)
    if r != []:
      line = r[0].readline()
      out = out + line
      if regex.match(reply,line) > -1:
        return
    elif int(time()) - start > timeout:
      print "select timeout waiting for",reply
      print "output until here was:\n",out
      stdout.flush()
      exit(1)

#----------------------------------------------------------------------------

Die vorgestellte Lösung ist supersimpel und wenig error-proof, zeigt aber
wie es geht und läßt Raum für eigene Verbesserungen.


Gruß,
        Fionn

---
                         PGP-Key available on request

______________________________________________________________
   python-de          the German Python mailing list
send messages to:   <mailto:python-de at solar.skyport.net>
list manager: <mailto:owner-python-de at solar.skyport.net>
______________________________________________________________




More information about the Python-de mailing list