⚠️ AVISO LEGAL / LEGAL DISCLAIMERES: Esta herramienta es código real diseñado para verificar credenciales SMTP. Se publica exclusivamente para fines educativos, investigación de seguridad autorizada, auditorías de infraestructura propia y entornos CTF. Usar esta herramienta para acceder a cuentas de terceros sin autorización explícita es ilegal bajo leyes como la CFAA (EE.UU.), Computer Misuse Act (UK) y equivalentes en todo el mundo. El autor no asume responsabilidad por usos indebidos.
EN: This tool contains real code designed to verify SMTP credentials. It is published exclusively for educational purposes, authorized security research, audits of infrastructure you own, and CTF environments. Using this tool to access third-party accounts without explicit authorization is illegal under laws such as the CFAA (USA), Computer Misuse Act (UK), and equivalents worldwide. The author assumes no liability for misuse.
- Descripción General
- Características
- Estructura del Proyecto
- Requisitos del Sistema
- Instalación
- Guía de la Interfaz
- Formatos de Archivo de Entrada
- Uso Paso a Paso
- Resultados y Archivos de Salida
- Lógica de Verificación SMTP
- Configuración Interna
- Cómo Funciona Técnicamente
- Solución de Problemas
SMTP Checker GUI es una aplicación de escritorio multiplataforma construida con Python y PySide6 (Qt6) que verifica la validez de credenciales de correo electrónico mediante intentos reales de autenticación contra servidores SMTP. La aplicación procesa listas de credenciales en lote con 50 hilos concurrentes, muestra resultados en tiempo real y organiza los hallazgos en archivos de salida estructurados.
Esta herramienta está diseñada para:
- Administradores de sistemas que auditan cuentas de correo en su propia infraestructura
- Investigadores de seguridad que estudian el comportamiento de servidores SMTP
- Profesionales de seguridad que realizan auditorías autorizadas de correo corporativo
- Desarrolladores que prueban configuraciones SMTP de sistemas propios
- Entornos CTF y laboratorios de seguridad
| Característica | Detalle |
|---|---|
| GUI moderna | Tema oscuro con acentos azules, construida con PySide6 (Qt6) |
| 2 modos de entrada | EMAIL:PASS y SERVER|PORT|USERNAME|PASS |
| 50 hilos concurrentes | ThreadPoolExecutor para procesamiento masivo rápido |
| Auto-detección de servidor | Prueba automáticamente prefijos mail., smtp., email. |
| Multi-puerto | Prueba puertos 465 (SSL), 587 (STARTTLS) y 25 |
| Log en tiempo real | Visualización en vivo de cada intento con estado VÁLIDO/INVÁLIDO |
| Resultados organizados | Carpetas con timestamp, archivos por servidor, resumen estadístico |
| Barra de progreso | Indicador visual durante la verificación |
| Estadísticas en vivo | Contadores de válidos/inválidos actualizados en tiempo real |
| Lanzador Windows | run.bat para inicio con un clic |
SMTP_GUI/
├── main.py # Aplicación principal — GUI + motor de verificación SMTP
├── requirements.txt # Dependencias Python (PySide6, colorama, easygui)
├── run.bat # Lanzador Windows (doble clic para iniciar)
├── README.md # Este archivo
├── LICENSE # Licencia MIT
└── Result/ # Directorio de salida (creado automáticamente)
└── MM-DD-YY_HH-MM-SS/
├── [servidor].txt # Credenciales válidas por servidor
├── _resumen.txt # Estadísticas del escaneo
└── _info.txt # Metadatos de la sesión
| Componente | Requisito |
|---|---|
| Python | 3.6 o superior |
| PySide6 | >= 6.0.0 |
| colorama | >= 0.4.4 |
| easygui | >= 0.98.0 |
| SO | Windows, Linux o macOS |
| Red | Conexión a internet o acceso a los servidores SMTP objetivo |
# 1. Clonar o descargar el repositorio
git clone https://github.com/ByteCodeSecure/SMTP-Checker-GUI.git
cd SMTP-Checker-GUI
# 2. (Recomendado) Crear entorno virtual
python -m venv venv
# Activar en Windows:
venv\Scripts\activate
# Activar en Linux/macOS:
source venv/bin/activate
# 3. Instalar dependencias
pip install -r requirements.txt
# 4. Lanzar la aplicación
python main.pyDoble clic en run.bat
El script ejecuta automáticamente python main.py y mantiene la ventana de consola abierta para ver errores si los hay.
La ventana principal (mínimo 800×600) tiene 4 pestañas:
┌─────────────────────────────────────────────────────────────────┐
│ SMTP CHECKER │
├──────────────┬─────────────────┬──────────┬────────────────────┤
│ EMAIL:PASS │ SERVER|PORT|... │ POP3 │ IMAP │
├──────────────┴─────────────────┴──────────┴────────────────────┤
│ │
│ Archivo: [ ruta/al/archivo.txt ] [Examinar] │
│ Email: [ tu@email.com ] │
│ │
│ ┌─ Log de Resultados ─────────────────────────────────────┐ │
│ │ [14:32:01] VÁLIDO → smtp.dominio.com:465:user@d.com │ │
│ │ [14:32:02] INVÁLIDO → mail.otro.com:587:user2@otro.com │ │
│ │ [14:32:03] ERROR → smtp.down.com: Connection timeout │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ Válidos: [12] Inválidos: [88] [████████░░░░] Progreso │
│ │
│ [Iniciar Verificación] │
└─────────────────────────────────────────────────────────────────┘
Acepta archivos con formato email:contraseña. La aplicación deduce automáticamente el servidor SMTP a partir del dominio del email.
Acepta archivos con servidor SMTP explícito en formato pipe. Úsala cuando ya conoces la configuración exacta del servidor.
Infraestructura de UI preparada. Actualmente muestra: "POP3 checker not implemented yet."
Infraestructura de UI preparada. Actualmente muestra: "IMAP checker not implemented yet."
Archivo de texto plano, una credencial por línea:
usuario@dominio.com:contraseña123
otro@empresa.com:MiPass!2024
admin@miservidor.com:P@ssw0rd
Reglas:
- Separador: dos puntos (
:) - El dominio del email se usa para construir el servidor SMTP
- Líneas con formato incorrecto se registran como error y se omiten
- Las líneas en blanco se ignoran
- Codificación: UTF-8
smtp.dominio.com|465|usuario@dominio.com|contraseña
mail.empresa.com|587|admin|MiPass!2024
correo.miserver.com|25|user@server.com|clave123
Reglas:
- Separador: barra vertical (
|) - Exactamente 4 campos por línea
- El puerto debe ser numérico
- Líneas con formato incorrecto se registran y omiten
Crea un archivo .txt con las credenciales a verificar en el formato correspondiente a la pestaña que usarás.
python main.py
# O doble clic en run.bat (Windows)Elige EMAIL:PASS o SERVER|PORT|USERNAME|PASS según tu archivo.
Haz clic en "Examinar" y selecciona tu archivo .txt.
En el campo "Email", ingresa una dirección de correo tuya. Las verificaciones exitosas enviarán un email de prueba a esta dirección (solo si hay credenciales válidas y el servidor lo permite).
El cuerpo del email de prueba contiene:
servidor|email|contraseña|puerto|SMTP RECEIVED
Haz clic en "Iniciar Verificación". La barra de progreso se activará y el log comenzará a mostrar resultados en tiempo real:
[14:32:01] Procesando: usuario@dominio.com
[14:32:02] VÁLIDO → smtp.dominio.com:465:usuario@dominio.com:contraseña
[14:32:03] INVÁLIDO → mail.dominio.com:587:usuario@dominio.com:contraseña
[14:32:04] ERROR → email.dominio.com:25 → Connection timed out
Al finalizar, la aplicación muestra el resumen y los resultados se encuentran en:
Result/
└── MM-DD-YY_HH-MM-SS/
Todos los resultados se guardan automáticamente en Result/[MM-DD-YY_HH-MM-SS]/:
Un archivo por cada servidor donde se encontraron credenciales válidas. Formato:
servidor|puerto|email|contraseña
smtp.dominio.com|465|usuario@dominio.com|contraseña123
smtp.dominio.com|465|otro@dominio.com|pass456
=== RESUMEN DE VERIFICACIÓN ===
Fecha: 03-28-25 14:35:22
Archivo de entrada: /ruta/al/archivo.txt
Total procesados: 500
Válidos: 12
Inválidos: 451
Errores de formato: 37
Timestamp: 03-28-25 14:32:00
Archivo: /ruta/al/archivo.txt
Email receptor: tu@email.com
Para cada credencial email@dominio.com:contraseña, la aplicación intenta 9 combinaciones (3 prefijos × 3 puertos):
| Intento | Servidor | Puerto | Protocolo |
|---|---|---|---|
| 1 | mail.dominio.com |
465 | SMTP_SSL |
| 2 | mail.dominio.com |
587 | SMTP + STARTTLS |
| 3 | mail.dominio.com |
25 | SMTP plano |
| 4 | smtp.dominio.com |
465 | SMTP_SSL |
| 5 | smtp.dominio.com |
587 | SMTP + STARTTLS |
| 6 | smtp.dominio.com |
25 | SMTP plano |
| 7 | email.dominio.com |
465 | SMTP_SSL |
| 8 | email.dominio.com |
587 | SMTP + STARTTLS |
| 9 | email.dominio.com |
25 | SMTP plano |
Se detiene en el primer éxito. Si los 9 fallan, la credencial se marca como INVÁLIDA.
Puerto 465 — SMTP_SSL (SSL/TLS Directo)
smtplib.SMTP_SSL(servidor, 465, timeout=15)
server.login(usuario, contraseña)
server.sendmail(...)Puerto 587 — SMTP con STARTTLS
smtplib.SMTP(servidor, 587, timeout=15)
server.ehlo()
server.starttls()
server.login(usuario, contraseña)
server.sendmail(...)Puerto 25 — SMTP Plano
smtplib.SMTP(servidor, 25, timeout=15)
server.ehlo()
server.login(usuario, contraseña)
server.sendmail(...)15 segundos por intento de conexión. Con 50 hilos y 9 intentos por credencial, el tiempo total depende de la velocidad de los servidores.
Valores configurados directamente en main.py:
| Parámetro | Valor | Descripción |
|---|---|---|
self.host |
["mail.", "smtp.", "email."] |
Prefijos de servidor para auto-detección |
self.port |
[465, 587, 25] |
Puertos SMTP a probar |
self.timeout |
15 |
Timeout por conexión (segundos) |
ThreadPoolExecutor |
50 |
Número de hilos concurrentes |
| Directorio de salida | Result/ |
Carpeta de resultados (relativa al ejecutable) |
Hilo Principal (GUI — Qt Event Loop)
│
├── Hilo de Verificación (daemon thread)
│ │
│ └── ThreadPoolExecutor (50 workers)
│ │
│ ├── Worker 1 → intento SMTP
│ ├── Worker 2 → intento SMTP
│ ├── ...
│ └── Worker 50 → intento SMTP
│
└── Qt Signals (thread-safe)
├── update_log(mensaje) → actualiza log UI
├── update_stats(v, i) → actualiza contadores
└── finished() → indica finalización
Archivo de entrada
│
▼
┌──────────────────┐
│ Leer líneas │ UTF-8, ignorar errores de codificación
│ + Validar │ Verificar separador correcto (: o |)
└────────┬─────────┘
│ Formato inválido → log error + continuar
▼
┌──────────────────┐
│ Construir lista │ Tab 1: extraer dominio → 9 combinaciones
│ de intentos │ Tab 2: usar servidor/puerto directamente
└────────┬─────────┘
▼
┌──────────────────┐
│ Enviar a │ ThreadPoolExecutor (50 hilos)
│ thread pool │
└────────┬─────────┘
▼
┌──────────────────┐
│ Por cada │ Conectar SMTP → Login → Enviar email prueba
│ intento: │ Éxito: emitir update_log("VÁLIDO", ...)
│ │ Fallo: emitir update_log("INVÁLIDO", ...)
│ │ Error: emitir update_log("ERROR", ...)
└────────┬─────────┘
▼
┌──────────────────┐
│ Guardar │ Result/timestamp/servidor.txt
│ resultados │ Result/timestamp/_resumen.txt
└──────────────────┘
| Problema | Causa | Solución |
|---|---|---|
ModuleNotFoundError: PySide6 |
PySide6 no instalado | pip install -r requirements.txt |
| La app no inicia en Windows | Python no en PATH | Reinstalar Python marcando "Add to PATH" |
| Todos los resultados son error | Firewall bloqueando puertos SMTP | Verificar que los puertos 465/587/25 estén abiertos |
Resultado vacío en Result/ |
Ninguna credencial válida | Normal — ningun servidor aceptó las credenciales |
| Muy lento con muchas líneas | Servidores lentos + timeout 15s | Normal; 50 hilos procesan en paralelo |
SMTPAuthenticationError |
Credencial incorrecta | Se registra como INVÁLIDO correctamente |
ConnectionRefusedError |
Puerto cerrado en ese servidor | Se prueba el siguiente puerto automáticamente |
| La GUI se congela | Proceso en segundo plano activo | La verificación corre en hilo separado — esperar a que termine |
Archivo _info.txt incorrecto |
Ruta con caracteres especiales | Usar rutas sin espacios o caracteres especiales |
- Overview
- Features
- Project Structure
- System Requirements
- Installation
- Interface Guide
- Input File Formats
- Step-by-Step Usage
- Output & Result Files
- SMTP Verification Logic
- Internal Configuration
- How It Works Technically
- Troubleshooting
SMTP Checker GUI is a cross-platform desktop application built with Python and PySide6 (Qt6) that verifies the validity of email credentials through real SMTP authentication attempts. It processes credential lists in batch using 50 concurrent threads, displays results in real-time, and organizes findings into structured output files.
This tool is designed for:
- System administrators auditing email accounts on infrastructure they own
- Security researchers studying SMTP server behavior and configuration
- Security professionals performing authorized corporate email audits
- Developers testing SMTP configurations of their own systems
- CTF environments and security labs
| Feature | Detail |
|---|---|
| Modern GUI | Dark theme with blue accents, built with PySide6 (Qt6) |
| 2 input modes | EMAIL:PASS and SERVER|PORT|USERNAME|PASS |
| 50 concurrent threads | ThreadPoolExecutor for fast bulk processing |
| Server auto-detection | Automatically tests mail., smtp., email. prefixes |
| Multi-port | Tests ports 465 (SSL), 587 (STARTTLS), and 25 |
| Real-time log | Live display of each attempt with VALID/INVALID status |
| Organized results | Timestamped folders, per-server files, statistics summary |
| Progress bar | Visual indicator during verification |
| Live stats | Valid/invalid counters updated in real-time |
| Windows launcher | run.bat for one-click start |
SMTP_GUI/
├── main.py # Main application — GUI + SMTP verification engine
├── requirements.txt # Python dependencies (PySide6, colorama, easygui)
├── run.bat # Windows launcher (double-click to start)
├── README.md # This file
├── LICENSE # MIT License
└── Result/ # Output directory (auto-created)
└── MM-DD-YY_HH-MM-SS/
├── [server].txt # Valid credentials per server
├── _resumen.txt # Scan statistics
└── _info.txt # Session metadata
| Component | Requirement |
|---|---|
| Python | 3.6 or higher |
| PySide6 | >= 6.0.0 |
| colorama | >= 0.4.4 |
| easygui | >= 0.98.0 |
| OS | Windows, Linux, or macOS |
| Network | Internet connection or access to the target SMTP servers |
# 1. Clone or download the repository
git clone https://github.com/ByteCodeSecure/SMTP-Checker-GUI.git
cd SMTP-Checker-GUI
# 2. (Recommended) Create virtual environment
python -m venv venv
# Activate on Windows:
venv\Scripts\activate
# Activate on Linux/macOS:
source venv/bin/activate
# 3. Install dependencies
pip install -r requirements.txt
# 4. Launch the application
python main.pyDouble-click run.bat
The script runs python main.py and keeps the console window open to display any errors.
The main window (minimum 800×600) has 4 tabs:
┌─────────────────────────────────────────────────────────────────┐
│ SMTP CHECKER │
├──────────────┬─────────────────┬──────────┬────────────────────┤
│ EMAIL:PASS │ SERVER|PORT|... │ POP3 │ IMAP │
├──────────────┴─────────────────┴──────────┴────────────────────┤
│ │
│ File: [ path/to/credentials.txt ] [Browse] │
│ Email: [ you@yourdomain.com ] │
│ │
│ ┌─ Results Log ───────────────────────────────────────────┐ │
│ │ [14:32:01] VALID → smtp.domain.com:465:user@d.com │ │
│ │ [14:32:02] INVALID → mail.other.com:587:user2@other.com │ │
│ │ [14:32:03] ERROR → smtp.down.com: Connection timeout │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ Valid: [12] Invalid: [88] [████████░░░░] Progress │
│ │
│ [Start Verification / Iniciar Verificación] │
└─────────────────────────────────────────────────────────────────┘
Accepts files with email:password format. The application automatically deduces the SMTP server from the email domain.
Accepts files with an explicit SMTP server in pipe format. Use this when you already know the exact server configuration.
UI infrastructure prepared. Currently displays: "POP3 checker not implemented yet."
UI infrastructure prepared. Currently displays: "IMAP checker not implemented yet."
Plain text file, one credential set per line:
user@domain.com:password123
other@company.com:MyPass!2024
admin@myserver.com:P@ssw0rd
Rules:
- Separator: colon (
:) - The email domain is used to construct the SMTP server hostname
- Lines with incorrect format are logged as errors and skipped
- Blank lines are ignored
- Encoding: UTF-8
smtp.domain.com|465|user@domain.com|password
mail.company.com|587|admin|MyPass!2024
mail.myserver.com|25|user@server.com|key123
Rules:
- Separator: pipe (
|) - Exactly 4 fields per line
- Port must be numeric
- Lines with incorrect format are logged and skipped
Create a .txt file with the credentials to verify in the format corresponding to the tab you will use.
python main.py
# Or double-click run.bat (Windows)Choose EMAIL:PASS or SERVER|PORT|USERNAME|PASS depending on your file format.
Click "Examinar" (Browse) and select your .txt file.
In the "Email" field, enter your own email address. Successful verifications will attempt to send a test email to this address (only if valid credentials are found and the server allows it).
The test email body contains:
server|email|password|port|SMTP RECEIVED
Click "Iniciar Verificación" (Start Verification). The progress bar will activate and the log will start showing real-time results:
[14:32:01] Processing: user@domain.com
[14:32:02] VALID → smtp.domain.com:465:user@domain.com:password
[14:32:03] INVALID → mail.domain.com:587:user@domain.com:password
[14:32:04] ERROR → email.domain.com:25 → Connection timed out
When complete, the application shows a summary and results are saved in:
Result/
└── MM-DD-YY_HH-MM-SS/
All results are saved automatically to Result/[MM-DD-YY_HH-MM-SS]/:
One file per server where valid credentials were found. Format:
server|port|email|password
smtp.domain.com|465|user@domain.com|password123
smtp.domain.com|465|other@domain.com|pass456
=== VERIFICATION SUMMARY ===
Date: 03-28-25 14:35:22
Input file: /path/to/file.txt
Total processed: 500
Valid: 12
Invalid: 451
Format errors: 37
Timestamp: 03-28-25 14:32:00
File: /path/to/file.txt
Recipient email: you@email.com
For each credential email@domain.com:password, the application tries 9 combinations (3 prefixes × 3 ports):
| Attempt | Server | Port | Protocol |
|---|---|---|---|
| 1 | mail.domain.com |
465 | SMTP_SSL |
| 2 | mail.domain.com |
587 | SMTP + STARTTLS |
| 3 | mail.domain.com |
25 | SMTP plain |
| 4 | smtp.domain.com |
465 | SMTP_SSL |
| 5 | smtp.domain.com |
587 | SMTP + STARTTLS |
| 6 | smtp.domain.com |
25 | SMTP plain |
| 7 | email.domain.com |
465 | SMTP_SSL |
| 8 | email.domain.com |
587 | SMTP + STARTTLS |
| 9 | email.domain.com |
25 | SMTP plain |
Stops at the first success. If all 9 fail, the credential is marked INVALID.
Port 465 — SMTP_SSL (Direct SSL/TLS)
smtplib.SMTP_SSL(server, 465, timeout=15)
server.login(username, password)
server.sendmail(...)Port 587 — SMTP with STARTTLS
smtplib.SMTP(server, 587, timeout=15)
server.ehlo()
server.starttls()
server.login(username, password)
server.sendmail(...)Port 25 — Plain SMTP
smtplib.SMTP(server, 25, timeout=15)
server.ehlo()
server.login(username, password)
server.sendmail(...)15 seconds per connection attempt. With 50 threads and up to 9 attempts per credential, total time depends on server response speed.
Values configured directly in main.py:
| Parameter | Value | Description |
|---|---|---|
self.host |
["mail.", "smtp.", "email."] |
Server prefixes for auto-detection |
self.port |
[465, 587, 25] |
SMTP ports to test |
self.timeout |
15 |
Timeout per connection (seconds) |
ThreadPoolExecutor |
50 |
Number of concurrent threads |
| Output directory | Result/ |
Results folder (relative to executable) |
Main Thread (GUI — Qt Event Loop)
│
├── Verification Thread (daemon thread)
│ │
│ └── ThreadPoolExecutor (50 workers)
│ │
│ ├── Worker 1 → SMTP attempt
│ ├── Worker 2 → SMTP attempt
│ ├── ...
│ └── Worker 50 → SMTP attempt
│
└── Qt Signals (thread-safe UI updates)
├── update_log(message) → appends to log UI
├── update_stats(v, i) → updates counters
└── finished() → signals completion
Input File
│
▼
┌──────────────────┐
│ Read lines │ UTF-8, ignore encoding errors
│ + Validate │ Check correct separator (: or |)
└────────┬─────────┘
│ Invalid format → log error + continue
▼
┌──────────────────┐
│ Build attempt │ Tab 1: extract domain → 9 combinations
│ list │ Tab 2: use server/port directly
└────────┬─────────┘
▼
┌──────────────────┐
│ Send to thread │ ThreadPoolExecutor (50 workers)
│ pool │
└────────┬─────────┘
▼
┌──────────────────┐
│ Per attempt: │ Connect SMTP → Login → Send test email
│ │ Success: emit update_log("VALID", ...)
│ │ Failure: emit update_log("INVALID", ...)
│ │ Error: emit update_log("ERROR", ...)
└────────┬─────────┘
▼
┌──────────────────┐
│ Save results │ Result/timestamp/server.txt
│ │ Result/timestamp/_resumen.txt
└──────────────────┘
| Problem | Cause | Solution |
|---|---|---|
ModuleNotFoundError: PySide6 |
PySide6 not installed | pip install -r requirements.txt |
| App won't launch on Windows | Python not in PATH | Reinstall Python checking "Add to PATH" |
| All results are errors | Firewall blocking SMTP ports | Verify ports 465/587/25 are open |
Empty Result/ folder |
No valid credentials found | Normal — no server accepted the credentials |
| Very slow with many lines | Slow servers + 15s timeout | Normal; 50 threads process in parallel |
SMTPAuthenticationError |
Wrong credential | Correctly recorded as INVALID |
ConnectionRefusedError |
Port closed on that server | Next port is tried automatically |
| GUI freezes | Background process active | Verification runs on separate thread — wait for completion |
Incorrect _info.txt |
Path with special characters | Use paths without spaces or special characters |
This project is licensed under the MIT License. See LICENSE for details.
Este proyecto está bajo la Licencia MIT. Ver LICENSE para más detalles.