The USPS does have this information, but when I checked a year or two ago, you either have to (1) agree to use the information only for purposes of mailing packages, per their TOS; or (2) pay them, e.g. something like $500 for a list of all five digit ZIP codes plus associated cities and states (the "City State File").
Corrections very welcome!
Edit to add: As philfreo asked, I'm also very interested in knowing where the data in zipcodes.db comes from.
* The USPS already has this information
* ZIP codes are not precise enough to provide a single city/town result (in fact, many web sites already get this wrong).
* ZIP+4 codes will give you block-level detail, but I doubt more than a few percent of people know what their +4 digits are.