Additional suggestions:
1. To trap embedded spaces within an invalid entry:
and not Contains(Trim([Contact Email]," "))
2. To ensure that a "." comes after the "@":
and Contains(Trim(Part([Contact Email], 2, "@" )),".")
3. Instead of a boolean, create a text-formula field that explains the problem or is "" if no problem is found. Then display the text-formula on the form if it's not "". That way, if the user has erred, they get some feedback. Here's an example that captures the most common problems and displays one-step-at-a-time feedback:
var bool outerSpace = Trim( [Registrant Email] ) <> [Registrant Email];
var bool innerSpace = Contains( Trim( [Registrant Email] ), " " );
var bool missingAt = not Contains( [Registrant Email], "@" );
var bool missingSuffix = Trim( Part( [Registrant Email], 2, "." ) ) = "";
var bool missingName = Trim( Part( [Registrant Email], 1, "@") ) = "";
var bool missingCompany = Trim( Part( Part( [Registrant Email], 2, "@" ), 1, "." ) ) = "";
var text warnMessage = If(
$outerSpace, "Has extra spaces at the beginning or end. Please remove them.",
$innerSpace, "Has a space inside the email address.",
$missingAt, "Missing @ symbol.",
$missingSuffix, "Missing .com or other suffix.",
$missingName, "Missing name-text before the @ symbol.",
$missingCompany, "Missing company-name between @ and .com or other suffix.",
"" );
If( [Registrant Email] = "" or $warnMessage = "", "", "Invalid email: " & $warnMessage )