Tag Info

The USPS actually has a free API for this and it works pretty well. You can submit up to 5 in one requests (no bulk requests). You'll need to register for an API key. The following is how this can be implemented using look ups for 2 zip codes in 1 request:
void Main()
{
var urlRoot = "http://production.shippingapis.com/ShippingAPI.dll";
var ...

I organized your directory structure a bit differently. Despite older code snippets on the internets, you don't need to bind the data to the data frame. But, you do need to fortify polygons to use with ggplot. Also, read.csv makes a data.frame, so you don't need to re-make one from that call.
library(ggplot2)
library(maptools)
library(rgdal)
...

Please note that this is quite a hard problem, as stated by the accepted answer.
I guess it didn't deter the folks at geonames.org though.
They have a file a country info file, which doesn't fit whole into this answer - limit is at 30000 chars apparently. There are regexes for about 150 countries.
I extracted the bits relevant to this question here :
AD ...

Use the Geocoding API from Google to first map the city to the corresponding lat-long pair. Then use the Geonames API to get the postal codes in nearby radius. Use the following format for the Geonames API
http://api.geonames.org/findNearbyPostalCodes?lat=47&lng=9&username=demo
Find more details here

I know that this post is TOO old, but making some research for a client I've found some useful functionality of Google Maps API and is so simple to implement, you just need to pass to the url the origin and destination ZIP codes, and it calculates the distance even with the traffic, you can use it with any language:
origins = 90210
destinations = 93030
mode ...