Posts Tagged google contacts

gContactSync 0.3.0 Beta 1 Available

I’ve just released the first beta version of 0.3.0. I feel it is ready to be in a beta as there are no known bugs other than some quirks with postal addresses in Google’s API.  For now postal address synchronization is disabled by default, but you can enable it in the Advanced tab of the Preferences dialog.

This version adds support for importing friends from Facebook, including photos.  It can also import contacts from Plaxo and usernames/photos from your friends on MySpace.  Right now the import does not attempt to match contacts that it finds with existing contacts and imports from Facebook and MySpace do not include e-mail addresses.

As a recap, here’s a quick list of the features.  Download link at the bottom.


  • Can synchronize your Google Contacts (external link) (Gmail, Google Apps, etc.) with Mozilla Thunderbird (external link).
  • Supports multiple Google Accounts and Address Books
  • Groups in Google can be synchronized with individual Address Books or mailing lists in one AB
  • Each Address Book can be synchronized with one of the following:
    • All contacts and all groups with mailing lists
    • One specific group
    • All contacts
  • Every synchronized AB can have its own custom settings
  • You can choose to complete synchronize your contacts (so Thunderbird matches Google), to only read changes from Google but never apply TB’s changes, or to only write to Google and never apply changes made remotely.
  • Contact photos are synchronized (only visible in Thunderbird 3 & Seamonkey 2)
  • Supports importing contacts/friends from Facebook, MySpace, and Plaxo, including photos.

Changes from 0.2:

  • The Accounts section of the Preferences dialog has been moved to its own dialog
  • Each Address Book now can have its own preferences (defaulting to their previous value in 0.2) and synchronization settings
  • New fields (“People”) and types for existing fields (many more phone number types)
  • Contact photos are synchronized (only visible in Thunderbird 3 & Seamonkey 2)
  • The birthday field in Thunderbird 3 is synchronized
  • More links in the gContactSync menu
  • The Sync button can now be customized like a normal toolbar button in Thunderbird. However, you must go to View -> Toolbars -> Customize and add the button to the toolbar yourself
  • You can synchronize from the main Thunderbird window
  • The import functionality is new.

You can download the latest version of 0.3 here.

, , , , , ,


gContactSync 0.2.8

gContactSync version 0.2.8 has been released.  I realized that I have been forgetting to make a quick blog post about each release, so here’s a basic summary of recent versions.

Download here.

The best way to stay up-to-date on new versions is probably through Twitter: gcontactsync

Supported Applications

  • Thunderbird 2
  • Thunderbird 3 (all versions, including beta 4 and 3.0pre)
  • Thunderbird 3.1a1pre
  • Seamonkey 2 (all versions, including beta 2 and 2.0pre)

Version 0.2.8

  • Fixes ‘broken’ usernames that were able to get an authentication token but failed when trying to get contacts or groups. (usernames only without a domain or with spaces at the beginning or end)
  • Fixed the install.rdf file for Seamonkey

Version 0.2.7

  • Bug fix for renewing expired authentication tokens

Version 0.2.6

  • Updated the Portuguese translation
  • Mailing Lists (groups) in Thunderbird now use their translated names
  • The log moved to the main profile directory

