def do_list(self, arg): '''List mail in specified folder.''' try: args = docopt.docopt('\n'.join([ 'Usage: list [options] [<directory>]', '', 'Options:', ' -l, --limit=<LIMIT> Limit number of mail displayed', ' -h, --help Show this message', ]), argv=arg) except SystemExit: return try: limit = int(args['--limit'] or 10) except ValueError: limit = 10 for mail_info in search.fetch_mails_info(self.imap_account, limit=limit): sys.stdout.write( u'UID : {:<10} From : {:<40.40} Subject : {:.50}\n'.format( mail_info['uid'], mail_info['from'], mail_info['subject']))
def test_fetch_mails_info(self): self.imap_account = imaplib.IMAP4_SSL() reference_mails_info = [{ 'from': u'exampleFrom <*****@*****.**>', 'to': u'exampleTo <*****@*****.**>', 'subject': u'Mocking IMAP Protocols', 'id': u'1', 'flags': [u'\\Seen', u'NonJunk'], 'date': u'Tue, 03 Jan 1989 09:42:34 +0200', 'uid': u'1', }] assert list(search.fetch_mails_info( self.imap_account)) == reference_mails_info assert list(search.fetch_mails_info( self.imap_account, mail_set="42 24")) == reference_mails_info self.imap_account.error = True assert list(search.fetch_mails_info(self.imap_account)) == []
def main(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument('imap_server', help="IMAP Server hostname") parser.add_argument('searched_address', help="Searched address") parser.add_argument('-l', '--login', help="Login for IMAP account") parser.add_argument('--no-ssl', action='store_true', help="Don't use SSL") parser.add_argument('-v', '--verbose', action='store_true', help='increase output verbosity') args = parser.parse_args() password = getpass.getpass() logging.basicConfig(level=logging.INFO, stream=sys.stdout) try: imap_account = imap_cli.connect( hostname=args.imap_server, username=args.login, password=password, ssl=not args.no_ssl, ) for directory_status in sorted(imap_cli.status(imap_account), key=lambda obj: obj['directory']): imap_cli.change_dir(imap_account, directory_status['directory']) mail_set = search.fetch_uids( imap_account, search_criterion=[ search.create_search_criterion_by_mail_address( args.searched_address) ], ) if len(mail_set) > 0: sys.stdout.write(u'{} Directory\n'.format( directory_status['directory'])) for mail_info in search.fetch_mails_info(imap_account, mail_set=mail_set): format_string = u''.join([ u' {:<10} ', u'From : {:<30.30} \t', u'Subject : {:.50}\n' ]) sys.stdout.write( format_string.format(mail_info['uid'], mail_info['from'], mail_info['subject'])) imap_cli.disconnect(imap_account) except KeyboardInterrupt: log.info('Interrupt by user, exiting') return 0
def test_fetch_mails_info(self): self.imap_account = imaplib.IMAP4_SSL() reference_mails_info = [{ 'from': u'exampleFrom <*****@*****.**>', 'to': u'exampleTo <*****@*****.**>', 'subject': u'Mocking IMAP Protocols', 'id': u'1', 'flags': [u'\\Seen', u'NonJunk'], 'date': u'Tue, 03 Jan 1989 09:42:34 +0200', 'uid': u'1', }] assert list(search.fetch_mails_info( self.imap_account)) == reference_mails_info assert list( search.fetch_mails_info(self.imap_account, mail_set="42 24")) == reference_mails_info self.imap_account.error = True assert list(search.fetch_mails_info(self.imap_account)) == []
def main(): args = docopt.docopt('\n'.join(__doc__.split('\n')[2:]), version=const.VERSION) logging.basicConfig( level=logging.DEBUG if args['--verbose'] else logging.INFO, stream=sys.stdout, ) connect_conf = config.new_context_from_file(args['--config-file'], section='imap') if connect_conf is None: return 1 display_conf = config.new_context_from_file(args['--config-file'], section='display') if args['--format'] is not None: config_key = 'format_thread' if args['--thread'] else 'format_list' display_conf[config_key] = args['--format'] if args['--limit'] is not None: try: limit = int(args['--limit']) if limit < 1: raise ValueError except ValueError: log.error('Invalid argument limit : {}'.format(args['--limit'])) return 1 else: limit = None try: imap_account = imap_cli.connect(**connect_conf) imap_cli.change_dir( imap_account, directory=args['<directory>'] or const.DEFAULT_DIRECTORY) if args['--thread'] is False: for mail_info in search.fetch_mails_info(imap_account, limit=limit): sys.stdout.write( display_conf['format_list'].format(**mail_info)) sys.stdout.write('\n') else: threads = search.fetch_threads(imap_account, limit=limit) mail_tree = search.threads_to_mail_tree(threads) for output in search.display_mail_tree( imap_account, mail_tree, format_thread=display_conf['format_thread']): sys.stdout.write(output) sys.stdout.write('\n') imap_cli.disconnect(imap_account) except KeyboardInterrupt: log.info('Interrupt by user, exiting') return 0
def main(): args = docopt.docopt('\n'.join(__doc__.split('\n')[2:]), version=const.VERSION) logging.basicConfig( level=logging.DEBUG if args['--verbose'] else logging.INFO, stream=sys.stdout, ) connect_conf = config.new_context_from_file(args['--config-file'], section='imap') if connect_conf is None: return 1 display_conf = config.new_context_from_file(args['--config-file'], section='display') if args['--format'] is not None: config_key = 'format_thread' if args['--thread'] else 'format_list' display_conf[config_key] = args['--format'] if args['--limit'] is not None: try: limit = int(args['--limit']) if limit < 1: raise ValueError except ValueError: log.error('Invalid argument limit : {}'.format(args['--limit'])) return 1 else: limit = None try: imap_account = imap_cli.connect(**connect_conf) imap_cli.change_dir(imap_account, directory=args['<directory>'] or const.DEFAULT_DIRECTORY) if args['--thread'] is False: for mail_info in search.fetch_mails_info(imap_account, limit=limit): sys.stdout.write( display_conf['format_list'].format(**mail_info)) sys.stdout.write('\n') else: threads = search.fetch_threads(imap_account, limit=limit) mail_tree = search.threads_to_mail_tree(threads) for output in search.display_mail_tree( imap_account, mail_tree, format_thread=display_conf['format_thread']): sys.stdout.write(output) sys.stdout.write('\n') imap_cli.disconnect(imap_account) except KeyboardInterrupt: log.info('Interrupt by user, exiting') return 0
def main(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument('imap_server', help="IMAP Server hostname") parser.add_argument('searched_address', help="Searched address") parser.add_argument('-l', '--login', help="Login for IMAP account") parser.add_argument('--no-ssl', action='store_true', help="Don't use SSL") parser.add_argument('-v', '--verbose', action='store_true', help='increase output verbosity') args = parser.parse_args() password = getpass.getpass() logging.basicConfig(level=logging.INFO, stream=sys.stdout) try: imap_account = imap_cli.connect( hostname=args.imap_server, username=args.login, password=password, ssl=not args.no_ssl, ) for directory_status in sorted(imap_cli.status(imap_account), key=lambda obj: obj['directory']): imap_cli.change_dir(imap_account, directory_status['directory']) mail_set = search.fetch_uids( imap_account, search_criterion=[ search.create_search_criterion_by_mail_address( args.searched_address)], ) if len(mail_set) > 0: sys.stdout.write(u'{} Directory\n'.format( directory_status['directory'])) for mail_info in search.fetch_mails_info(imap_account, mail_set=mail_set): format_string = u''.join([ u' {:<10} ', u'From : {:<30.30} \t', u'Subject : {:.50}\n']) sys.stdout.write(format_string.format( mail_info['uid'], mail_info['from'], mail_info['subject'])) imap_cli.disconnect(imap_account) except KeyboardInterrupt: log.info('Interrupt by user, exiting') return 0
def search_controller(req): params = req.params inputs = { "directory": params.get("directory") or const.DEFAULT_DIRECTORY, "tags": params.getall("tag") or None, "text": params.get("text") or None, } imap_cli.change_dir(imap_account, inputs["directory"]) search_criterion = search.create_search_criterion(tags=inputs["tags"], text=inputs["text"]) mail_set = search.fetch_uids(imap_account, search_criterion=search_criterion or []) mails_info = list(search.fetch_mails_info(imap_account, mail_set=mail_set)) return json.dumps(mails_info, indent=2)
def do_unseen(self, arg): '''List Unseen mail (equivalent to "search -t unseen").''' search_criterion = search.create_search_criterion(tags=['unseen']) mail_set = search.fetch_uids(self.imap_account, search_criterion=search_criterion) if len(mail_set) == 0: log.error('No unseen mail found') else: for mail_info in search.fetch_mails_info(self.imap_account, mail_set=mail_set): sys.stdout.write( u'UID : {:<10} From : {:<40.40} Subject : {:.50}\n'.format( mail_info['uid'], mail_info['from'], mail_info['subject']))
def do_search(self, arg): '''Search mail.''' usage = '\n'.join([ 'Usage: search [options]', '', 'Options:', ' -a, --address=<address> Search by address', ' -d, --date=<date> Search by date (YYYY-MM-DD)', ' -s, --size=<SIZE> Search by size (in bytes)', ' -S, --subject=<subject> Search by subject', ' -t, --tags=<tags> Searched tags (Comma separated)', ' -T, --full-text=<text> Searched tags (Comma separated)', ' -h, --help Show help options.', ]) try: args = docopt.docopt(usage, argv=arg) except SystemExit: return if args.get('--tags') is not None: args['--tags'] = args['--tags'].split(',') if args['--date'] is not None: try: date = datetime.datetime.strptime(args['--date'], '%Y-%m-%d') except ValueError: date = None else: date = None search_criterion = search.create_search_criterion( address=args['--address'], date=date, subject=args['--subject'], size=args['--size'], tags=args['--tags'], text=args['--full-text'], ) mail_set = search.fetch_uids(self.imap_account, search_criterion=search_criterion) if len(mail_set) == 0: log.error('No mail found') return 0 for mail_info in search.fetch_mails_info(self.imap_account, mail_set=mail_set): sys.stdout.write( u'UID : {:<10} From : {:<40.40} Subject : {:.50}\n'.format( mail_info['uid'], mail_info['from'], mail_info['subject']))
def search_controller(req): params = req.params inputs = { 'directory': params.get('directory') or const.DEFAULT_DIRECTORY, 'tags': params.getall('tag') or None, 'text': params.get('text') or None, } imap_cli.change_dir(imap_account, inputs['directory']) search_criterion = search.create_search_criterion(tags=inputs['tags'], text=inputs['text']) mail_set = search.fetch_uids(imap_account, search_criterion=search_criterion or []) mails_info = list(search.fetch_mails_info(imap_account, mail_set=mail_set)) return json.dumps(mails_info, indent=2)
def imap_search(adress): ensure_connection() search_criterion = search.create_search_criterion(address=adress) mail_set = search.fetch_uids( imap_account, search_criterion=search_criterion) if len(mail_set) == 0: print 'VIMAP: No mail found' return 0 reset_buffer('vimap-list') b = vim.current.buffer b[:] = None for mail_info in search.fetch_mails_info(imap_account, mail_set=mail_set): b.append(display_conf['format_list'].format( **mail_info).replace('\n', ' ')) b[0] = u'Mails from «{}»:'.format(adress) for key, action in list_mappings: vim.command("nnoremap <silent> <buffer> {} {}".format(key, action))