There’s a pretty simple way to test if something is a valid email address but it’s nice to wrap that around with a bit of code to test for a stream or array of values.
The function and explanation follows.Here’s the full function with an explanation (and alternative way to make it work) afterwards.
<# .SYNOPSIS Returns if a string is a valid email address. Will also check all the elements of an array of email addresses. .DESCRIPTION Returns if a string is a valid email address. Will also check all the elements of an array of email addresses. .PARAMETER PassedEmailAddressArray This holds the email address to check (or array). .NOTES Name : Get-IsValidEmailAddress Author : HerringsFishBait.Com #> function Get-IsValidEmailAddress { param ( [Parameter(ValueFromPipeline=$true)] [string[]]$PassedEmailAddressArray=@() ) BEGIN { Write-Verbose "Started running $($MyInvocation.MyCommand)" } PROCESS { Write-Verbose "Checking for Validity on the following Email Addresseses" if ($PassedEmailAddressArray -eq $Null) { Return $False } $IsValidEmailAddress=$True ForEach ($EmailAddress in $PassedEmailAddressArray) { Try { New-Object System.Net.Mail.MailAddress($EmailAddress) > $null } Catch { $IsValidEmailAddress=$False } } Return $IsValidEmailAddress } END { Write-Verbose "Stopped running $($MyInvocation.MyCommand)" } }
The function is built around trying to create a new System.Net.Mail.MailAddress object from the email address string you’ve passed. If it triggers an error then the string isn’t a valid email address.
param ( [Parameter(ValueFromPipeline=$true)] [string[]]$PassedEmailAddressArray=@() )
This part allows us to pass an array of email addresses, stream a set of email addresses or even pass a stream of email address arrays.
The current logic is;
$IsValidEmailAddress=$True ForEach ($EmailAddress in $PassedEmailAddressArray) { Try { New-Object System.Net.Mail.MailAddress($EmailAddress) > $null } Catch { $IsValidEmailAddress=$False } } Return $IsValidEmailAddress
If this processes an array then the function returns $False if ANY of them are not valid. You could also do;
ForEach ($EmailAddress in $PassedEmailAddressArray) { Try { New-Object System.Net.Mail.MailAddress($EmailAddress) > $null } Catch { Write-Output=$False } }
Which would write $False to the output for each element that wasn’t correct in the array. You could then use more complicated logic to pull out the correct email addresses.
Categories: Powershell
Dosent seem to work in PS
Thanks! It relied on a log-processing function (Write-Log) I’ve written about earlier; I replaced the calls with Write-Verbose and it was all good!