Example #1
0
    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']))
Example #2
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)) == []
Example #3
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
Example #4
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)) == []
Example #5
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
Example #6
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
Example #7
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
Example #8
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)
Example #9
0
 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']))
Example #10
0
    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']))
Example #11
0
 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']))
Example #12
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)
Example #13
0
    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']))
Example #14
0
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))
Example #15
0
    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']))