temail_requests: Test connection and catch exceptions - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit 14c45f09159644616167b9912b496fc97fc00f77 DIR parent d146c369bff58a9b0f37dd46224b771a5f96cbce HTML Author: Johann Bauer <bauerj@bauerj.eu> Date: Fri, 23 Mar 2018 14:04:11 +0100 email_requests: Test connection and catch exceptions Diffstat: M plugins/email_requests/qt.py | 59 ++++++++++++++++++++++++------- 1 file changed, 47 insertions(+), 12 deletions(-) --- DIR diff --git a/plugins/email_requests/qt.py b/plugins/email_requests/qt.py t@@ -22,7 +22,7 @@ # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. - +import random import time import threading import base64 t@@ -45,11 +45,12 @@ from PyQt5.QtWidgets import (QVBoxLayout, QLabel, QGridLayout, QLineEdit, from electrum.plugins import BasePlugin, hook from electrum.paymentrequest import PaymentRequest from electrum.i18n import _ +from electrum.util import PrintError from electrum_gui.qt.util import (EnterButton, Buttons, CloseButton, OkButton, WindowModalDialog, get_parent_main_window) -class Processor(threading.Thread): +class Processor(threading.Thread, PrintError): polling_interval = 5*60 def __init__(self, imap_server, username, password, callback): t@@ -59,6 +60,8 @@ class Processor(threading.Thread): self.password = password self.imap_server = imap_server self.on_receive = callback + self.M = None + self.connect_wait = 100 # ms, between failed connection attempts def poll(self): try: t@@ -80,13 +83,18 @@ class Processor(threading.Thread): self.on_receive(pr_str) def run(self): - self.M = imaplib.IMAP4_SSL(self.imap_server) - self.M.login(self.username, self.password) while True: - self.poll() - time.sleep(self.polling_interval) - self.M.close() - self.M.logout() + try: + self.M = imaplib.IMAP4_SSL(self.imap_server) + self.M.login(self.username, self.password) + except imaplib.IMAP4.error as e: + self.print_error(e) + self.connect_wait *= 2 + # Reconnect when host changes + while self.M and self.M.host == self.imap_server: + self.poll() + time.sleep(self.polling_interval) + time.sleep(random.randint(0, self.connect_wait)) def send(self, recipient, message, payment_request): msg = MIMEMultipart() t@@ -98,10 +106,13 @@ class Processor(threading.Thread): encode_base64(part) part.add_header('Content-Disposition', 'attachment; filename="payreq.btc"') msg.attach(part) - s = smtplib.SMTP_SSL(self.imap_server, timeout=2) - s.login(self.username, self.password) - s.sendmail(self.username, [recipient], msg.as_string()) - s.quit() + try: + s = smtplib.SMTP_SSL(self.imap_server, timeout=2) + s.login(self.username, self.password) + s.sendmail(self.username, [recipient], msg.as_string()) + s.quit() + except smtplib.SMTPException as e: + self.print_error(e) class QEmailSignalObject(QObject): t@@ -225,3 +236,27 @@ class Plugin(BasePlugin): password = str(password_e.text()) self.config.set_key('email_password', password) self.password = password + + check_connection = CheckConnectionThread(server, username, password) + check_connection.connection_error_signal.connect(lambda e: window.show_message( + _("Unable to connect to mail server:\n {}").format(e) + "\n" + + _("Please check your connection and credentials.") + )) + check_connection.start() + + +class CheckConnectionThread(QThread): + connection_error_signal = pyqtSignal(str) + + def __init__(self, server, username, password): + super().__init__() + self.server = server + self.username = username + self.password = password + + def run(self): + try: + conn = imaplib.IMAP4_SSL(self.server) + conn.login(self.username, self.password) + except BaseException as e: + self.connection_error_signal.emit(str(e))