Email problems are tricky to debug and fix because of the amount of variables involved in actually sending a simple email. From server issues to simple spam blocks on the recipient end, the reasons why email may not work can be numerous.
However there are some basic steps to always follow when debugging your WordPress and WooCommerce email and by doing so you're likely to always fix the issue or find out the root cause.
Make sure your installation can actually send email at all.
Install the Check Email plugin from the official WordPress repo to check that your WordPress installation can actually send email. This will use the most basic of settings to see whether email can actually get out of your server. Sometimes email can be blocked because of some WordPress error. See our post here about diagnosing most WordPress errors easily.
Make sure that email isn't hiding in your destination's spam mailbox. Sometimes an email can have such a bad spam score that many servers and clients won't even let it get to the user's spam mailbox at all. It's just dropped on the way with no error reported to the receiver or the sender. In these cases you may think there is something wrong with your server's sending capability but it is actually just a really bad spam score.
Check the spammyness of your email
There are a number of reasons an email can get a high spam score. From being blacklisted to the server not being allowed to send mail for the domain. A fantastic tool which will help you get rid of all these errors is Mail Tester. Send an email from the server you're testing to the unique destination address provided by Mail Tester and you will get a score on the spammyness of the email. Mail Tester will also show you the steps to take to improve the quality of your email.
Be aware of the Gmail block
There is mostly unknown quirk of Gmail where emails sent from and to the same Gmail address and where the sender was not Gmail itself will be blocked by Gmail completely.
ie: you send an email from WordPress to your Gmail account with a from address as the same Gmail address. This is really common as people register their site admin email address as their Gmail address and then try to test their WordPress email by sending an email to themselves. It will not get through and there will be no error. It will just get killed.
Use a transactional email service
Sometimes it is very difficult to get a particular server sending email perfectly. Email is very tricky anyway and on certain setups it's much better to use a transactional email service. When running an online store where emails are critical, then it should be used by default anyway.
There are many different services each with its own unique features. Such as SendGrid, Mandrill, MailGun and MailJet. We recommend SendGrid as it has excellent monitoring features, a great WordPress plugin and a huge amount of free monthly emails with each account.
Simply sign up for an account with them, download the SendGrid WordPress Plugin and put in your credentials. That's usually enough to sort out most email sending issues.
Update your SPF record
An SPF record is a record in your DNS file for your domain which specifies which mail servers are allowed to send email on behalf of the domain. Most email clients will check the SPF record of the sending domain to see whether it was allowed to send it and whether it's likely to be spam or not.
Obviously you want your WordPress server to be allowed to send email for the domain it's serving the site for. You will need to add its IP address to your SPF record in order to make it ok for it to send.
There is a useful tool to create your SPF record at http://www.spfwizard.net/ which will allow you to enter all the servers you would like to be able to send and it will create the syntax needed for you to then go and add to (or edit) your DNS record at your host. Remember to include the IP address of your server, your MX records of the same domain, and any other services (eg: google.com if you use Google Apps) Any servers not specified will not be able to send email on behalf of the domain.
The DNS record is added as a TXT record and there is a useful tutorial on how to add it here. Obviously this post is for a UK host but the exact same principle will apply to your host.