Workflows that include sending an e-mail will get stuck in Waiting because the recipient either does not have an e-mail address or they have Do no allow E-mails set to Do Not Allow. This can potential cause system performance issues as the number of waiting e-mails grows with each failed attempt. To prevent this from happening, you simply need to add a Check Condition to your workflows prior to the Send E-mail step. This check condition will look at the contact or account that the system will be sending the e-mail and check to make sure these two conditions are met.
Set your initial criteria and add the following before the send email step.
As you can see, if the contact (or account) meets the conditions, the e-mail is sent. If not, the workflow is canceled. This ensures that the system job (workflow) is set to a completed state and is no longer consuming resources.