Strange that you "cannot" allow 4 characters TLDs. You are banning people from .info and .name, and the length limitation stop .travel and .museum, but yes, they are less common than 2 characters TLDs and 3 characters TLDs.
You should allow uppercase alphabets too. Email systems will normalize the local part and domain part.
For your regex of domain part, domain name cannot starts with '-' and cannot ends with '-'. Dash can only stays in between.
If you used the PEAR library, check out their mail function (forgot the exact name/library). You can validate email address by calling one function, and it validates the email address according to definition in RFC822.