Also, keep in mind, don't make the Zip Code required. Some countries (Ireland being the most prominent) don't have them.
What language are you using? I don't know of a datasource for it but I'm familiar with the Django project's localflavor contrib app:
http://docs.djangoproject.com/en/dev/ref/contrib/localflavor...
You can also try searching through programmable web:
The best resource that I know of is addressdoctor.com.
See their demo here: http://www.addressdoctor.com/lookup/default.aspx?lang=en
Via a web service, they enable you to produce the right address form fields on a country-by-country basis. I've met with their CEO in person and kicked the tires and would highly recommend them.
Here's a few http://www.geonames.org/postal-codes/
I use what came with freeside, my billing system. http://www.freeside.biz/freeside/ but it's not complete, so a better solution, if someone has one, would be great.
What do you need the postal codes for? How are you going to use them?
Address formats are different all over the world. Lots of places call them "postcodes" not zip codes (e.g. the UK). Some places have no postcodes (e.g. Ireland). Lots of places don't have 'states'. And the US has lots of 'cities' whereas lots of places would have local towns or counties.
You usually need addresses to send someone something. I'd suggest just putting in a text field and letting the user just type it in freeform.