2010-04-22 7 views
14

Pourriez-vous s'il vous plaît suggérer un serveur SMTP simple avec les API très basiques (je veux dire par très basique, lire, écrire, supprimer e-mail) qui pourrait être exécuté sur une machine Linux? J'ai juste besoin de convertir le crux de l'email en format XML et le FTP sur une autre machine.un simple serveur smtp

+0

Quelques lectures intéressantes sur l'envoi de courriels avec le code: http://www.codinghorror.com/blog/2010/04/so-youd-like-to-send-some-email-through-code.html – tgray

Répondre

27

Jetez un oeil à cette 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() 

Il utilise smtpd.SMTPServer pour vider des e-mails aux fichiers.

+0

C'est génial! – fixxxer

+0

Merci, je suis l'auteur du serveur récepteur SMTP. Je viens d'apprendre de @zero que la commande est plus simple pour le test: 'sudo /usr/lib/python2.4/smtpd.py -n -c DebuggingServer localhost: 25' – twinsant

+2

hmm, modifiez-le avec:' sudo python -m smtpd -c DebuggingServer -n localhost: 25' – twinsant

1

Il est Python SMTP server.

Ce module offre plusieurs classes pour implémenter des serveurs SMTP. L'une est une implémentation générique à ne rien faire, qui peut être surchargée, alors que les deux autres offrent des stratégies spécifiques d'envoi de courrier.

+1

Oui, Je sais.Mais, je suis incapable de comprendre comment lire le courrier électronique avec cette lib! Un moyen de contourner ce problème, peut-être? – fixxxer

+0

Bien que ce lien puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et de fournir le lien pour référence. Les réponses à lien uniquement peuvent devenir invalides si la page liée change. –

16

Il y a vraiment 2 choses nécessaires pour envoyer un email:

  • Un serveur SMTP - Cela peut être le Python SMTP Server ou vous pouvez utiliser GMail ou le serveur de votre fournisseur d'accès Internet. Les chances sont que vous n'avez pas besoin de courir le vôtre.
  • Une bibliothèque SMTP - Quelque chose qui va envoyer une demande par courriel au serveur SMTP. Python est livré avec une bibliothèque appelée smtplib qui peut le faire pour vous. Il y a des tonnes d'informations sur la façon de l'utiliser ici: http://docs.python.org/library/smtplib.html

Pour la lecture, il y a deux options en fonction de ce serveur que vous lisez l'e-mail de.

0

Pour obtenir le script de Hasen travailler en Python 3 je devais modifier légèrement:

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 a une commande interne du serveur SMTP. Voir 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()