So how the Password system works in Portal Engine is as soon as the "Reset Password" web part is hit, it clears the PasswordHash field in the UserInfo after it validates it. Which means after this (when the ACTUAL user visits) the field is empty.
So an actually very simple work around was to wrap the GetUserInfo call in a cache helper WITHOUT putting a dependency on it. This way it would get the UserInfo (with hash) the first call (the 'email software'), and then when the user visits it, it would get the cached UserInfo that would still have the hash.
Here's the V11/V12 zip you can download and install. Just replace the "Reset Password" with this webpart.