SMTP メッセージ、つまり電子メールを受信して保存できるクラスを作成する必要があります。そのために、ここasyncore
に投稿された例に従って使用しています。ただし、ブロックしているため、コードで他に何もできません。asyncore.loop()
そこで、スレッドを使用することを考えました。これは、私が考えていることを示すコード例です。
class MyServer(smtpd.SMTPServer):
# derive from the python server class
def process_message(..):
# overwrite a smtpd.SMTPServer method to be able to handle the received messages
...
self.list_emails.append(this_email)
def get_number_received_emails(self):
"""Return the current number of stored emails"""
return len(self.list_emails)
def start_receiving(self):
"""Start the actual server to listen on port 25"""
self.thread = threading.Thread(target=asyncore.loop)
self.thread.start()
def stop(self):
"""Stop listening now to port 25"""
# close the SMTPserver from itself
self.close()
self.thread.join()
私はあなたが絵を手に入れることを願っています。このクラスMyServer
は、ポート 25 のリッスンをブロックしない方法で開始および停止できる必要があり、リッスン中 (またはリッスンしていない場合) にメッセージを照会できる必要があります。このstart
メソッドはasyncore.loop()
、電子メールの受信が発生すると、内部リストに追加するリスナーを開始します。同様に、ここでstop
提案されているように、メソッドはこのサーバーを停止できる必要があります。
このコードが期待どおりに機能しないという事実にもかかわらず (asyncore は、上記のstop
メソッドを呼び出しても永遠に実行されるようです。error
I raise は 内でキャッチされますが、を含む関数内stop
ではキャッチされません)、問題は理にかなっています。上記のコードを修正するための提案や、より堅実な実装 (サードパーティのソフトウェアを使用しない) の提案を歓迎します。target
asyncore.loop()