Простой smtp-сервер
Не могли бы вы предложить простой SMTP-сервер с самыми базовыми API (по сути, я имею в виду, чтобы читать, писать, удалять электронную почту), которые можно запускать в Linux-окне?
Мне просто нужно преобразовать суть электронной почты в формат XML и отправить ее на другую машину.
Ответы
Ответ 1
Посмотрите на этот сервер SMTP-приемника:
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()
Он использует smtpd.SMTPServer
для отправки сообщений электронной почты в файлы.
Ответ 2
Есть действительно 2 вещи, необходимые для отправки электронной почты:
- SMTP-сервер. Это может быть либо Python SMTP Server, либо вы можете использовать GMail или ваш ISP-сервер. Скорее всего, вам не нужно запускать свои собственные.
- Библиотека SMTP - то, что отправит запрос электронной почты на SMTP-сервер. Python поставляется с библиотекой под названием smtplib, которая может сделать это для вас. Существует много информации о том, как его использовать здесь: http://docs.python.org/library/smtplib.html
Для чтения есть два варианта в зависимости от того, на каком сервере вы читаете электронную почту.
Ответ 3
Это хорошие примеры для начала.
smtpd - Примеры серверов SMTP
http://pymotw.com/2/smtpd/index.html
smtplib - клиент протокола простой почты
http://pymotw.com/2/smtplib/index.html
Ответ 4
Существует SMTP-сервер Python.
Этот модуль предлагает несколько классов для реализации SMTP-серверов. Один из них универсальная реализация do-nothing, которую можно переопределить, в то время как другие два предлагают конкретные стратегии отправки почты.
Ответ 5
Twisted имеет встроенный SMTP-сервер. См. 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()
Ответ 6
Чтобы получить Hasen script, работающий на Python 3, мне пришлось слегка его настроить:
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()
Ответ 7
Более современный подход заключается в использовании библиотеки aiosmtpd (имеется документация здесь).
Здесь вы можете найти хороший пример: https://aiosmtpd.readthedocs.io/en/latest/aiosmtpd/docs/controller.html.