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()26msg_charset=msg.get_charset()27ifmsg_charsetisNone:28charset="utf-8"29elifisinstance(msg_charset,str):30charset=msg_charset31else:32charset=msg_charset.get_output_charset()or"utf-8"33msg_data=msg_data.decode(charset)34self.stream.write(f"{msg_data}\n")35self.stream.write("-"*79)36self.stream.write("\n")3738defsend_messages(self,email_messages:list[EmailMessage])->int:39"""Write all messages to the stream in a thread-safe way."""40ifnotemail_messages:41return042msg_count=043withself._lock:44try:45stream_created=self.open()46formessageinemail_messages:47self.write_message(message)48self.stream.flush()# flush after each message49msg_count+=150ifstream_created:51self.close()52exceptException:53ifnotself.fail_silently:54raise55returnmsg_count