PowerShell Advanced — Topic #8

Validate email domains

Validar dominios de correo electrónico

Ensure that emails in a user list belong only to approved educational or corporate domains.

Asegurar que los correos de un listado pertenezcan exclusivamente a dominios educativos o corporativos autorizados.

Cybersecurity & Production Environment Warning

Advertencia de ciberseguridad y ambiente de producción

This exercise is for learning and testing purposes only. Do not run scripts against production directories, business-critical systems, enterprise repositories, user accounts, or identity-related datasets without proper authorization, testing, backups, change-control approval, least-privilege permissions, and compliance with your organization's cybersecurity policies.

Este ejercicio es únicamente para aprendizaje y pruebas. No ejecutes scripts contra directorios de producción, sistemas críticos, repositorios empresariales, cuentas de usuario o datos relacionados con identidad sin autorización, pruebas, respaldos, aprobación de control de cambios, permisos mínimos y cumplimiento de las políticas de ciberseguridad de tu organización.

Business Scenario

Escenario de negocio

An organization receives a CSV list of users, students, employees, vendors, or applicants. The file contains email addresses coming from multiple sources. Some records belong to the approved institutional domain, while others contain personal, external, misspelled, or unauthorized domains. Before importing the file into a system or using it for communication, the invalid domains must be separated for review.

Una organización recibe un archivo CSV con usuarios, estudiantes, empleados, proveedores o aplicantes. El archivo contiene correos electrónicos provenientes de diferentes fuentes. Algunos registros pertenecen al dominio institucional autorizado, mientras otros contienen dominios personales, externos, mal escritos o no autorizados. Antes de importar el archivo a un sistema o usarlo para comunicación, los dominios inválidos deben separarse para revisión.

What You Will Learn

Qué aprenderás

Sample Input

Entrada de ejemplo

UserIDNameEmail
1001Maria Lopezmaria.lopez@misistema.edu
1002Juan Perezjuan.perez@gmail.com
1003Ana Torresana.torres@misistema.edu
1004Carlos Diazcarlos.diaz@misistema.com
1005Laura Smithlaura.smith@misistema.edu
1006Pedro Ramospedro.ramos@yahoo.com

Base Example

Ejemplo base

The basic idea is to keep only email addresses that end with the approved domain.

La idea base es conservar solamente los correos que terminan con el dominio autorizado.

Import-Csv "C:\Data\Usuarios.csv" |
Where-Object { $_.Email -notmatch "@misistema\.edu$" }

Step 1 — Define the Source File

Paso 1 — Definir el archivo fuente

$sourceFile = "C:\Data\Usuarios.csv"
$validFile = "C:\Data\Usuarios_Validos.csv"
$reviewFile = "C:\Data\Usuarios_Dominio_Invalido.csv"

Step 2 — Import the Data

Paso 2 — Importar los datos

$users = Import-Csv -Path $sourceFile

Step 3 — Define Approved Domains

Paso 3 — Definir dominios autorizados

This version supports more than one approved domain if the organization uses multiple institutional domains.

Esta versión permite más de un dominio autorizado si la organización usa varios dominios institucionales.

$approvedDomains = @(
    "misistema.edu",
    "staff.misistema.edu"
)

Step 4 — Validate Each Email Domain

Paso 4 — Validar cada dominio de correo

$processed = foreach ($user in $users) {
    $email = $user.Email.Trim().ToLower()
    $domain = if ($email -match "@(.+)$") { $Matches[1] } else { "" }

    if ($approvedDomains -contains $domain) {
        $status = "Valid"
        $issue = ""
    }
    elseif ([string]::IsNullOrWhiteSpace($email)) {
        $status = "Review"
        $issue = "Missing email"
    }
    elseif ($domain -eq "") {
        $status = "Review"
        $issue = "Invalid email format"
    }
    else {
        $status = "Review"
        $issue = "Unauthorized domain"
    }

    $user | Add-Member -NotePropertyName EmailDomain -NotePropertyValue $domain -Force
    $user | Add-Member -NotePropertyName ValidationStatus -NotePropertyValue $status -Force
    $user | Add-Member -NotePropertyName ValidationIssue -NotePropertyValue $issue -Force
    $user
}

