In my web application - we send "Account verification" link to users after registration. Sending "Account verification" link is an asynchronous process and we allow user to continue using the website for next 24 hours even in the case when either they have not received the mail or not verified their account.
In case mail send fails for any reason (we keep a track of all request in a table with the status failed/success etc.) - we try to send again every 30 min (my console application is scheduled in Windows task scheduler to run every 30 min). In that task - we pick all the failed requests from table and try to send mail again. Upon successfully sending of verification email, we update the status in database so that it is not picked next time.
This is just one example, there are many other use cases where I need to perform similar activities. Is this the right way to do or there is something better to do this. Please share your thoughts.