Lines Matching refs:self

105     def write(self, msg): pass
106 def flush(self): pass
130 def max_command_size_limit(self):
132 return max(self.command_size_limits.values())
134 return self.command_size_limit
136 def __init__(self, server, conn, addr, data_size_limit=DATA_SIZE_DEFAULT,
138 asynchat.async_chat.__init__(self, conn, map=map)
139 self.smtp_server = server
140 self.conn = conn
141 self.addr = addr
142 self.data_size_limit = data_size_limit
143 self.enable_SMTPUTF8 = enable_SMTPUTF8
144 self._decode_data = decode_data
149 self._emptystring = ''
150 self._linesep = '\r\n'
151 self._dotsep = '.'
152 self._newline = NEWLINE
154 self._emptystring = b''
155 self._linesep = b'\r\n'
156 self._dotsep = ord(b'.')
157 self._newline = b'\n'
158 self._set_rset_state()
159 self.seen_greeting = ''
160 self.extended_smtp = False
161 self.command_size_limits.clear()
162 self.fqdn = socket.getfqdn()
164 self.peer = conn.getpeername()
168 self.close()
172 print('Peer:', repr(self.peer), file=DEBUGSTREAM)
173 self.push('220 %s %s' % (self.fqdn, __version__))
175 def _set_post_data_state(self):
177 self.smtp_state = self.COMMAND
178 self.mailfrom = None
179 self.rcpttos = []
180 self.require_SMTPUTF8 = False
181 self.num_bytes = 0
182 self.set_terminator(b'\r\n')
184 def _set_rset_state(self):
186 self._set_post_data_state()
187 self.received_data = ''
188 self.received_lines = []
193 def __server(self):
196 return self.smtp_server
198 def __server(self, value):
201 self.smtp_server = value
204 def __line(self):
207 return self.received_lines
209 def __line(self, value):
212 self.received_lines = value
215 def __state(self):
218 return self.smtp_state
220 def __state(self, value):
223 self.smtp_state = value
226 def __greeting(self):
229 return self.seen_greeting
231 def __greeting(self, value):
234 self.seen_greeting = value
237 def __mailfrom(self):
240 return self.mailfrom
242 def __mailfrom(self, value):
245 self.mailfrom = value
248 def __rcpttos(self):
251 return self.rcpttos
253 def __rcpttos(self, value):
256 self.rcpttos = value
259 def __data(self):
262 return self.received_data
264 def __data(self, value):
267 self.received_data = value
270 def __fqdn(self):
273 return self.fqdn
275 def __fqdn(self, value):
278 self.fqdn = value
281 def __peer(self):
284 return self.peer
286 def __peer(self, value):
289 self.peer = value
292 def __conn(self):
295 return self.conn
297 def __conn(self, value):
300 self.conn = value
303 def __addr(self):
306 return self.addr
308 def __addr(self, value):
311 self.addr = value
314 def push(self, msg):
315 asynchat.async_chat.push(self, bytes(
316 msg + '\r\n', 'utf-8' if self.require_SMTPUTF8 else 'ascii'))
319 def collect_incoming_data(self, data):
321 if self.smtp_state == self.COMMAND:
322 limit = self.max_command_size_limit
323 elif self.smtp_state == self.DATA:
324 limit = self.data_size_limit
325 if limit and self.num_bytes > limit:
328 self.num_bytes += len(data)
329 if self._decode_data:
330 self.received_lines.append(str(data, 'utf-8'))
332 self.received_lines.append(data)
335 def found_terminator(self):
336 line = self._emptystring.join(self.received_lines)
338 self.received_lines = []
339 if self.smtp_state == self.COMMAND:
340 sz, self.num_bytes = self.num_bytes, 0
342 self.push('500 Error: bad syntax')
344 if not self._decode_data:
353 max_sz = (self.command_size_limits[command]
354 if self.extended_smtp else self.command_size_limit)
356 self.push('500 Error: line too long')
358 method = getattr(self, 'smtp_' + command, None)
360 self.push('500 Error: command "%s" not recognized' % command)
365 if self.smtp_state != self.DATA:
366 self.push('451 Internal confusion')
367 self.num_bytes = 0
369 if self.data_size_limit and self.num_bytes > self.data_size_limit:
370 self.push('552 Error: Too much mail data')
371 self.num_bytes = 0
376 for text in line.split(self._linesep):
377 if text and text[0] == self._dotsep:
381 self.received_data = self._newline.join(data)
382 args = (self.peer, self.mailfrom, self.rcpttos, self.received_data)
384 if not self._decode_data:
386 'mail_options': self.mail_options,
387 'rcpt_options': self.rcpt_options,
389 status = self.smtp_server.process_message(*args, **kwargs)
390 self._set_post_data_state()
392 self.push('250 OK')
394 self.push(status)
397 def smtp_HELO(self, arg):
399 self.push('501 Syntax: HELO hostname')
402 if self.seen_greeting:
403 self.push('503 Duplicate HELO/EHLO')
405 self._set_rset_state()
406 self.seen_greeting = arg
407 self.push('250 %s' % self.fqdn)
409 def smtp_EHLO(self, arg):
411 self.push('501 Syntax: EHLO hostname')
414 if self.seen_greeting:
415 self.push('503 Duplicate HELO/EHLO')
417 self._set_rset_state()
418 self.seen_greeting = arg
419 self.extended_smtp = True
420 self.push('250-%s' % self.fqdn)
421 if self.data_size_limit:
422 self.push('250-SIZE %s' % self.data_size_limit)
423 self.command_size_limits['MAIL'] += 26
424 if not self._decode_data:
425 self.push('250-8BITMIME')
426 if self.enable_SMTPUTF8:
427 self.push('250-SMTPUTF8')
428 self.command_size_limits['MAIL'] += 10
429 self.push('250 HELP')
431 def smtp_NOOP(self, arg):
433 self.push('501 Syntax: NOOP')
435 self.push('250 OK')
437 def smtp_QUIT(self, arg):
439 self.push('221 Bye')
440 self.close_when_done()
442 def _strip_command_keyword(self, keyword, arg):
448 def _getaddr(self, arg):
459 def _getparams(self, params):
470 def smtp_HELP(self, arg):
475 self.push('250 Syntax: EHLO hostname')
477 self.push('250 Syntax: HELO hostname')
480 if self.extended_smtp:
482 self.push(msg)
485 if self.extended_smtp:
487 self.push(msg)
489 self.push('250 Syntax: DATA')
491 self.push('250 Syntax: RSET')
493 self.push('250 Syntax: NOOP')
495 self.push('250 Syntax: QUIT')
497 self.push('250 Syntax: VRFY <address>')
499 self.push('501 Supported commands: EHLO HELO MAIL RCPT '
502 self.push('250 Supported commands: EHLO HELO MAIL RCPT DATA '
505 def smtp_VRFY(self, arg):
507 address, params = self._getaddr(arg)
509 self.push('252 Cannot VRFY user, but will accept message '
512 self.push('502 Could not VRFY %s' % arg)
514 self.push('501 Syntax: VRFY <address>')
516 def smtp_MAIL(self, arg):
517 if not self.seen_greeting:
518 self.push('503 Error: send HELO first')
522 if self.extended_smtp:
525 self.push(syntaxerr)
527 arg = self._strip_command_keyword('FROM:', arg)
528 address, params = self._getaddr(arg)
530 self.push(syntaxerr)
532 if not self.extended_smtp and params:
533 self.push(syntaxerr)
535 if self.mailfrom:
536 self.push('503 Error: nested MAIL command')
538 self.mail_options = params.upper().split()
539 params = self._getparams(self.mail_options)
541 self.push(syntaxerr)
543 if not self._decode_data:
546 self.push('501 Error: BODY can only be one of 7BIT, 8BITMIME')
548 if self.enable_SMTPUTF8:
551 self.require_SMTPUTF8 = True
553 self.push('501 Error: SMTPUTF8 takes no arguments')
558 self.push(syntaxerr)
560 elif self.data_size_limit and int(size) > self.data_size_limit:
561 self.push('552 Error: message size exceeds fixed maximum message size')
564 self.push('555 MAIL FROM parameters not recognized or not implemented')
566 self.mailfrom = address
567 print('sender:', self.mailfrom, file=DEBUGSTREAM)
568 self.push('250 OK')
570 def smtp_RCPT(self, arg):
571 if not self.seen_greeting:
572 self.push('503 Error: send HELO first');
575 if not self.mailfrom:
576 self.push('503 Error: need MAIL command')
579 if self.extended_smtp:
582 self.push(syntaxerr)
584 arg = self._strip_command_keyword('TO:', arg)
585 address, params = self._getaddr(arg)
587 self.push(syntaxerr)
589 if not self.extended_smtp and params:
590 self.push(syntaxerr)
592 self.rcpt_options = params.upper().split()
593 params = self._getparams(self.rcpt_options)
595 self.push(syntaxerr)
599 self.push('555 RCPT TO parameters not recognized or not implemented')
601 self.rcpttos.append(address)
602 print('recips:', self.rcpttos, file=DEBUGSTREAM)
603 self.push('250 OK')
605 def smtp_RSET(self, arg):
607 self.push('501 Syntax: RSET')
609 self._set_rset_state()
610 self.push('250 OK')
612 def smtp_DATA(self, arg):
613 if not self.seen_greeting:
614 self.push('503 Error: send HELO first');
616 if not self.rcpttos:
617 self.push('503 Error: need RCPT command')
620 self.push('501 Syntax: DATA')
622 self.smtp_state = self.DATA
623 self.set_terminator(b'\r\n.\r\n')
624 self.push('354 End data with <CR><LF>.<CR><LF>')
627 def smtp_EXPN(self, arg):
628 self.push('502 EXPN not implemented')
635 def __init__(self, localaddr, remoteaddr,
638 self._localaddr = localaddr
639 self._remoteaddr = remoteaddr
640 self.data_size_limit = data_size_limit
641 self.enable_SMTPUTF8 = enable_SMTPUTF8
642 self._decode_data = decode_data
646 asyncore.dispatcher.__init__(self, map=map)
650 self.create_socket(gai_results[0][0], gai_results[0][1])
652 self.set_reuse_addr()
653 self.bind(localaddr)
654 self.listen(5)
656 self.close()
660 self.__class__.__name__, time.ctime(time.time()),
663 def handle_accepted(self, conn, addr):
665 channel = self.channel_class(self,
668 self.data_size_limit,
669 self._map,
670 self.enable_SMTPUTF8,
671 self._decode_data)
674 def process_message(self, peer, mailfrom, rcpttos, data, **kwargs):
710 def _print_message_content(self, peer, data):
727 def process_message(self, peer, mailfrom, rcpttos, data, **kwargs):
734 self._print_message_content(peer, data)
739 def __init__(self, *args, **kwargs):
742 super(PureProxy, self).__init__(*args, **kwargs)
744 def process_message(self, peer, mailfrom, rcpttos, data):
754 refused = self._deliver(mailfrom, rcpttos, data)
758 def _deliver(self, mailfrom, rcpttos, data):
763 s.connect(self._remoteaddr[0], self._remoteaddr[1])