提交 de8aacb8fa12e4c995b582e1166eb726cd4161e6

作者 LJH 李佳桓
1 个父辈 93633716

add

正在显示 1 个修改的文件 包含 182 行增加0 行删除
  1 +/*
  2 + * Copyright 2007 Stephen Liu
  3 + * For license terms, see the file COPYING along with this library.
  4 + */
  5 +
  6 +#include <stdio.h>
  7 +#include <stdlib.h>
  8 +#include <string.h>
  9 +#include <signal.h>
  10 +#include <assert.h>
  11 +
  12 +#include "spporting.hpp"
  13 +
  14 +#include "spmsgdecoder.hpp"
  15 +#include "spbuffer.hpp"
  16 +
  17 +#include "spserver.hpp"
  18 +#include "splfserver.hpp"
  19 +#include "sphandler.hpp"
  20 +#include "spresponse.hpp"
  21 +#include "sprequest.hpp"
  22 +
  23 +#include "spsmtp.hpp"
  24 +
  25 +class SP_FakeSmtpHandler : public SP_SmtpHandler {
  26 +public:
  27 + SP_FakeSmtpHandler(){
  28 + mAuthResult = 1;
  29 + }
  30 +
  31 + virtual ~SP_FakeSmtpHandler() {}
  32 +
  33 + int ehlo( const char * args, SP_Buffer * reply )
  34 + {
  35 + reply->append( "250-OK\n" );
  36 + reply->append( "250-AUTH LOGIN\n" );
  37 + reply->append( "250 HELP\n" );
  38 +
  39 + return eAccept;
  40 + }
  41 +
  42 + int auth( const char * user, const char * pass, SP_Buffer * reply )
  43 + {
  44 + //printf( "auth user %s, pass %s\n", user, pass );
  45 +
  46 + reply->append( "235 Authentication successful.\r\n" );
  47 + mAuthResult = 1;
  48 +
  49 + return eAccept;
  50 + }
  51 +
  52 + virtual int from( const char * args, SP_Buffer * reply ) {
  53 +
  54 + //printf( "mail from: %s\n", args );
  55 +
  56 + if( 0 == mAuthResult ) {
  57 + reply->append( "503 Error: need AUTH command\r\n" );
  58 + return eReject;
  59 + }
  60 +
  61 + char buffer[ 128 ] = { 0 };
  62 + snprintf( buffer, sizeof( buffer ), "250 %s, sender ok\r\n", args );
  63 + reply->append( buffer );
  64 +
  65 + return eAccept;
  66 + }
  67 +
  68 + virtual int rcpt( const char * args, SP_Buffer * reply ) {
  69 +
  70 + //printf( "rcpt to: %s\n", args );
  71 +
  72 + char buffer[ 128 ] = { 0 };
  73 + snprintf( buffer, sizeof( buffer ), "250 %s, recipient ok\r\n", args );
  74 + reply->append( buffer );
  75 +
  76 + return eAccept;
  77 + }
  78 +
  79 + virtual int data( const char * data, SP_Buffer * reply ) {
  80 +
  81 + //printf( "data length %d\n", strlen( data ) );
  82 +
  83 + reply->append( "250 Requested mail action okay, completed.\r\n" );
  84 +
  85 + return eAccept;
  86 + }
  87 +
  88 + virtual int rset( SP_Buffer * reply ) {
  89 + reply->append( "250 OK\r\n" );
  90 +
  91 + return eAccept;
  92 + }
  93 +
  94 +private:
  95 + int mAuthResult;
  96 +};
  97 +
  98 +//---------------------------------------------------------
  99 +
  100 +class SP_FakeSmtpHandlerFactory : public SP_SmtpHandlerFactory {
  101 +public:
  102 + SP_FakeSmtpHandlerFactory();
  103 + virtual ~SP_FakeSmtpHandlerFactory();
  104 +
  105 + virtual SP_SmtpHandler * create() const;
  106 +
  107 + //use default SP_CompletionHandler is enough, not need to implement
  108 + //virtual SP_CompletionHandler * createCompletionHandler() const;
  109 +};
  110 +
  111 +SP_FakeSmtpHandlerFactory :: SP_FakeSmtpHandlerFactory()
  112 +{
  113 +}
  114 +
  115 +SP_FakeSmtpHandlerFactory :: ~SP_FakeSmtpHandlerFactory()
  116 +{
  117 +}
  118 +
  119 +SP_SmtpHandler * SP_FakeSmtpHandlerFactory :: create() const
  120 +{
  121 + return new SP_FakeSmtpHandler();
  122 +}
  123 +
  124 +//---------------------------------------------------------
  125 +
  126 +int main( int argc, char * argv[] )
  127 +{
  128 + int port = 1025, maxThreads = 10;
  129 + const char * serverType = "hahs";
  130 +
  131 +#ifndef WIN32
  132 + extern char *optarg ;
  133 + int c ;
  134 +
  135 + while( ( c = getopt ( argc, argv, "p:t:s:v" )) != EOF ) {
  136 + switch ( c ) {
  137 + case 'p' :
  138 + port = atoi( optarg );
  139 + break;
  140 + case 't':
  141 + maxThreads = atoi( optarg );
  142 + break;
  143 + case 's':
  144 + serverType = optarg;
  145 + break;
  146 + case '?' :
  147 + case 'v' :
  148 + printf( "Usage: %s [-p <port>] [-t <threads>] [-s <hahs|lf>]\n", argv[0] );
  149 + exit( 0 );
  150 + }
  151 + }
  152 +#endif
  153 +
  154 + sp_openlog( "testsmtp", LOG_CONS | LOG_PID | LOG_PERROR, LOG_USER );
  155 +
  156 + assert( 0 == sp_initsock() );
  157 +
  158 + if( 0 == strcasecmp( serverType, "hahs" ) ) {
  159 + SP_Server server( "", port, new SP_SmtpHandlerAdapterFactory( new SP_FakeSmtpHandlerFactory() ) );
  160 +
  161 + server.setMaxConnections( 2048 );
  162 + server.setTimeout( 600 );
  163 + server.setMaxThreads( maxThreads );
  164 + server.setReqQueueSize( 100, "Sorry, server is busy now!\n" );
  165 +
  166 + server.runForever();
  167 + } else {
  168 + SP_LFServer server( "", port, new SP_SmtpHandlerAdapterFactory( new SP_FakeSmtpHandlerFactory() ) );
  169 +
  170 + server.setMaxConnections( 2048 );
  171 + server.setTimeout( 600 );
  172 + server.setMaxThreads( maxThreads );
  173 + server.setReqQueueSize( 100, "Sorry, server is busy now!\n" );
  174 +
  175 + server.runForever();
  176 + }
  177 +
  178 + sp_closelog();
  179 +
  180 + return 0;
  181 +}
  182 +
... ...
注册登录 后发表评论