A group in my company is implementing a single-sign-on REST API for our applications. This authentication service has a password reset function. The application sends the user
There's not really a better way for the general public. If it's an internal app, you could conceivably send encrypted e-mails that users have to decode with PGP, but that'd never fly for external users unless you've got a very high-value, niche product.
If e-mail is out, you'd have to use something like security questions, but they have their own (more significant, in my opinion) issues. Issues include: