aboutsummaryrefslogtreecommitdiffstats
path: root/climl.py
diff options
context:
space:
mode:
Diffstat (limited to 'climl.py')
-rw-r--r--climl.py93
1 files changed, 93 insertions, 0 deletions
diff --git a/climl.py b/climl.py
new file mode 100644
index 0000000..cfc527c
--- /dev/null
+++ b/climl.py
@@ -0,0 +1,93 @@
+#!/usr/bin/python3
+
+import os
+import subprocess
+import confparser
+import imapclient
+import contextlib
+import backports.ssl
+import socket
+
+def conf_boolean_postprocess(src):
+ src = src.lower().strip()
+ if src == 'true' or src == 'on' or src == '1':
+ return True
+ return False
+
+def conf_postprocess(conf):
+ d = {
+ 'imap.tls': conf_boolean_postprocess,
+ 'imap.start_tls': conf_boolean_postprocess,
+ 'imap.tls_nocheck_hostname': conf_boolean_postprocess,
+ 'imap.tls_nocheck_ca': conf_boolean_postprocess,
+ }
+ return {key: d[key](value) if key in d else value
+ for key, value in conf.items()}
+
+@contextlib.contextmanager
+def connect_to_imap(conf, password):
+
+ cafile = conf.get('imap.tls_ca', None)
+
+ if cafile:
+ cafile = os.path.expanduser(cafile)
+
+ ssl_context = imapclient.create_default_context(cafile=cafile)
+
+ if conf.get('imap.tls_nocheck_hostname', False):
+ # don't check if certificate hostname doesn't match target hostname
+ ssl_context.check_hostname = False
+
+ if conf.get('imap.tls_nocheck_ca', False):
+ # don't check if the certificate is trusted by a certificate authority
+ ssl_context.verify_mode = backports.ssl.CERT_NONE
+
+ connection = imapclient.IMAPClient(host=conf.get('imap.server'),
+ ssl=conf.get('imap.tls', True),
+ ssl_context=ssl_context)
+ if conf.get('imap.start_tls', False):
+ connection.start_tls(ssl_context=ssl_context)
+ print('connection succeed')
+ connection.login(username=conf.get('imap.username'), password=password)
+ print('successfuly logged')
+
+ # TODO: replace shutdown by logouts when it will not timeout through ssl
+ try:
+ yield connection
+ #connection.logout()
+ except (connection.AbortError, socket.error, socket.timeout,
+ backports.ssl.SSLError, backports.ssl.CertificateError):
+ raise
+ else:
+ pass
+ #connection.logout()
+ finally:
+ connection.shutdown()
+
+def main():
+ confpath = os.path.expanduser('~/temp/conf.cfg')
+ conf = conf_postprocess(confparser.read_conf(confpath))
+ print('Read conf:', conf)
+ password_command = conf.get('imap.password_command', None)
+ if password_command:
+ password = subprocess.check_output(password_command, shell=True)
+ password = password.rstrip().decode('utf8')
+ print('got pasword:', password)
+
+ #connection = connect_to_imap(conf, password)
+ with connect_to_imap(conf, password) as connection:
+ print('selecting folder')
+ connection.select_folder(conf.get('imap.mailbox'))
+ print('entering idle mode')
+ connection.idle()
+ print('waiting for an event')
+ while True:
+ try:
+ result = connection.idle_check(timeout=10)
+ except KeyboardInterrupt:
+ break
+ print('result:', result)
+ print('end of connection')
+
+
+main() # dev mode for now