It’s probably not necessary in this case, since Exchange should always be giving you well-formatted email addresses, but if you were accepting some string input that needs validation (and separation), I’d recommend just using the .NET System.Net.Mail.MailAddress class. If you try to cast a string to that type and it’s formatted wrong (multiple @ symbols, illegal characters, etc), you’ll get an exception. Once you have the object, it already provides “User” and “Host” properties you can read:
$maybeValidEmailAddresses = @('user@domain.com','bogus@string@invalid.com') foreach ($string in $maybeValidEmailAddresses) { try { $addr = [System.Net.Mail.MailAddress]$string Write-Host "User: $($addr.User), Host: $($addr.Host)" } catch { # Handle the error however you'd like. Write-Error -ErrorRecord $_ } }