Posts Tagged ‘python’

Using googlecl to query google contacts from mutt

June 7, 2011 5 comments

googlecl is a neat tool for accessing the Google Contacts address book from the command line. mutt is a powerful email client that allows calling external tools for accessing an address book. Unfortunately, the output from googlecl is different from the input required by mutt. Here is a simple script that wraps googlecl to be used from mutt. Simply put the code in a file mutt-google-contacts and make it executable. Then call it from mutt by adding this to the ~/.muttrc file:

set query_command = "mutt-google-contacts '%s'"

Here is the script:


# Version 0.1 Copyright (C) 2011 Christof Schmitt
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see

# This script parses the output of 'google contacts list'
# ( and
# prints the queried email address in the format required by mutt
# (
# Usage: Install googlecl from
# and add
# set query_command = "mutt-google-contacts '%s'"
# to ~/.muttrc

import subprocess
import string
import sys

if not len(sys.argv) >= 2:
    print 'Usage: %s querystring' % sys.argv[0]

sys.stdout.write('Calling "google contacts list": ')

query = ' '.join(sys.argv[1:])
args = ['/usr/bin/google', 'contacts', 'list', '--title', '(?i).*' + query,
        '--fields', 'name,email', '--delimiter=;']

google = subprocess.Popen(args, stdout=subprocess.PIPE)
stdout, stderr = google.communicate()

if google.returncode != 0:
    print 'error'

print 'success'

for line in stdout.split('\n'):
    if len(line) > 0:
        name, emails = line.split(';')
        for email in emails.split(', '):
            if string.find(email, ' ') != -1:
                # with two or more addresses there is an additional
                # type (home, work, ...)
                typeoraddr, emailaddr = string.split(email, ' ')
                print emailaddr + '\t' + name + '\t' + typeoraddr
                # with only one address, there is no type field
                print email + '\t' + name
Categories: programming Tags: , ,