Smoke test: The origin of smoke test is from hardware industry where you turn on a new piece of hardware for the first time and make sure it does not end up catching fire and smoke. In Software industry that term becomes quite popular and here when a new build comes or you are moving your application to a new environment for testing you check the major functions of the application without getting into too deep. So in other words a Smoke test is designed to touch every part of the application in a cursory way.
If the smoke test fails, you can’t do the sanity test. It usually happens when an application program has many external dependencies, smoke testing may find problems with it (such as missing libraries).
It should be ideally performed on each build with a predefined set of scripts. On average it should not take more than an hour or so as it is shallow and wide.
Sanity Test: Once the application passes the smoke test you need to perform the sanity test on the build. A Sanity testing is a cursory testing; it is performed whenever a cursory testing is sufficient to prove the application is functioning according to specifications. This level of testing is a subset of regression testing. A Sanity test is usually unscripted. So you have your best experienced tester who would check the major functions of the application and certify the application is ready to move to the next level (such as UAT or Production etc)
See the Wikipedia articles linked below