Tôi cần tạo một lớp có thể nhận và lưu trữ tin nhắn SMTP, tức là E-Mail. Để làm như vậy, tôi đang sử dụng asyncore
theo một ví dụ được đăng here. Tuy nhiên, asyncore.loop()
đang chặn vì vậy tôi không thể làm bất kỳ điều gì khác trong mã.Làm thế nào để xử lý asyncore trong một lớp trong python, mà không chặn bất cứ điều gì?
Vì vậy, tôi đã nghĩ đến việc sử dụng chuỗi. Dưới đây là một ví dụ-mã cho thấy những gì tôi có trong tâm trí:
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()
Tôi hy vọng bạn sẽ có được hình ảnh. Lớp học MyServer
sẽ có thể bắt đầu và dừng nghe cổng 25 theo cách không chặn, có thể truy vấn tin nhắn trong khi nghe (hoặc không). Phương thức start
bắt đầu trình nghe asyncore.loop()
, trong đó, khi nhận được email, hãy thêm vào danh sách nội bộ. Tương tự, phương pháp stop
sẽ có thể dừng máy chủ này, như được đề xuất here.
Mặc dù thực tế mã này không hoạt động như tôi mong đợi để (asyncore có vẻ chạy mãi mãi, thậm chí tôi gọi là stop
phương pháp trên. Các error
tôi nâng cao được đánh bắt trong stop
, nhưng không phải trong target
hàm chứa asyncore.loop()
), Tôi không chắc liệu cách tiếp cận của tôi đối với vấn đề có hiệu quả hay không. Bất kỳ đề xuất nào để sửa mã trên hoặc đề xuất triển khai vững chắc hơn (mà không cần sử dụng phần mềm của bên thứ ba), được đánh giá cao.
Tôi cảm thấy có sự nhầm lẫn ở đó. Vấn đề với việc chặn 'asyncore.loop()' là gì? Bạn có hiểu tại sao bạn gọi hàm 'loop' và nó làm gì? – mmgp
@mmgp: Vấn đề với 'asyncore.loop()' là nó đang chặn.Tôi muốn có thể sử dụng lớp học bất kỳ lúc nào trong một số mã khác. Ở phía bên kia, tôi không phải là một chuyên gia về 'asyncore.loop()', nhưng AFAIK nó xử lý nội bộ 'select.select', trông giống như ví dụ. cho các tin nhắn SMTP đến trên cổng 25, trong trường hợp này. – Alex
bạn đã sử dụng bộ công cụ GUI chưa? Về cơ bản tất cả chúng đều dựa trên các vòng lặp sự kiện. Bạn phải sắp xếp những thứ sao cho chúng tạo ra các sự kiện để được xử lý bởi "vòng lặp sự kiện". Sự nhầm lẫn mà tôi đã đề cập là bởi vì bạn dường như không biết làm thế nào để sử dụng một vòng lặp sự kiện, là trường hợp? – mmgp