Step 5 — Export Valid and Review Records

Paso 5 — Exportar registros válidos y para revisión

$validUsers = $processed | Where-Object { $_.ValidationStatus -eq "Valid" }
$reviewUsers = $processed | Where-Object { $_.ValidationStatus -eq "Review" }

$validUsers | Export-Csv -Path $validFile -NoTypeInformation -Encoding UTF8
$reviewUsers | Export-Csv -Path $reviewFile -NoTypeInformation -Encoding UTF8

Write-Host "Valid users: $($validUsers.Count)"
Write-Host "Users for review: $($reviewUsers.Count)"

Complete Script

Script completo

$sourceFile = "C:\Data\Usuarios.csv"
$validFile = "C:\Data\Usuarios_Validos.csv"
$reviewFile = "C:\Data\Usuarios_Dominio_Invalido.csv"

$approvedDomains = @(
    "misistema.edu",
    "staff.misistema.edu"
)

$users = Import-Csv -Path $sourceFile

$processed = foreach ($user in $users) {
    $email = $user.Email.Trim().ToLower()
    $domain = if ($email -match "@(.+)$") { $Matches[1] } else { "" }

    if ($approvedDomains -contains $domain) {
        $status = "Valid"
        $issue = ""
    }
    elseif ([string]::IsNullOrWhiteSpace($email)) {
        $status = "Review"
        $issue = "Missing email"
    }
    elseif ($domain -eq "") {
        $status = "Review"
        $issue = "Invalid email format"
    }
    else {
        $status = "Review"
        $issue = "Unauthorized domain"
    }

    $user | Add-Member -NotePropertyName EmailDomain -NotePropertyValue $domain -Force
    $user | Add-Member -NotePropertyName ValidationStatus -NotePropertyValue $status -Force
    $user | Add-Member -NotePropertyName ValidationIssue -NotePropertyValue $issue -Force
    $user
}

$validUsers = $processed | Where-Object { $_.ValidationStatus -eq "Valid" }
$reviewUsers = $processed | Where-Object { $_.ValidationStatus -eq "Review" }

$validUsers | Export-Csv -Path $validFile -NoTypeInformation -Encoding UTF8
$reviewUsers | Export-Csv -Path $reviewFile -NoTypeInformation -Encoding UTF8

Write-Host "Valid users: $($validUsers.Count)"
Write-Host "Users for review: $($reviewUsers.Count)"

Expected Result

Resultado esperado

Valid Emails

Correos válidos

NameEmailStatus
Maria Lopezmaria.lopez@misistema.eduValid
Ana Torresana.torres@misistema.eduValid
Laura Smithlaura.smith@misistema.eduValid

Records for Review

Registros para revisión

NameEmailIssue
Juan Perezjuan.perez@gmail.comUnauthorized domain
Carlos Diazcarlos.diaz@misistema.comUnauthorized domain
Pedro Ramospedro.ramos@yahoo.comUnauthorized domain

Validation Checklist

Lista de validación

Professional Notes

Notas profesionales

Email domain validation is not only a formatting exercise. In institutional environments, email domains can be tied to identity management, access control, student records, employee onboarding, vendor communication, and cybersecurity policies. Invalid domains should normally be reviewed before access is granted or official communication is sent.

La validación de dominios de correo no es solamente un ejercicio de formato. En ambientes institucionales, los dominios pueden estar relacionados con gestión de identidad, control de acceso, expedientes estudiantiles, onboarding de empleados, comunicación con proveedores y políticas de ciberseguridad. Los dominios inválidos normalmente deben revisarse antes de otorgar acceso o enviar comunicación oficial.