URI: 
       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))