`
iunknown
  • 浏览: 409251 次
社区版块
存档分类
最新评论

SPSmtpServer: 一个基于 SPServer 的 SMTP 服务器框架

阅读更多
在 SPServer 中增加了一个 smtp 服务器框架。在框架中把 smtp 协议相关的内容做了封装,基于这个框架来实现各种 smtp 服务器(反垃圾网关,或者用于投递邮件的mta),可以减少工作量。

http://spserver.googlecode.com/files/spserver-0.9.4.src.tar.gz

有了这个框架之后,要实现一个简单的 smtp 服务器,就非常简单了。下面这段代码就是一个简单的例子。

class SP_FakeSmtpHandler : public SP_SmtpHandler {
public:
    SP_FakeSmtpHandler(){}

    virtual ~SP_FakeSmtpHandler() {}

    virtual int from( const char * args, SP_Buffer * reply ) {
        reply->printf( "250 %s, sender ok\r\n", args );

        return eAccept;
    }

    virtual int rcpt( const char * args, SP_Buffer * reply ) {
        reply->printf( "250 %s, recipient ok\r\n", args );

        return eAccept;
    }

    virtual int data( const char * data, SP_Buffer * reply ) {
        reply->append( "250 Requested mail action okay, completed.\r\n" );

        return eAccept;
    }
};

class SP_FakeSmtpHandlerFactory : public SP_SmtpHandlerFactory {
public:
    SP_FakeSmtpHandlerFactory() {}
    virtual ~SP_FakeSmtpHandlerFactory(){}

    virtual SP_SmtpHandler * create() const {
        return new SP_FakeSmtpHandler();
    }
};

int main( int argc, char * argv[] )
{
    SP_Server server( "", 1025, new SP_SmtpHandlerAdapterFactory(
            new SP_FakeSmtpHandlerFactory() ) );
    server.runForever();

    return 0;
}




要实现一个 smtp 服务器,需要实现 SP_SmtpHandler 和 SP_SmtpHandlerFactory 的子类。

SP_SmtpHandler 的定义如下:

class SP_SmtpHandler {
public:

	//所有的方法都可能返回如下的 3 个值
	// eAccept 表明指令成功
	// eReject 表明指令被拒绝
	// eClose  表明需要断开当前的连接
	enum {
		eAccept = 0,  // command accepted
		eReject = -1, // command rejected
		eClose  = -2  // force to close the connection
	};

	//在成功 accept 到一个连接之后,调用 welcome 方法,并把 clientIP 作为参数;
	virtual int welcome( const char * clientIP, SP_Buffer * reply );
	//在成功收到 EHLO 指令之后,调用 ehlo 方法;
	virtual int ehlo( const char * args, SP_Buffer * reply );
	//在成功完成 AUTH LOGIN 指令交互,收集了 user/pass 之后,调用 auth 方法;
	virtual int auth( const char * user, const char * pass, SP_Buffer * reply );

	//在成功收到 MAIL FROM 指令,获得发件人之后,调用 from 方法;
	virtual int from( const char * args, SP_Buffer * reply ) = 0;
	//在成功收到 RCPT TO 指令,获得一个收件人之后,调用 rcpt 方法,
	//如果有多个 RCPT TO 指令,那么调用 rcpt 多次;
	virtual int rcpt( const char * args, SP_Buffer * reply ) = 0;
	//在成功收到了邮件内容之后,调用 data 方法。
	virtual int data( const char * data, SP_Buffer * reply ) = 0;
};


如果是一个内部使用的,用于投递邮件的 mta ,不需要 smtp auth ,那么只需要实现 from/rcpt/data 这 3 个函数就可以了。
如果是一个用于反垃圾的网关,那么根据具体的反垃圾策略,可能需要实现 welcome/ehlo/auth 这些指令。
在 welcome 函数中,可以对 clientIP 进行检查,如果是一个非法的 ip ,那么可以返回 eClose ,以关闭当前连接。
如果需要支持 smtp auth ,那么需要实现 ehlo ,在返回的信息中,表明支持 smtp auth 。同时实现 auth 函数,对 user/pass 进行校验。

SPSmtpServer 用一个独立的线程处理前端的网络 IO ,再使用一个线程池来执行 SP_SmtpHandler 的各个函数。因此可以在 SP_SmtpHandler 的各个函数中进行各种操作,包括访问数据库这些耗时的操作。

分享到:
评论

相关推荐

    第01篇:搭建匿名SMTP服务器1

    在本文中,我们将讨论如何搭建一个匿名SMTP服务器,并了解SPF(Sender Policy Framework)在防止邮件伪造中的作用。 首先,我们来看一个实例。test.com域没有配置SPF,攻击者可以假装是admin@test.com并成功向QQ...

    smtp.rar_SMTP代码_SMTP服务器_java smtp_smtp

    3. **SMTP服务器实现**:一个简单的SMTP服务器通常包含接收连接、解析客户端命令、处理邮件传输等功能。学习者可以通过分析代码了解如何创建监听套接字、处理输入输出流,以及如何将邮件存储或转发。 4. **身份验证...

    SMTP错误码建议解决方法

    这个错误码表示 SMTP 服务器有一个并发连接数限制,超过这个限制将导致 SMTP 服务器拒绝提供服务。解决方法是请收信者和邮件管理者确认收信端邮件服务器是否正常作业,并且检查 SMTP 服务器的并发连接数限制。 422....

    smtp服务器

    在本场景中,我们关注的是一个与SMTP服务器相关的软件,可能是免费且无限期使用的,尤其适用于ASP.NET环境,但其他编程语言的兼容性则需要自行测试。 SMTP服务器的运作方式是这样的:当你在电子邮件客户端(如...

    SMTP服务器端MFC

    本篇将深入探讨如何利用MFC来实现一个SMTP服务器端。 首先,我们需要理解SMTP服务器的基本工作流程。SMTP服务器接收来自客户端的邮件发送请求,验证发送者身份,处理邮件路由,并最终将邮件传递到目的地。在MFC中,...

    Liunx 连接不上SMTP服务器解决方案

    PHPMailer不能连接SMTP服务器的另一个常见原因是认证问题。检查SMTP服务器所需的用户名和密码是否正确,并确保SMTP验证设置正确。在PHPMailer配置中,`isSMTP()`、`SMTPAuth`、`Username`和`Password`等方法要正确...

    一个SMTP服务器实现程序

    在这个“SMTP服务器实现程序”中,MFC被用来构建一个SMTP客户端,它允许用户发送电子邮件。 SMTP客户端的主要任务是连接到SMTP服务器,验证身份(如果需要),构建并发送邮件消息。以下是一些关键知识点: 1. **...

    C实现SMTP服务器,使用TCP命令实现功能比较完善 .rar_SMTP服务器_smtp_smtp 服务器_tcp命令_实现S

    本文将详细讲解如何使用C#来实现一个功能完善的SMTP服务器,并涉及TCP命令在SMTP服务器中的应用。 首先,理解SMTP服务器的基本工作原理至关重要。SMTP服务器主要负责邮件的接收和转发。当一个用户通过邮件客户端...

    SMTP服务器配置!

    你需要设置一个邮件存储位置,如通过MDB文件(Microsoft Exchange Database)或与外部邮件服务器(如Exchange Server)集成。 **4. 设置发件人验证** 为了防止垃圾邮件,你可以启用发件人验证。这样,只有经过验证...

    SMTPTool 1.7┊可以用来调试SMTP服务器直接与SMTP服务器互动┊英文绿色免费版

    总的来说,SMTPTool 1.7 是一个强大的SMTP服务器调试工具,适合网络管理员、开发人员以及任何需要解决电子邮件发送问题的用户。通过这款工具,用户可以高效地排查SMTP服务器配置问题,优化邮件发送流程,确保邮件...

    基于SMTP的邮件收发系统

    基于SMTP的邮件收发系统设计是一个常见的网络编程课题,旨在理解和实现电子邮件的工作流程。在本项目中,我们将探讨SMTP协议的核心概念、邮件收发流程以及实现此类系统的相关技术。 1. SMTP协议基础: SMTP是一种...

    精选_毕业设计_基于MFC的SMTP服务器_完整源码

    8. 图形用户界面(GUI)设计:虽然SMTP服务器主要通过命令行交互,但基于MFC的项目可能会包含一个简单的GUI,用于配置服务器参数、监控连接状态和查看日志。 9. 部署与运维:最后,了解如何将编译后的程序打包、...

    SMTP服务器实现

    通过以上内容,开发者可以学习到如何使用MFC和异步套接字技术构建一个基本的SMTP服务器,以及理解SMTP协议、TCP连接和Windows编程的相关知识。这个项目对于想深入了解网络编程和邮件系统的开发者来说是一个很好的...

    smtpserver

    在标题和描述中提到的"smtpserver",指的是一个邮件发送服务器,它允许用户通过匿名方式发送邮件,这意味着不需要提供实际的邮箱账户认证也能发送邮件。 在IT领域,SMTP服务器的知识点涵盖了多个方面: 1. **SMTP...

    Go-一个用Go语言实现的SMTP服务器

    本项目“Go-一个用Go语言实现的SMTP服务器”是利用Go的特性构建的一个高效、可扩展的邮件传输协议(SMTP)服务器。SMTP是互联网上用于发送电子邮件的标准协议,而这个Go实现的SMTP服务器提供了许多高级功能,如自动...

    smtp.tar.gz_C 邮件发送_SMTP服务器_smtp_smtp c_smtp协议

    在这个“smtp.tar.gz”压缩包中,我们可能找到了一个C语言实现的SMTP客户端库或示例代码,帮助开发者理解和实现通过SMTP协议发送邮件的功能。 首先,让我们深入了解SMTP协议的工作原理。SMTP基于TCP/IP协议族,使用...

    SMTP.rar_SMTP 服务器 C++_smtp 服务器_smtp发邮件_服务器_邮件 VC

    SMTP服务器通常分为两个主要部分:收件服务器和发件服务器。收件服务器通过POP3(Post Office Protocol version 3)或IMAP4(Internet Message Access Protocol version 4)协议接收邮件,而发件服务器则通过SMTP...

    用Java实现SMTP服务器

    在本文中,我们将探讨如何使用Java语言来实现一个基本的SMTP服务器,这将涵盖SMTP协议的基础概念、关键操作以及具体的Java代码实现。 #### SMTP协议概览 SMTP协议允许邮件从发件人传递到收件人的邮件服务器上,它...

    各大型邮箱smtp服务器及端口收集

    以上列举了多个大型邮箱服务商的SMTP服务器及其端口信息。需要注意的是,随着技术的发展和服务商政策的变化,这些信息可能会有所调整。因此,在实际配置时建议查阅最新的官方文档或联系客服获取最新信息。此外,对于...

Global site tag (gtag.js) - Google Analytics