This is a great example of a requirement for an Address Book plug-in. The difficulties with writing a reliable, functional one are several, however. I've toyed with the concept, but quickly became frustrated with the variables and the relatively unpredictable response to queries, even accurate, highly structured queries: the kind user are unlikely to perform.
First, you have the multiple city [both valid and invalid] response from the USPS for any given five-digit ZIP in inquiry. Which would you pick from a multiple response list? [Most queries result in a list in my experience, and not in a single matching record.] The first? Or, would you offer a user the choice to pick any of the valid cities on the list?
Second, since the ZIP plus 4 requires address matching by street number, street name and apartment, suite or other sub-unit, how would you handle the multiple page responses from USPS which are typical for 'almost complete' but not absolutely matching addresses in the database?
Frankly, it's much easier to simply query the information here for associated cities and states…
http://zip4.usps.com/zip4/citytown_zip.jsp
…or, here, for ZIP plus 4 matches:
http://zip4.usps.com/zip4/welcome.jsp
You can then very quickly pick from a list of possible matches and enter the data in your Address Book records. Some processes are simply far easier to achieve on a non-automated, human basis than by running a script or application. This is probably one of those.