2009-07-16 16 views
2

したがって、SMTP AUTH接続を処理できるように、Python smtpd SMTPServerクラスを拡張したいと考えました。Python smtpdライブラリにSMTP AUTHサポートを追加...メソッドをオーバーライドできませんか?

def smtp_EHLO(self, arg): 
    print 'got in arg: ', arg 
    # do stuff here... 

しかし呼ばれることは決してありませんいくつかの理由のために:私はちょうどこのように始めることができるようなので...

を十分に簡単に見えた、それが見えました。 Pythonのsmtpdのライブラリは、このような他の同様の方法を呼び出します。

 method = None 
     i = line.find(' ') 
     if i < 0: 
      command = line.upper() 
      arg = None 
     else: 
      command = line[:i].upper() 
      arg = line[i+1:].strip() 
     method = getattr(self, 'smtp_' + command, None) 

なぜそれが私のメソッドを呼び出していないのだろうか?

その後、私はおそらく、found_terminator(self):メソッド全体をオーバーライドできると思っていましたが、どちらもうまくいかないようです。

def found_terminator(self): 
    # I add this to my child class and it never gets called... 

私は何か愚かなことをやっていますか?たぶん私はちょうどあなたがSMTPChannelを拡張する必要があります...今日まだ完全には

import smtpd 
import asyncore 

class CustomSMTPServer(smtpd.SMTPServer): 

    def smtp_EHLO(self, arg): 

     print 'got in arg: ', arg 

    def process_message(self, peer, mailfrom, rcpttos, data): 
     print 'Receiving message from:', peer 
     print 'Message addressed from:', mailfrom 
     print 'Message addressed to :', rcpttos 
     print 'Message length  :', len(data) 
     print 'HERE WE ARE MAN!' 
     return 

    # Implementation of base class abstract method 
    def found_terminator(self): 
     print 'THIS GOT CALLED RIGHT HERE!' 

     line = EMPTYSTRING.join(self.__line) 
     print >> DEBUGSTREAM, 'Data:', repr(line) 
     self.__line = [] 
     if self.__state == self.COMMAND: 
      if not line: 
       self.push('500 Error: bad syntax') 
       return 
      method = None 
      i = line.find(' ') 
      if i < 0: 
       command = line.upper() 
       arg = None 
      else: 
       command = line[:i].upper() 
       arg = line[i+1:].strip() 
      method = getattr(self, 'smtp_' + command, None) 

      print 'looking for: ', command 
      print 'method is: ', method 

      if not method: 
       self.push('502 Error: command "%s" not implemented' % command) 
       return 
      method(arg) 
      return 
     else: 
      if self.__state != self.DATA: 
       self.push('451 Internal confusion') 
       return 
      # Remove extraneous carriage returns and de-transparency according 
      # to RFC 821, Section 4.5.2. 
      data = [] 
      for text in line.split('\r\n'): 
       if text and text[0] == '.': 
        data.append(text[1:]) 
       else: 
        data.append(text) 
      self.__data = NEWLINE.join(data) 
      status = self.__server.process_message(self.__peer, 
                self.__mailfrom, 
                self.__rcpttos, 
                self.__data) 
      self.__rcpttos = [] 
      self.__mailfrom = None 
      self.__state = self.COMMAND 
      self.set_terminator('\r\n') 
      if not status: 
       self.push('250 Ok') 
      else: 
       self.push(status) 

server = CustomSMTPServer(('127.0.0.1', 1025), None) 

asyncore.loop() 

答えて

3

をウェイクアップしていない - smtp_動詞メソッドが実装されているところです。 SMTPServerの拡張は、チャンネルの独自のサブクラスを返すだけです。

+0

ガー、明らかに私は*眠っています。ありがとう! –

+2

SMTPChannelを上書きする方法の小さな例は、私のような愚かな人に始められていいですね。:-) – nalply

関連する問題