eventlet SMTP Relay server

本文介绍了一个使用Eventlet实现的SMTP中继服务器,该服务器能够处理来自客户端的邮件消息,并将其转发到指定的远程SMTP服务器。文章详细展示了如何配置服务器参数如主机地址、端口、SSL连接等,并通过Python代码实现了完整的服务器逻辑。
# import the standard smtplib library
import smtplib
from eventlet import patcher
patcher.monkey_patch(all=False, socket=True) # patch socket and ssl

import eventlet
import sys
import email
import getopt

def local_property(func):
    return property(**func())

class SMTPRelayServer(object):
    def __init__(self, host=None, port=None, ssl=False, listen_addr=('0.0.0.0', 6000)):
        """host is the ip address of the server, can be optional
        port is the port of the server, can be optional
        if ssl is required to connect to the server, it must be True
        listen_addr is a tuple of current server address
        """

        self.address = listen_addr
        self.host = host
        self.host_port = port
        self.require_ssl = ssl
        self.pool = eventlet.GreenPool()
        self.send_addr = 'smtp_relay'

    @local_property
    def send_from():
        def fget(self):
            return self.send_addr

        def fset(self, v):
            self.send_addr = v

        return locals()

    @local_property
    def username():
        def fget(self):
            return self.user

        def fset(self, v):
            self.user = v

        return locals()

    @local_property
    def passwd():
        def fget(self):
            return self.pwd

        def fset(self, v):
            self.pwd = v

        return locals()

    def run(self):
        """main loop of the relay server"""

        self.server_sock = eventlet.listen(self.address)
        while True:
            new_sock, address = self.server_sock.accept()
            print 'incomming: ', address
            self.pool.spawn_n(self._handle, new_sock.makefile('r'))

    def shutdown(self):
        """shtudown the server"""

        self.server_sock.close()

    def _handle(self, sock):
        """client handler, forward the client data to the remote smtp server"""

        content = ''
        while True:
            data = sock.read()
            if not data: break
            content += data
        # client data is mail message, extract the From and To addresses
        msg = email.message_from_string(content)
        if msg['From']:
            from_addr = msg['From']
        else:
            from_addr = self.send_addr

        # only send the mail if To is not empty
        if msg['To']:
            if not self.require_ssl:
                smtp_server = smtplib.SMTP(self.host, self.host_port)
            else:
                smtp_server = smtplib.SMTP_SSL()
                smtp_server.connect(self.host, self.host_port)
                smtp_server.login(self.username, self.passwd)

            smtp_server.sendmail(from_addr, msg['To'], content)

    # context manager protocal
    def __enter__(self):
        return self

    def __exit__(self, exec_type, exec_value, traceback):
        self.shutdown()
        return False

if __name__ == '__main__':
    host = None
    port = None
    user = ''
    pwd  = ''
    ssl = False
    opts, args = getopt.getopt(sys.argv[1:], "", ['host=', 'port=', 'user=', 'pwd=', 'ssl'])
    for opt, arg in opts:
        if opt == '--host':
            host = arg
        elif opt == '--port':
            port = arg
        elif opt == '--user':
            user = arg
        elif opt == '--pwd':
            pwd = arg
        elif opt == '--ssl':
            ssl = True

    with SMTPRelayServer(host, port, ssl) as server:
        server.username = user
        server.passwd = pwd
        server.run()

SMTP中继(SMTP Relay)是一种通过中间服务器来传递电子邮件的方式。SMTP是Simple Mail Transfer Protocol的缩写,是一种用于在计算机网络上发送电子邮件的标准协议。SMTP中继则是指在传递电子邮件过程中,通过一个中继服务器来转发邮件。 SMTP中继的作用主要有两个方面。首先,它可以帮助解决直接发送邮件的问题。直接发送邮件存在一些限制,如有些网络运营商或系统管理员为了控制垃圾邮件的滥发,禁止用户使用自己的SMTP服务器发送邮件。而使用SMTP中继可以绕过这些限制,将邮件通过中继服务器发送出去。 另外,SMTP中继还可以提高邮件的可靠性和可用性。因为通过中继服务器发送邮件,如果发送邮件的源服务器出现故障,可以通过切换到备用中继服务器来继续发送邮件,避免邮件发送中断。同时,使用SMTP中继还可以通过负载均衡和故障转移来提高邮件传递的效率和可靠性。 SMTP中继的工作原理是当发件人发送一封电子邮件时,邮件将被发送到中继服务器,然后中继服务器将邮件转发给接收方的邮件服务器。中继服务器充当了一个中间人的角色,起到了桥梁的作用,将发件人和收件人之间的邮件进行传递。 总而言之,SMTP中继是一种通过中间服务器来传递电子邮件的方式。它解决了直接发送邮件的限制,并提高了邮件的可靠性和可用性。通过中继服务器的转发和传递,确保了电子邮件的正常发送和接收。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值