I've tried a couple of methods that I've not really been happy with. What I've settled on for the next project is to:
- User enters username and email address
- Email sent with link containing url and guid param which has been stored in db with 48 hour expiry
- User confirms password to be reset
- New password is emailed to user
- Login with new password displays message or redirects to change password page.