2010-04-22 17 views
14

¿Podría sugerir un servidor SMTP simple con las API más básicas (por ejemplo, leer, escribir, eliminar correo electrónico) que podrían ejecutarse en un linux box? Solo necesito convertir el meollo del correo electrónico en formato XML y FTP a otra máquina.un servidor smtp simple

+0

Algunas lecturas interesantes sobre el envío de correo electrónico con el código: http://www.codinghorror.com/blog/2010/04/so-youd-like-to-send-some-email-through-code.html – tgray

Respuesta

27

Tome un vistazo a este SMTP sink server:

from datetime import datetime 
import asyncore 
from smtpd import SMTPServer 

class EmlServer(SMTPServer): 
    no = 0 
    def process_message(self, peer, mailfrom, rcpttos, data): 
     filename = '%s-%d.eml' % (datetime.now().strftime('%Y%m%d%H%M%S'), 
       self.no) 
     f = open(filename, 'w') 
     f.write(data) 
     f.close 
     print '%s saved.' % filename 
     self.no += 1 


def run(): 
    foo = EmlServer(('localhost', 25), None) 
    try: 
     asyncore.loop() 
    except KeyboardInterrupt: 
     pass 


if __name__ == '__main__': 
    run() 

Se utiliza para volcar smtpd.SMTPServer mensajes de correo electrónico a los archivos.

+0

¡ESTO ES INCREIBLE! – fixxxer

+0

Gracias, soy autor del servidor de sumidero SMTP. Acabo de aprender de @zero que el comando es más simple para la prueba: 'sudo /usr/lib/python2.4/smtpd.py -n -c DebuggingServer localhost: 25' – twinsant

+2

hmm, modifíquelo con:' sudo python -m smtpd -c DebuggingServer -n localhost: 25' – twinsant

1

Hay Python SMTP server.

Este módulo ofrece varias clases para implementar servidores SMTP. Una es una implementación genérica de que no se puede hacer, que se puede anular, mientras que las otras dos ofrecen estrategias específicas de envío de correo.

+1

Sí, Lo sé. Pero, ¡no puedo entender cómo leer el correo electrónico con esa lib! ¿Una forma de resolver este problema, quizás? – fixxxer

+0

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. –

16

En realidad, hay 2 cosas necesarias para enviar un correo electrónico:

  • Un servidor SMTP - Esto puede ser el Python SMTP Server o se puede usar Gmail o el servidor de su proveedor de Internet. Lo más probable es que no necesites ejecutar el tuyo.
  • Una biblioteca SMTP: algo que enviará una solicitud de correo electrónico al servidor SMTP. Python se envía con una biblioteca llamada smtplib que puede hacer eso por usted. Hay toneladas de información sobre cómo usarlo aquí: http://docs.python.org/library/smtplib.html

Para leer, hay dos opciones dependiendo del servidor del que está leyendo el correo electrónico.

0

Para conseguir el guión de Hasen trabajando en Python 3 que tenía que ajustar ligeramente:

from datetime import datetime 
import asyncore 
from smtpd import SMTPServer 

class EmlServer(SMTPServer): 
    no = 0 
    def process_message(self, peer, mailfrom, rcpttos, data, **kwargs): 
     filename = '%s-%d.eml' % (datetime.now().strftime('%Y%m%d%H%M%S'), 
      self.no) 
     print(filename) 
     f = open(filename, 'wb') 
     f.write(data) 
     f.close 
     print('%s saved.' % filename) 
     self.no += 1 

def run(): 
    EmlServer(('localhost', 25), None) 
    try: 
     asyncore.loop() 
    except KeyboardInterrupt: 
     pass 

if __name__ == '__main__': 
    run() 
1

Twisted tiene incorporado un servidor SMTP. Ver http://twistedmatrix.com/documents/current/mail/examples/index.html

# Copyright (c) Twisted Matrix Laboratories. 
# See LICENSE for details. 

# You can run this module directly with: 
# twistd -ny emailserver.tac 

""" 
A toy email server. 
""" 
from __future__ import print_function 

from zope.interface import implementer 

from twisted.internet import defer 
from twisted.mail import smtp 
from twisted.mail.imap4 import LOGINCredentials, PLAINCredentials 

from twisted.cred.checkers import InMemoryUsernamePasswordDatabaseDontUse 
from twisted.cred.portal import IRealm 
from twisted.cred.portal import Portal 



@implementer(smtp.IMessageDelivery) 
class ConsoleMessageDelivery: 
    def receivedHeader(self, helo, origin, recipients): 
     return "Received: ConsoleMessageDelivery" 


    def validateFrom(self, helo, origin): 
     # All addresses are accepted 
     return origin 


    def validateTo(self, user): 
     # Only messages directed to the "console" user are accepted. 
     if user.dest.local == "console": 
      return lambda: ConsoleMessage() 
     raise smtp.SMTPBadRcpt(user) 



@implementer(smtp.IMessage) 
class ConsoleMessage: 
    def __init__(self): 
     self.lines = [] 


    def lineReceived(self, line): 
     self.lines.append(line) 


    def eomReceived(self): 
     print("New message received:") 
     print("\n".join(self.lines)) 
     self.lines = None 
     return defer.succeed(None) 


    def connectionLost(self): 
     # There was an error, throw away the stored lines 
     self.lines = None 



class ConsoleSMTPFactory(smtp.SMTPFactory): 
    protocol = smtp.ESMTP 

    def __init__(self, *a, **kw): 
     smtp.SMTPFactory.__init__(self, *a, **kw) 
     self.delivery = ConsoleMessageDelivery() 


    def buildProtocol(self, addr): 
     p = smtp.SMTPFactory.buildProtocol(self, addr) 
     p.delivery = self.delivery 
     p.challengers = {"LOGIN": LOGINCredentials, "PLAIN": PLAINCredentials} 
     return p 



@implementer(IRealm) 
class SimpleRealm: 
    def requestAvatar(self, avatarId, mind, *interfaces): 
     if smtp.IMessageDelivery in interfaces: 
      return smtp.IMessageDelivery, ConsoleMessageDelivery(), lambda: None 
     raise NotImplementedError() 



def main(): 
    from twisted.application import internet 
    from twisted.application import service  

    portal = Portal(SimpleRealm()) 
    checker = InMemoryUsernamePasswordDatabaseDontUse() 
    checker.addUser("guest", "password") 
    portal.registerChecker(checker) 

    a = service.Application("Console SMTP Server") 
    internet.TCPServer(2500, ConsoleSMTPFactory(portal)).setServiceParent(a) 

    return a 

application = main()