1""" 2Email backend that writes messages to console instead of sending them. 3""" 4 5from__future__importannotations 6 7importsys 8importthreading 9fromtypingimportTYPE_CHECKING,Any1011from.baseimportBaseEmailBackend1213ifTYPE_CHECKING:14from..messageimportEmailMessage151617classEmailBackend(BaseEmailBackend):18def__init__(self,*args:Any,**kwargs:Any)->None:19self.stream=kwargs.pop("stream",sys.stdout)20self._lock=threading.RLock()21super().__init__(*args,**kwargs)2223defwrite_message(self,message:EmailMessage)->None:24msg=message.message()25msg_data=msg.as_bytes()26charset=(27msg.get_charset().get_output_charset()ifmsg.get_charset()else"utf-8"28)29msg_data=msg_data.decode(charset)30self.stream.write(f"{msg_data}\n")31self.stream.write("-"*79)32self.stream.write("\n")3334defsend_messages(self,email_messages:list[EmailMessage])->int:35"""Write all messages to the stream in a thread-safe way."""36ifnotemail_messages:37return038msg_count=039withself._lock:40try:41stream_created=self.open()42formessageinemail_messages:43self.write_message(message)44self.stream.flush()# flush after each message45msg_count+=146ifstream_created:47self.close()48exceptException:49ifnotself.fail_silently:50raise51returnmsg_count