Version 0.2.5

  • Adds the following new languages:
    • Portuguese (devezas on BabelZilla)
    • Russian (Glk63)
    • Spanish (with help from Guillermo Klew from

Version 0.2.4

  • Fixed a bug with adding or renaming groups
  • Minor updates to the Italian translation (thanks ZaZy)

Version 0.3 Update

This deserves its own blog post, but here is a basic summary.  I don’t have a tentative release date yet since this is just a hobby, not a job. Wink

The main delay is described here. College (a full 18 credits) and my job (programming) don’t exactly leave me with much free time, either.


  • Support for Google’s new API
  • Support for downloading contact photos*
  • Synchronized birthday field**
  • ‘Relation’ fields (Mother, Father, Coworker, etc.
  • More phone number types

Potential Features

  • The individual address fields may be synchronized instead of using the new address fields
  • Support for adding, updating, and removing contact photos

*I (among others) worked on contact photos for the Address Book in Thunderbird 3 beta 4/Seamonkey 2.0 Beta 2.  gContactSync 0.3 and up will download photos in all supported applications, but you’ll have to use TB 3 or SM 2 to see them.
**I worked on a birthday field for the address book in Thunderbird 3/Seamonkey 2.  If you use TB 2 the values are synchronized but not displayed.  Google also added a birthday field after the changes were made in Thunderbird.

, , , , ,

1 Comment

Online Tool for viewing Google Contacts


Since I finally got around to learning PHP, I decided to create a quick and simple online tool for viewing your Google Contacts.  It naturally supports the extra attributes that gContactSync uses (except allow remote content and preferred mail format since those aren’t too important).

My intention was just to make an easy way to view your synchronized Thunderbird/Google contacts from anywhere with Internet access with the ability to show the custom attributes added by gContactSync.  If you don’t use gContactSync you are better off using Gmail’s better-looking interface. 😉

It is read-only (you cannot update, delete, or add contacts or groups) for now.

I will put the source in CVS soon after I clean it up.  It reuses a lot of the JavaScript from gContactSync 0.2.


You can find it here.  Click on the Login button to be redirected to a page from Google.  If you are already signed into a Google Account then you can click on a button to grant access to your contacts for (my website).

If you choose to grant access, a token is stored and matched with a cookie on your computer so you only have to sign in once.  This token can be used to access your contacts by retrieving, updating, adding, or deleting contacts and contact groups but your username and password cannot be obtained or modified using this token.  You can read more about this authentication method (called AuthSub) here.

You will be redirected back to where the one-use token is exchanged with a multi-use token (still only for contacts).  Then, your groups and the first 25 contacts will be obtained.  Click on a group (left side) to show the contacts in it and click on a contact to view more details.  Everything is on the same page right now and contacts are obtained using AJAX so the entire page is not refreshed until you logout.

Only 25 contacts (for now) are shown at a time so there are links to the previous and next 25 contacts, if applicable, at the bottom of the list.

Click the Logout button when you are finished, which will de-activate your token unless you want it to remain valid for future use on the site. Logging out takes a few seconds before giving any feedback.

As a sidenote, if it doesn’t work try waiting for 10 or 15 minutes before letting me know because I am actively working on the page and sometimes make mistakes.  I just caught a nasty virus (which ruined my first day off), so I may be slow to reply.


  • JavaScript must be enabled for
  • Cookies enabled for (only needed until the page or browser is closed)
  • Firefox 3.0.6 or higher (tested with a fairly recent build of Shiretoko 3.1b3pre and Firefox 3.0.6).  It does not work in Internet Explorer 6, 7, or 8 right now, and it might not ever since I spend a lot of time at work making a website IE-compatible and it is neither fun nor easy.  I’m guessing anyone that uses this already uses Thunderbird and Firefox, but if that isn’t the case let me know and I’ll see what I can do.


No Comments

gContactSync 0.2.0a2


gContactSync 0.2 takes advantage of Google’s updated and improved API for obtaining and modifying contacts.  Duplicates are allowed which, combined with a rewrite of the synchronization code, provides a significantly faster synchronization process.  The longest delay now seems to be receiving the contacts from Google.  There may be some room for improvement there, but I do not want to make too many changes yet until I make sure that the ones I made did not introduce any bugs.

The new API exposes the system groups, which include  My Contacts, Family, Friends, and Coworkers.  All contacts from the account, including Suggested Contacts are in the synchronized address book.  There is a mailing list for each of the pre-defined system groups and each custom group.

You can download it here, but I rewrote the most important code and there may be bugs I haven’t found in it yet.  I would only advise those who have hundreds or thousands of contacts and receive the “Unresponsive Script” warning to try it.  Please read the upgrade instructions below.

NOTE: Google allows contacts without e-mail addresses, but Thunderbird will break if a contact without an e-mail address is manually added to a mailing list as explained in Bug 20153.  If you encounter that bug in 0.1.x please let me know because it is somewhat difficult to fix and all attempts to synchronize after it breaks will fail.  To avoid this, 0.2 adds an email address “nobody@nowhere.invalid” to any contact without one.  However, only unique e-mail addresses are allowed in mailing lists, so only one contact with an empty e-mail address is allowed per group/mailing list is allowed until o.2.0b1.  The other contacts will appear in the address book only.

Current Features

  • All the features of 0.1
  • Duplicates (multiple contacts with the same e-mail address) are allowed
  • Much faster synchronization
  • Only US English (en-US) until I finish adding features and strings
  • Customization of how addresses are synchronized
  • Default groups are enabled (Family, Friends, Coworkers) as mailing lists in Thunderbird


  • Thunderbird 2.0 or Thunderbird 3.0 (a1pre through the trunk build b3pre) or Seamonkey 2.0 only (not 1.1.x)
  • A Google account or Google-hosted account
  • An Internet connection faster than dialup (DSL, cable, satellite, etc)

Planned Features

  • More locales
  • Maybe
  • Let me know what else you would like, but I can’t promise anything

Upgrade instructions to 0.2.0

  • In the address book, synchronize contacts one last time.
  • Rename the synchronized address book(s), this is just so you have a backup of your contacts.
  • In the main window, go to Tools -> Add-ons -> gContactSync -> Options/Preferences
  • In the Accounts tab, select one account at a time in remove them.
  • Install the new version and restart Thunderbird.  There is no need to remove the previous version first.
  • Open the Address Book window and fill in the information for your first account.

Bugfixes/enhancements from 0.1.x

  • Bug 20527 – Avoid HTTP Request errors when the Address Book window is closed
  • Bug 20509 – Add Seamonkey support
  • Bug 20508 – Consider adding overlay.css to customizeToolbar.xul
  • Bug 20487 – Add shortcut to preferences in the Address Book
  • Bug 20486 – Improve Address Preferences
  • Bug 20352 – Update gContactSync to use Contacts Data API 2
  • Bug 20148 – Default groups dont appear in Thunderbird
  • Bug 19786 – Support for Google’s ‘Most Contacted’ & ‘Suggested Contacts’

Known Bugs:

  • Bug 20153 – Partial fix only – Groups containing contacts without email addresses break in Thunderbird

, , , ,

No Comments

Slightly improved Groups support, bug fix, and Reminder

I have slightly improved support for Groups.  Instead of just showing the groups, you can now either remove a contact from groups that it is in (by deleting the groups in the Edit Card Dialog) and add a contact to existing groups by adding a comma, space, and the name of the group to the end of the Groups textbox.

For a simple example, pretend John Doe is in two groups, Group 1 and Group 2 and you want to remove him from Group 1 and add him to the existing group named Group 3.

Go to the edit card dialog and change this: Group 1, Group 2 to Group 1, Group 3

Bug Fix

I found a bug where the card view pane on the bottom would show some extra attributes from the last card viewed (third and fourth email and added screennames) while viewing a mailing list.


And, as a reminder, please check out the test release (which doesn’t have the fixes mentioned above) and let me know what you think.  I have instructions in my previous post.  The deadline for GSoC code changes is August 18, so I’d like to submit code that doesn’t have any major bugs…  I will still continue working on this extension after that date, of course.

, ,

No Comments

E-mail Addresses With Special Characters

I wanted to test some Unicode characters to see if they would sync properly.  So, I made up an e-mail address: üḯǟôÕ  The e-mail address synced without any error messages, but when I tried to edit the contact in Gmail I was given the following error: “Please enter a valid email address.”

So, while gContactSync and Thunderbird fully support Unicode, it appears that Google supports Unicode in every field except for email.

, ,

No Comments

Progress Update

L10n (Localization) Support

I finished adding support for localization to the extension.  It previously used l10n for the XUL files, but I just finished localizing strings in the scripts.  If you or somebody you know would like to help translate this extension please let me know.

Contact Conversion Rewrite

I completely re-wrote the methods that convert contacts from Google Contacts to Thunderbird Address Book cards and vice versa and went from nearly 700 lines of code to just under 275 (with comments).  To do so, I defined an object that stores Thunderbird’s name for the property (like DisplayName), and information on how Google stores the contact data in Atom/XML (the namespace, tag name, whether the data is stored in an attribute or in the child node, and more).

As of now, the supported attributes in Thunderbird include:

DisplayName, Notes, PrimaryEmail, SecondEmail, CellularNumber, HomePhone, WorkPhone, PagerNumber, FaxNumber, HomeAddress, WorkAddress, _AimScreenName, Company, and JobTitle

Possible Name

I finally decided on a possible name that some initial searching on Google tells me is unique: gContactSync.  Any feedback on the name is welcome and I’ll gladly change it if I find a better name.


I removed the need for the “shortDelay” preference.

, , , ,

No Comments

Extension Update

Name of the extension

I haven’t figured out a name for the extension yet. I initially named it gcontacts, but that name already exists for several programs. gcontactsync is a potential name. Any suggestions are welcome.


While syncing some newly-created cards, I encountered the following error:

org.xml.sax.SAXParseException: The entity name must immediately follow the “&”; in the entity reference.

The cause was an oversight on my part during the conversion from an nsIAbCard to an XML representation of the contact. I had forgotten to replace special characters, such as &, <, >, ‘, and ” with &, <, >, ‘, and “, respectively. I was fortunate to catch this error before it caused any real problems. I also wrote a function to do the opposite when converting from XML to an nsIAbCard.

Code refactoring and reformatting

While browsing through the code, I realized that I had changed many of the functions and their parameter types without changing the name and the contents of some of the global variables had also changed, so I started refactoring the code. I am also reformatting the code.

lastModifiedDate/Address Book Listener

Since I added support for lastModifiedDate, I no longer need the address book listener.

HTTP Request

I didn’t like my previous HTTP Request methods, so made a few slight modifications. I currently have a generic method for sending an XMLHttpRequest with arguments for the type (POST, PUT, GET, DELETE), URL, body, header label(s)/value(s), and arrays of commands, as strings, to be evaluated depending on the response (OK, 0, or offline, and any error) since the XMLHttpRequest used is asynchronous. This flexibility allows me to call the same function for any HTTP Request that the program must send and act on the outcome.

More contacts supported

When a request is sent to Google for contacts, it only sends the first 25 by default. I now use the max-results query parameter to get the first 250 contacts. 250 was arbitrary, but having that many contacts to sync would probably take a long time. There is now a preference for the number of contacts supported by the extension.

Miscellaneous Improvements

I made a few miscellaneous improvements that resulted in a slight performance increase.  More global variables were removed as well.

, , , , , ,

No Comments

June 1 – June 2, 2008

I have been busy recently, but I did manage to remove all the custom helper methods from the script that works with Google Contacts and just use one generic method instead.  I also sped up the sync process by removing the need for one of the for loops I had written.  I rewrote the function that updates a Google Contact, but it is still a little rough and will be rewritten again after I figure out the best way to do it.

, ,

No Comments

Offline Support Finished

Well, I finally finished adding offline support, so it will should work well offline.  It just sets text in the status bar to let the user know the sync cannot be completed while offline.  Once the user is back online it works like normal.  Any changes made while offline are synced since the listener still adds the last modified date to the custom4 property.  My next goals are to handle errors more smoothly, get some refactoring and additional commenting, and to add support for locales in the scripts.  Once these are done it might be ready for an alpha release.  Let me know if you are interested.

I have been busy the last few days and will be busy for the next day or two because there is a wedding in my family.

, , ,

No Comments