一个简单的SMTP服务器(用Python)

fix*_*xer 22 python smtp

你能建议一个简单的SMTP服务器,它有非常基本的API(非常基本的意思是读,写,删除电子邮件),可以在linux机器上运行吗?我只需要将电子邮件的关键字转换为XML格式并将其FTP到另一台机器.

has*_*sen 41

看一下这个SMTP sink服务器:

from __future__ import print_function
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():
    # start the smtp server on localhost:1025
    foo = EmlServer(('localhost', 1025), None)
    try:
        asyncore.loop()
    except KeyboardInterrupt:
        pass


if __name__ == '__main__':
    run()
Run Code Online (Sandbox Code Playgroud)

它用于smtpd.SMTPServer将电子邮件转储到文件.

  • 谢谢,我是 SMTP 接收器服务器的作者。我刚刚从@zero那里了解到该命令对于测试来说更简单:`sudo /usr/lib/python2.4/smtpd.py -n -c DebuggingServer localhost:25` (4认同)
  • 嗯,调整它:`sudo python -m smtpd -c DebuggingServer -n localhost:25` (3认同)

Chr*_*ail 21

发送电子邮件确实需要2件事:

  • SMTP服务器 - 可以是Python SMTP服务器,也可以使用GMail或ISP的服务器.您可能不需要自己运行.
  • SMTP库 - 将向SMTP服务器发送电子邮件请求的内容.Python附带了一个名为smtplib的库,可以为您完成.这里有大量有关如何使用它的信息:http://docs.python.org/library/smtplib.html

对于阅读,有两种选择,具体取决于您从哪个服务器阅读电子邮件.

  • 对于POP电子邮件服务器 - 您可以使用poplib python库:http://docs.python.org/library/poplib.html
  • 对于IMAP电子邮件服务器 - 您可以使用imaplib python库:http://docs.python.org/library/imaplib.html


Pro*_*one 6

为了让 Hasen 的脚本在 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()
Run Code Online (Sandbox Code Playgroud)


Flo*_*oyd 6

更现代的方法是使用aiosmtpd库(此处提供文档)。

您可以在这里找到一个很好的示例:https://aiosmtpd.readthedocs.io/en/latest/controller.html