正在显示
1 个修改的文件
包含
182 行增加
和
0 行删除
src/server/spserver/testsmtp.cpp
0 → 100644
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 | + | ... | ... |
请
注册
或
登录
后发表评论