OVH email manager script using docopt
Overall, it looks quite fine, with some smaller and bigger issues.

Parsing the add command

It's not so great to use the '&lt;address&gt;' string twice here:


    if args['&lt;address&gt;']:

        emails = (
                  {
                   'address': args['&lt;address&gt;'],
        # ...



You might mistype one of them. Or you might change something later and forget to update it everywhere. It would be better to put the value of args['&lt;address&gt;'] into a variable, and use that variable in evaluations and assignments.

This part is also awkward:


        emails = ( ... )
        if args['--description']:
            emails[0]['description'] = args['&lt;description&gt;']
        if args['--pswd']:
            emails[0]['password'] = args['&lt;password&gt;']



It would be much easier to use description and password variables to store defaults, then update these variables if --description or --pswd were given, and finally create the emails tuple.

Like this:

    address = args['&lt;address&gt;']
    if address:
        password = None
        description = None
        if args['--description']:
            description = args['&lt;description&gt;']
        if args['--pswd']:
            password = args['&lt;password&gt;']
        emails = (
            {
                'address': address,
                'password': password,
                'description': description,
            },
        )


Parsing the remove command

Here, if the second if statement is true,
it will overwrite the effect of the first:


    if args['&lt;address&gt;']:
        emails = (
            {
                'address': args['&lt;address&gt;'],
            },
        )
    if args['--file']:
        emails = fp.process_file(args['&lt;filename&gt;'])



That suggest that you should use an elif, and switch the order of the statements:

    if args['--file']:
        emails = fp.process_file(args['&lt;filename&gt;'])
    elif args['&lt;address&gt;']:
        emails = (
            {
                'address': args['&lt;address&gt;'],
            },
        )


emails might be undefined

Both the parsing of add and remove have a problem:
As their last step they do something with emails,
for example eman.add_emails(emails) and eman.remove_emails(emails),
but at that point the emails variable might be undefined.

This can be fixed by adding validation for these commands.
It looks that either of these must be true, checked in this order:


--file was specified and &lt;filename&gt; parameter was given
&lt;address&gt; parameter was given


For example:

if args['--file']:
    filename = args['&lt;filename&gt;']
    if filename:
        emails = fp.process_file(filename)
    else:
        raise Exception("Filename parameter missing")
else:
    address = args['&lt;address&gt;']
    if address:
        emails = ( ... )
    else:
        raise Exception("Address parameter missing")

# main action