Dmitri Bogomolov
7a89109fc9
and use logging without risk of circular import. Only subpackage that imports from debug is bitmessageqt - because it also uses debug.resetLogging(). Instead of from debug import logger is now recommended to use: import logging logger = logging.getLogger('default') All subclasses of StoppableThread now have a logger attribute. All threading related stuff except for set_thread_name() was moved from helper_threading to network.threads. Fixed two my mistakes from previous edit of debug in a1a8d3a: - logger.handlers is not dict but iterable - sys.excepthook should be set unconditionally
117 lines
4.4 KiB
Python
117 lines
4.4 KiB
Python
"""
|
|
src/class_smtpDeliver.py
|
|
========================
|
|
"""
|
|
# pylint: disable=unused-variable
|
|
|
|
import smtplib
|
|
import urlparse
|
|
from email.header import Header
|
|
from email.mime.text import MIMEText
|
|
|
|
import queues
|
|
import state
|
|
from bmconfigparser import BMConfigParser
|
|
from network.threads import StoppableThread
|
|
|
|
SMTPDOMAIN = "bmaddr.lan"
|
|
|
|
|
|
class smtpDeliver(StoppableThread):
|
|
"""SMTP client thread for delivery"""
|
|
name = "smtpDeliver"
|
|
_instance = None
|
|
|
|
def stopThread(self):
|
|
try:
|
|
queues.UISignallerQueue.put(("stopThread", "data")) # pylint: disable=no-member
|
|
except:
|
|
pass
|
|
super(smtpDeliver, self).stopThread()
|
|
|
|
@classmethod
|
|
def get(cls):
|
|
"""(probably) Singleton functionality"""
|
|
if not cls._instance:
|
|
cls._instance = smtpDeliver()
|
|
return cls._instance
|
|
|
|
def run(self):
|
|
# pylint: disable=too-many-branches,too-many-statements,too-many-locals
|
|
while state.shutdown == 0:
|
|
command, data = queues.UISignalQueue.get()
|
|
if command == 'writeNewAddressToTable':
|
|
label, address, streamNumber = data
|
|
elif command == 'updateStatusBar':
|
|
pass
|
|
elif command == 'updateSentItemStatusByToAddress':
|
|
toAddress, message = data
|
|
elif command == 'updateSentItemStatusByAckdata':
|
|
ackData, message = data
|
|
elif command == 'displayNewInboxMessage':
|
|
inventoryHash, toAddress, fromAddress, subject, body = data
|
|
dest = BMConfigParser().safeGet("bitmessagesettings", "smtpdeliver", '')
|
|
if dest == '':
|
|
continue
|
|
try:
|
|
u = urlparse.urlparse(dest)
|
|
to = urlparse.parse_qs(u.query)['to']
|
|
client = smtplib.SMTP(u.hostname, u.port)
|
|
msg = MIMEText(body, 'plain', 'utf-8')
|
|
msg['Subject'] = Header(subject, 'utf-8')
|
|
msg['From'] = fromAddress + '@' + SMTPDOMAIN
|
|
toLabel = map( # pylint: disable=deprecated-lambda
|
|
lambda y: BMConfigParser().safeGet(y, "label"),
|
|
filter( # pylint: disable=deprecated-lambda
|
|
lambda x: x == toAddress, BMConfigParser().addresses())
|
|
)
|
|
if toLabel:
|
|
msg['To'] = "\"%s\" <%s>" % (Header(toLabel[0], 'utf-8'), toAddress + '@' + SMTPDOMAIN)
|
|
else:
|
|
msg['To'] = toAddress + '@' + SMTPDOMAIN
|
|
client.ehlo()
|
|
client.starttls()
|
|
client.ehlo()
|
|
client.sendmail(msg['From'], [to], msg.as_string())
|
|
self.logger.info(
|
|
'Delivered via SMTP to %s through %s:%i ...',
|
|
to, u.hostname, u.port)
|
|
client.quit()
|
|
except:
|
|
self.logger.error('smtp delivery error', exc_info=True)
|
|
elif command == 'displayNewSentMessage':
|
|
toAddress, fromLabel, fromAddress, subject, message, ackdata = data
|
|
elif command == 'updateNetworkStatusTab':
|
|
pass
|
|
elif command == 'updateNumberOfMessagesProcessed':
|
|
pass
|
|
elif command == 'updateNumberOfPubkeysProcessed':
|
|
pass
|
|
elif command == 'updateNumberOfBroadcastsProcessed':
|
|
pass
|
|
elif command == 'setStatusIcon':
|
|
pass
|
|
elif command == 'changedInboxUnread':
|
|
pass
|
|
elif command == 'rerenderMessagelistFromLabels':
|
|
pass
|
|
elif command == 'rerenderMessagelistToLabels':
|
|
pass
|
|
elif command == 'rerenderAddressBook':
|
|
pass
|
|
elif command == 'rerenderSubscriptions':
|
|
pass
|
|
elif command == 'rerenderBlackWhiteList':
|
|
pass
|
|
elif command == 'removeInboxRowByMsgid':
|
|
pass
|
|
elif command == 'newVersionAvailable':
|
|
pass
|
|
elif command == 'alert':
|
|
title, text, exitAfterUserClicksOk = data
|
|
elif command == 'stopThread':
|
|
break
|
|
else:
|
|
self.logger.warning(
|
|
'Command sent to smtpDeliver not recognized: %s', command)
|