1
1
import socket
2
- import signal
3
2
import SocketServer
4
3
import threading
5
4
import sys
6
5
import re
6
+ import signal
7
7
8
8
class SMTPServer (SocketServer .ThreadingMixIn , SocketServer .TCPServer ):
9
9
@@ -13,57 +13,86 @@ def process_message(self, mail_from, rcpts_to, message):
13
13
class SMTPRequestHandler (SocketServer .BaseRequestHandler ):
14
14
15
15
read_data = False
16
- helo_host =
17
- mail_from =
16
+ helo_host = None
17
+ mail_from = None
18
18
rcpts_to = []
19
- message =
19
+ message = None
20
20
hostname = socket .gethostname ()
21
21
message = ''
22
22
23
23
def handle (self ):
24
- while True :
25
- try :
26
- if (self .read_data or self .request ):
24
+ try :
25
+ self .f_socket = self .request .makefile ()
26
+ self .send_data ("220 %s PPFilter ESMTP" % (self .hostname ) )
27
+ while True :
28
+ if self .read_data :
29
+ self .data = self .request .recv (4096 )
30
+ print self .data + '*'
31
+ for text in self .data .split ('\r \n ' ):
32
+ if text and text [0 ] == '.' :
33
+ self .data = 'DOT'
34
+ else :
35
+ self .message += text + "\r \n "
36
+
37
+ # if re.match('^\.$', self.data.strip()):
38
+ # self.data = 'DOT'
39
+ self .parse_commands ()
40
+
41
+ else :
27
42
self .data = self .request .recv (1024 )
28
- if self .parse_commands ():
29
- pass
30
- except AttributeError :
31
- self .request .send ('500 Unknown command\r \n ' )
32
- except Exception :
33
- pass
43
+ print self .data + '*'
44
+ self .parse_commands ()
45
+
46
+ finally :
47
+ self .request .close ()
48
+ # except AttributeError:
49
+ # self.request.send('500 Unknown command\r\n')
50
+ # except Exception:
51
+ # pass
52
+
53
+ def send_data (self , data ):
54
+ print data
55
+ self .request .send (data + "\r \n " )
56
+ self .f_socket .flush ()
34
57
35
58
def parse_commands (self ):
36
59
cmd = []
37
60
cmd = self .data .split (' ' )
38
61
if (len (cmd ) < 2 ):
39
62
cmd [0 ] = self .data .strip ()
40
- print len ( cmd )
63
+
41
64
method = (('self.smtp_' + cmd [0 ].upper ().strip ()) + '()' )
65
+ print method
42
66
eval (method )
43
67
44
68
def smtp_MAIL (self ):
45
69
self .mail_from = self .data .split (':' )[1 ].strip ()
46
- self .request . send ('250 Ok\r \n ' )
70
+ self .send_data ('250 Ok' )
47
71
72
+ def smtp_EHLO (self ):
73
+ self .smtp_HELO ()
48
74
49
75
def smtp_HELO (self ):
50
76
self .helo_host = self .data .split (' ' )[1 ].strip ()
51
- self .request . send (( ' 250 %s\r \n ' % self .hostname ))
77
+ self .send_data (( " 250 %s" % self .hostname ))
52
78
53
79
def smtp_QUIT (self ):
54
- self .request . send ('221 Bye\r \n ' )
80
+ self .send_data ('221 Bye' )
55
81
self .request .close ()
56
82
57
83
def smtp_DOT (self ):
58
84
response = self .server .process_message (self .mail_from , self .rcpts_to , self .message )
59
- if ((type (response ).__name__ == 'str' ) and self .request .send ((response + '\r \n ' ))):
60
- pass
85
+ if type (response ).__name__ == 'str' :
86
+ self .send_data ((response ))
87
+ else :
88
+ self .send_data ('250 Ok' )
61
89
self .read_data = False
62
90
63
91
def smtp_RCPT (self ):
64
92
self .rcpts_to .append (self .data .split (':' )[1 ].strip ())
65
- self .request . send ('250 Ok\r \n ' )
93
+ self .send_data ('250 Ok' )
66
94
67
95
def smtp_DATA (self ):
68
- self .request .send ("354 Start mail input; end with '.'\r \n " )
96
+ print 'waiting for data'
97
+ self .send_data ("354 Start mail input; end with '.'" )
69
98
self .read_data = True
0 commit comments