A powerful, standalone email verification API built from Email Verifier Pro. No authentication required - completely public and free to use.
- β
Automatic Database Setup - One-click installation via
setup.html - β
Fixed Database Schema - Corrected
evp_mx_redirecttable columns - β Enhanced Error Handling - Better SMTP timeout management
- β Improved Type Safety - Added resource checks for stream operations
- β Production Ready - All endpoints tested and validated
- β Port 25 Detection - Graceful handling when SMTP port is blocked
- β
Test Suite Included -
test-no-smtp.pyfor non-SMTP testing
- About
- Features
- How It Works
- Requirements
- Quick Installation
- Configuration
- API Endpoints
- Usage Examples
- Advanced Features
- Database Schema
- Rate Limiting & Caching
- Testing
- Deployment
- Troubleshooting
- Security
This API is a complete replication of Email Verifier Pro (CodeCanyon webapp), converted into a standalone REST API. It provides the same powerful email verification capabilities with 100% accuracy matching the original webapp.
Built From Email Verifier Pro:
- Same validation logic and algorithms
- Same database-driven features
- Same SMTP verification protocol
- Same accuracy and reliability
Key Differences:
- β REST API instead of web interface
- β JSON responses instead of HTML
- β Public access (no authentication required)
- β Can be hosted anywhere
- β Used worldwide without restrictions
- π§ Form validation in real-time
- π§Ή Email list cleaning and validation
- β User registration verification
- π¬ Newsletter signup validation
- π Contact form verification
- πΌ CRM data validation
- π Bulk email list processing
| Feature | Description |
|---|---|
| Syntax Validation | RFC 5322 compliant email format checking |
| DNS Validation | Verify domain exists with valid DNS records |
| MX Records | Check mail exchange records for email delivery |
| SMTP Verification | Real-time SMTP server validation (EHLO, MAIL FROM, RCPT TO) |
| Disposable Detection | Database-driven disposable domain detection (11+ domains pre-loaded) |
| Free Account Detection | Identify free email providers (Gmail, Yahoo, Outlook, etc.) |
| Catch-All Detection | Smart detection of catch-all mail servers |
| Role-Based Detection | Identify role accounts (admin@, info@, support@, etc.) |
| Feature | Description |
|---|---|
| Domain Filter Lists | Database table with disposable/unsupported domains |
| MX Skip Lists | Auto-detects and skips problematic MX servers |
| MX Redirections | Domain-specific MX record redirections from database |
| Configurable SMTP | Port, timeout, commands stored in database |
| Email Scoring | 0-1 score indicating deliverability confidence |
| Safe-to-Send | Clear Yes/No/Maybe recommendations |
| Bounce Type Detection | Hard bounce vs soft bounce classification |
| Debug Mode | Complete SMTP conversation logging |
- β Public Access: No API keys required - completely open
- β Rate Limiting: IP-based fair usage (50 requests/hour per IP)
- β Single Verification: Verify one email at a time
- β Bulk Verification: Process up to 100 emails in one request
- β Smart Caching: 24-hour result caching for performance
- β Statistics: Monitor usage and verification metrics
- β RESTful Design: Clean, predictable JSON responses
- β CORS Enabled: Use directly from browsers
- β Logging: Track all verifications and errors
1. Syntax Check
β
2. Domain DNS Lookup
β
3. MX Record Retrieval
β
4. MX Skip List Check (auto-populated problematic servers)
β
5. Disposable Domain Check (database)
β
6. MX Redirection Check (database)
β
7. SMTP Connection Test
β
βββ EHLO/HELO Command
βββ MAIL FROM Command
βββ RCPT TO Command (verify recipient)
βββ Response Code Analysis (220, 250, 450, 550, etc.)
β
8. Catch-All Detection (random email test)
β
9. Email Scoring & Classification
β
10. Return Results (JSON)
Level 1: Syntax (Instant)
- Format validation (RFC 5322)
- No network requests
- < 0.01 seconds
Level 2: DNS (Fast)
- Domain existence check
- MX record lookup
- 0.1-0.5 seconds
Level 3: SMTP (Thorough)
- Real mail server connection
- SMTP conversation
- Response code analysis
- 1-5 seconds
Level 4: Advanced (Comprehensive)
- Disposable detection
- Catch-all detection
- MX skip list check
- Email scoring
- 2-10 seconds
- PHP: Core language (7.4+)
- MySQL: Data storage and configuration
- Functions Used:
filter_var()- Email syntax validationcheckdnsrr()- DNS record checksgetmxrr()- MX record retrievalfsockopen()- SMTP socket connectionfgets()/fputs()- SMTP communication
- Database: 8 tables for configuration, caching, logging
- Apache: Web server with mod_rewrite
- PHP: 7.4 or higher (8.0+ recommended)
- MySQL: 5.7 or higher (8.0+ recommended)
- Web Server: Apache with mod_rewrite enabled
- PHP Extensions:
mysqli- Database operationscurl- API functionalitysockets- SMTP verificationjson- API responsesmbstring- String handling
- Port 25: Outbound access for SMTP verification (critical)
- Port 80/443: Inbound for API access
β Works On:
- Shared Hosting (cPanel, Plesk) - if port 25 allowed
- VPS/Dedicated Servers
- Cloud (AWS, Azure, DigitalOcean, Linode)
- Local Development (XAMPP, WAMP, MAMP, LAMP)
Super Simple - Just 3 Steps!
git clone https://github.com/cold-cofffeee/Bulk-Email-Validator-API.git
cd Bulk-Email-Validator-APIOr download ZIP and extract to your web server directory (e.g., C:\xampp\htdocs\API).
Edit config/config.php and update your MySQL credentials:
define('DB_HOST', 'localhost');
define('DB_USER', 'root'); // Your MySQL username
define('DB_PASS', ''); // Your MySQL password
define('DB_NAME', 'email_verify_api'); // Database name (will be created automatically)Open your browser and visit:
http://localhost/API/setup.html
Click "Install Database Automatically" and you're done! π
The system will automatically:
- β Create the database
- β Create all 8 tables
- β Insert default data (11 disposable domains, SMTP settings, etc.)
- β Configure everything for you
That's it! No SQL imports, no manual configuration needed.
If you prefer manual setup:
Step 1: Clone repository
git clone https://github.com/cold-cofffeee/Bulk-Email-Validator-API.git
cd Bulk-Email-Validator-APIStep 2: Create database
mysql -u root -pCREATE DATABASE email_verify_api CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
EXIT;Step 3: Import schema
mysql -u root -p email_verify_api < database/schema.sqlStep 4: Update config/config.php with your database credentials
Step 5: Test installation
http://localhost/API/
The automatic setup creates 8 tables:
API Tables (4):
rate_limits- IP request tracking for rate limitingverification_logs- Complete verification historyverification_cache- 24-hour result cachingapi_stats- Daily usage statistics
Email Verifier Pro Tables (4):
evp_domain_filter_list- Disposable/free domains (11 pre-loaded)evp_mx_skiplist- Problematic MX servers (auto-populated)evp_mx_redirect- Domain MX redirectionsevp_options- SMTP configuration (port, timeout, commands)
Visit http://localhost/API/ - you should see:
{
"name": "Email Verification API",
"version": "1.0.0",
"description": "Public email verification API",
"status": "active",
"public": true
"endpoints": {
"verify": "/verify",
"bulk": "/verify/bulk",
"health": "/health",
"stats": "/stats",
"docs": "/docs"
}
}β Installation Complete!
// Database Connection
define('DB_HOST', 'localhost');
define('DB_USER', 'root');
define('DB_PASS', '');
define('DB_NAME', 'email_verify_api');
// Rate Limiting
define('ENABLE_RATE_LIMIT', true);
define('RATE_LIMIT_REQUESTS', 50); // Requests per hour per IP
define('RATE_LIMIT_WINDOW', 3600); // 1 hour in seconds
// Result Caching
define('CACHE_RESULTS', true);
define('CACHE_DURATION', 86400); // 24 hours
// Bulk Verification
define('BULK_VERIFY_LIMIT', 100); // Max emails per bulk request
// Email Verification (Defaults - can override via database)
define('VERIFY_PORT', 25); // SMTP port
define('VERIFY_FROM', 'verify@localhost'); // FROM email address
define('VERIFY_TIMEOUT', 30); // Connection timeout (seconds)
define('CHECK_MX_RECORDS', true); // Enable MX checks
define('CHECK_SMTP', true); // Enable SMTP verification
define('CHECK_DISPOSABLE', true); // Check disposable domains
// Logging
define('ENABLE_LOGGING', true); // Log verifications
define('LOG_FILE', __DIR__ . '/../logs/error.log');These settings override config.php defaults:
| Option | Description | Default |
|---|---|---|
scan_port |
SMTP port | 25 |
scan_mail |
FROM email | verify@localhost |
scan_time_out |
Timeout (seconds) | 30 |
smtp_cmd |
SMTP command | EHLO localhost |
Update Options:
UPDATE evp_options SET option_value = 'verify@yourdomain.com' WHERE option_name = 'scan_mail';
UPDATE evp_options SET option_value = '60' WHERE option_name = 'scan_time_out';
UPDATE evp_options SET option_value = 'EHLO mail.yourdomain.com' WHERE option_name = 'smtp_cmd';http://yourdomain.com/API/
GET /Response:
{
"name": "Email Verification API",
"version": "1.0.0",
"status": "active",
"public": true,
"endpoints": {...}
}POST /verify
Content-Type: application/json
{
"email": "user@example.com",
"debug": false
}Parameters:
email(string, required) - Email address to verifydebug(boolean, optional) - Enable SMTP debug logging (default: false)
Success Response:
{
"success": true,
"data": {
"email": "user@example.com",
"valid": true,
"status": "Valid",
"reason": "Deliverable",
"details": {
"username": "user",
"domain": "example.com",
"syntax_valid": true,
"dns_valid": true,
"mx_records": true,
"smtp_valid": true,
"disposable": false,
"role_based": false,
"mx_servers": ["mx1.example.com", "mx2.example.com"]
},
"mx_server": "mx1.example.com",
"mx_response": "250 2.1.5 OK",
"email_score": 1,
"safe_to_send": "Yes",
"bounce_type": "",
"type": "Corporate Account",
"verification_time": "2.34 seconds",
"cached": false
},
"timestamp": "2024-12-03T10:30:00+00:00"
}Error Response:
{
"success": false,
"error": {
"message": "Invalid email format",
"code": 400
},
"timestamp": "2024-12-03T10:30:00+00:00"
}POST /verify/bulk
Content-Type: application/json
{
"emails": [
"user1@example.com",
"user2@example.com",
"user3@example.com"
]
}Parameters:
emails(array, required) - Array of email addresses (max 100)
Response:
{
"success": true,
"data": {
"total": 3,
"processed": 3,
"verification_time": "5.67 seconds",
"results": [
{
"email": "user1@example.com",
"valid": true,
"status": "Valid",
"reason": "Deliverable",
"email_score": 1,
"safe_to_send": "Yes"
},
{
"email": "user2@example.com",
"valid": false,
"status": "Invalid",
"reason": "Domain does not exist",
"email_score": 0,
"safe_to_send": "No"
},
{
"email": "user3@example.com",
"valid": true,
"status": "Unknown",
"reason": "Catch-all server detected",
"email_score": 0.5,
"safe_to_send": "Maybe"
}
]
},
"timestamp": "2024-12-03T10:30:00+00:00"
}GET /healthResponse:
{
"status": "healthy",
"database": "connected",
"php_version": "8.0.28",
"mysql_version": "8.0.32",
"timestamp": "2024-12-03T10:30:00+00:00"
}GET /statsResponse:
{
"success": true,
"data": {
"total_verifications": 15420,
"last_24_hours": 523,
"cached_results": 3421,
"verifications_by_status": {
"Valid": 12340,
"Invalid": 2580,
"Unknown": 500
},
"verifications_today": 247,
"rate_limit": {
"enabled": true,
"requests_per_hour": 50,
"window": 3600
},
"cache": {
"enabled": true,
"duration": 86400
}
},
"timestamp": "2024-12-03T10:30:00+00:00"
}GET /docsReturns HTML documentation page.
| Code | Message | Description |
|---|---|---|
400 |
Bad Request | Invalid input (missing email, invalid format) |
429 |
Rate Limit Exceeded | Too many requests from IP |
500 |
Internal Server Error | Server-side error |
Single Verification:
curl -X POST http://localhost/API/verify \
-H "Content-Type: application/json" \
-d '{"email":"test@gmail.com"}'With Debug Mode:
curl -X POST http://localhost/API/verify \
-H "Content-Type: application/json" \
-d '{"email":"test@gmail.com","debug":true}'Bulk Verification:
curl -X POST http://localhost/API/verify/bulk \
-H "Content-Type: application/json" \
-d '{"emails":["test1@gmail.com","test2@yahoo.com","test3@outlook.com"]}'Get Statistics:
curl http://localhost/API/stats// Single Verification
async function verifyEmail(email) {
const response = await fetch('http://localhost/API/verify', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ email: email })
});
const data = await response.json();
console.log(data);
return data;
}
verifyEmail('test@example.com');
// Bulk Verification
async function verifyBulk(emails) {
const response = await fetch('http://localhost/API/verify/bulk', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ emails: emails })
});
const data = await response.json();
console.log(data);
return data;
}
verifyBulk(['user1@example.com', 'user2@example.com']);import requests
import json
# Single Verification
def verify_email(email):
url = 'http://localhost/API/verify'
payload = {'email': email}
headers = {'Content-Type': 'application/json'}
response = requests.post(url, json=payload, headers=headers)
return response.json()
result = verify_email('test@gmail.com')
print(json.dumps(result, indent=2))
# Bulk Verification
def verify_bulk(emails):
url = 'http://localhost/API/verify/bulk'
payload = {'emails': emails}
headers = {'Content-Type': 'application/json'}
response = requests.post(url, json=payload, headers=headers)
return response.json()
emails = ['user1@example.com', 'user2@example.com', 'user3@example.com']
result = verify_bulk(emails)
print(json.dumps(result, indent=2))<?php
// Single Verification
function verifyEmail($email) {
$url = 'http://localhost/API/verify';
$data = json_encode(['email' => $email]);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Content-Length: ' . strlen($data)
]);
$result = curl_exec($ch);
curl_close($ch);
return json_decode($result, true);
}
$result = verifyEmail('test@gmail.com');
print_r($result);
// Bulk Verification
function verifyBulk($emails) {
$url = 'http://localhost/API/verify/bulk';
$data = json_encode(['emails' => $emails]);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json'
]);
$result = curl_exec($ch);
curl_close($ch);
return json_decode($result, true);
}
$emails = ['user1@example.com', 'user2@example.com'];
$result = verifyBulk($emails);
print_r($result);
?>Every verified email receives a deliverability score from 0 to 1:
| Score | Meaning | Safe to Send? |
|---|---|---|
1.0 |
Valid and deliverable | Yes |
0.5-0.9 |
Uncertain (catch-all, greylisting) | Maybe |
0.0-0.4 |
Invalid or risky | No |
The system automatically detects and skips problematic MX servers:
Auto-Added When:
- Connection timeout
- Greylisting detected
- Consistent verification failures
View Skip List:
SELECT * FROM evp_mx_skiplist;Manually Add:
INSERT INTO evp_mx_skiplist (mx_server, reason)
VALUES ('problematic-mx.example.com', 'Greylisting');Pre-loaded with 11 disposable domains, including:
guerrillamail.com10minutemail.comtemp-mail.org- And more...
Add More:
INSERT INTO evp_domain_filter_list (name, e_type, catch_all_check)
VALUES ('newdisposable.com', 'Disposable Account', 0);Detects domains that accept all emails (catch-all servers):
- Tests with random email address
- Compares response codes
- Marks as "Unknown" status
- Returns score: 0.5 (uncertain)
Configure Per-Domain:
UPDATE evp_domain_filter_list
SET catch_all_check = 1
WHERE name = 'example.com';Classifies non-deliverable emails:
| Bounce Type | Description | SMTP Code |
|---|---|---|
| Hard Bounce | Permanent failure | 550, 551, 554 |
| Soft Bounce | Temporary failure | 450, 451, 452 |
| Unknown | Cannot determine | Other codes |
Enable comprehensive SMTP logging:
{
"email": "test@gmail.com",
"debug": true
}Debug Output Includes:
{
"debug": [
"Email syntax is valid",
"Valid Domain DNS Record Found",
"Valid MX Records Found",
"Trying to connect to: gmail-smtp-in.l.google.com",
"Connection success",
"SENT: EHLO localhost",
"RECV: 250-mx.google.com at your service",
"SENT: MAIL FROM: <verify@localhost>",
"RECV: 250 2.1.0 OK",
"SENT: RCPT TO: <test@gmail.com>",
"RECV: 250 2.1.5 OK",
"SENT: QUIT",
"Connection closed"
]
}Tracks API requests per IP for rate limiting.
| Column | Type | Description |
|---|---|---|
id |
INT | Primary key |
ip_address |
VARCHAR(45) | Client IP |
request_count |
INT | Number of requests |
window_start |
DATETIME | Rate limit window start |
Stores all verification attempts.
| Column | Type | Description |
|---|---|---|
id |
INT | Primary key |
email |
VARCHAR(255) | Verified email |
result |
VARCHAR(50) | Valid/Invalid/Unknown |
details |
TEXT | JSON details |
ip_address |
VARCHAR(45) | Client IP |
created_at |
DATETIME | Timestamp |
Caches results for 24 hours.
| Column | Type | Description |
|---|---|---|
id |
INT | Primary key |
email |
VARCHAR(255) | Cached email (UNIQUE) |
result |
TEXT | JSON result |
created_at |
DATETIME | Cache timestamp |
Daily statistics tracking.
| Column | Type | Description |
|---|---|---|
id |
INT | Primary key |
date |
DATE | Statistics date |
total_requests |
INT | Total verifications |
valid_count |
INT | Valid emails |
invalid_count |
INT | Invalid emails |
unknown_count |
INT | Unknown emails |
Disposable and unsupported domains.
| Column | Type | Description |
|---|---|---|
id |
INT | Primary key |
name |
VARCHAR(255) | Domain name |
e_type |
VARCHAR(100) | Type (Disposable/Unsupported/Free) |
catch_all_check |
TINYINT | Enable catch-all check (0/1) |
Pre-Loaded Domains:
- guerrillamail.com
- 10minutemail.com
- temp-mail.org
- throwaway.email
- mailinator.com
- And 6 more...
Problematic MX servers (auto-populated).
| Column | Type | Description |
|---|---|---|
id |
INT | Primary key |
mx_server |
VARCHAR(255) | MX hostname |
reason |
VARCHAR(255) | Why skipped |
added_at |
DATETIME | When added |
Domain-specific MX redirections.
| Column | Type | Description |
|---|---|---|
id |
INT | Primary key |
domain |
VARCHAR(255) | Source domain |
redirect_mx |
VARCHAR(255) | Target MX server |
System configuration options.
| Column | Type | Description |
|---|---|---|
id |
INT | Primary key |
option_name |
VARCHAR(100) | Setting name |
option_value |
TEXT | Setting value |
Default Options:
scan_port= 25scan_mail= verify@localhostscan_time_out= 30smtp_cmd= EHLO localhost
Default Limits:
- 50 requests per hour per IP
- Applies to
/verifyand/verify/bulkendpoints - Not applied to
/health,/stats,/docs
When Limit Exceeded:
{
"success": false,
"error": {
"message": "Rate limit exceeded. Try again in 1234 seconds.",
"code": 429
}
}Adjust Limits:
// config/config.php
define('RATE_LIMIT_REQUESTS', 100); // Change to 100/hour
define('RATE_LIMIT_WINDOW', 3600); // Keep 1 hour windowClear Rate Limits:
TRUNCATE TABLE rate_limits;Cache Duration: 24 hours (86400 seconds)
Benefits:
- Faster responses for repeated emails
- Reduced server load
- Saves SMTP quota
Cached Response Example:
{
"data": {
"email": "test@gmail.com",
"valid": true,
"cached": true, β Cached result
...
}
}Clear Cache:
TRUNCATE TABLE verification_cache;Disable Caching:
// config/config.php
define('CACHE_RESULTS', false);1. API Information:
curl http://localhost/API/2. Health Check:
curl http://localhost/API/health3. Valid Email:
curl -X POST http://localhost/API/verify \
-H "Content-Type: application/json" \
-d '{"email":"test@gmail.com"}'4. Invalid Email:
curl -X POST http://localhost/API/verify \
-H "Content-Type: application/json" \
-d '{"email":"fake@nonexistentdomain12345.com"}'5. Disposable Email:
curl -X POST http://localhost/API/verify \
-H "Content-Type: application/json" \
-d '{"email":"test@guerrillamail.com"}'6. Bulk Verification:
curl -X POST http://localhost/API/verify/bulk \
-H "Content-Type: application/json" \
-d '{"emails":["test@gmail.com","fake@test.com","admin@yahoo.com"]}'- Upload files via FTP/File Manager
- Create MySQL database via cPanel
- Import
database/schema.sqlvia phpMyAdmin - Edit
config/config.phpwith database credentials - Access via
http://yourdomain.com/API/
Important: Check if port 25 is open for SMTP verification.
Requirements:
- Apache 2.4+ with mod_rewrite
- PHP 7.4+ (8.0+ recommended)
- MySQL 5.7+ (8.0+ recommended)
Setup:
# Install dependencies
sudo apt update
sudo apt install apache2 php php-mysqli php-curl mysql-server
# Enable mod_rewrite
sudo a2enmod rewrite
sudo systemctl restart apache2
# Clone repository
cd /var/www/html
git clone https://github.com/cold-cofffeee/API.git
cd API
# Set permissions
sudo chown -R www-data:www-data logs/ cache/
sudo chmod 755 logs/ cache/
# Create database
mysql -u root -p
CREATE DATABASE email_verify_api;
USE email_verify_api;
SOURCE database/schema.sql;
EXIT;
# Configure
nano config/config.php # Update database credentialsCreate Dockerfile:
FROM php:8.0-apache
RUN docker-php-ext-install mysqli pdo pdo_mysql
RUN a2enmod rewrite
COPY . /var/www/html/
WORKDIR /var/www/html/
RUN chown -R www-data:www-data logs/ cache/
EXPOSE 80Create docker-compose.yml:
version: '3.8'
services:
web:
build: .
ports:
- "80:80"
volumes:
- .:/var/www/html
depends_on:
- db
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: email_verify_api
ports:
- "3306:3306"Run:
docker-compose up -d
docker exec -i <container_name> mysql -uroot -proot email_verify_api < database/schema.sqlError: Could not connect to database
Solution:
- Check MySQL is running:
sudo systemctl status mysql - Verify credentials in
config/config.php - Test connection:
mysql -u root -p -h localhostPossible Causes:
- .htaccess syntax error
- mod_rewrite not enabled
- PHP errors
Solution:
- Check Apache error log:
tail -f /var/log/apache2/error.log- Enable mod_rewrite:
sudo a2enmod rewrite
sudo systemctl restart apache2- Check
logs/error.logfor PHP errors
Error: SMTP verification failed
Common Causes:
- Port 25 blocked by firewall/ISP
- Mail server greylisting
- Timeout too short
Solutions:
- Check Port 25 Access (Most Common Issue):
# Windows PowerShell
Test-NetConnection gmail-smtp-in.l.google.com -Port 25
# Linux/Mac
telnet gmail-smtp-in.l.google.com 25
# Or
nc -zv gmail-smtp-in.l.google.com 25If port 25 is blocked:
- β Syntax validation, DNS, MX, and disposable detection still work
- β Only SMTP server verification and catch-all detection won't work
- π§ Contact your ISP/hosting provider to unblock port 25
- π Most residential ISPs block port 25 to prevent spam
- π‘ Use VPS/cloud hosting (AWS, DigitalOcean, Vultr) where port 25 is open
- Test Without SMTP (if port 25 blocked):
python test-no-smtp.pyThis tests all endpoints that don't require port 25.
- Increase Timeout:
UPDATE evp_options SET option_value = '60' WHERE option_name = 'scan_time_out';Or edit config/config.php:
define('VERIFY_TIMEOUT', 60); // Increase to 60 seconds- Check MX Skip List:
SELECT * FROM evp_mx_skiplist;Remove any domains you want to verify:
DELETE FROM evp_mx_skiplist WHERE mx_server LIKE '%gmail%';Solution:
// config/config.php
define('RATE_LIMIT_REQUESTS', 100); // Increase to 100/hourOr clear existing limits:
TRUNCATE TABLE rate_limits;Error: Warning: fopen(logs/error.log): failed to open stream
Solution:
chmod 755 logs/
chown www-data:www-data logs/ # Linuxβ SQL Injection Prevention
- Prepared statements
- Input escaping
- Parameter binding
β XSS Protection
- JSON responses only
- No HTML rendering
- Content-Type headers
β Rate Limiting
- IP-based tracking
- Prevents abuse
- Configurable limits
β Input Validation
- Email format validation
- Array size limits
- Type checking
β Error Handling
- No sensitive data exposure
- Generic error messages
- Detailed logging (server-side only)
1. Use HTTPS in Production:
# .htaccess
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]2. Restrict Database User:
CREATE USER 'api_user'@'localhost' IDENTIFIED BY 'strong_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON email_verify_api.* TO 'api_user'@'localhost';
FLUSH PRIVILEGES;3. Keep Logs Secure:
chmod 640 logs/error.log
chown www-data:www-data logs/error.log4. Regular Updates:
- Keep PHP updated
- Keep MySQL updated
- Monitor security advisories
5. Firewall Rules:
# Allow HTTP/HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# Allow MySQL (local only)
sudo ufw allow from 127.0.0.1 to any port 3306API/
βββ .git/ # Git repository
βββ .gitattributes # Git attributes
βββ .gitignore # Git ignore rules
βββ .htaccess # Apache rewrite + CORS
βββ index.php # API entry point
βββ README.md # This file
β
βββ config/
β βββ config.php # Configuration
β
βββ core/
β βββ bootstrap.php # Autoloader
β βββ Database.php # MySQL wrapper
β βββ APIRouter.php # Request routing
β βββ RateLimiter.php # Rate limiting
β
βββ controllers/
β βββ VerifyController.php # Verification logic
β βββ StatsController.php # Statistics
β
βββ lib/
β βββ EmailVerifier.php # Email verification engine
β
βββ database/
β βββ schema.sql # Database schema (8 tables)
β
βββ logs/ # Error logs (auto-created)
βββ cache/ # Cache data (auto-created)
Total Files: 23
Total Size: ~0.11 MB
Lines of Code: ~2,500
This project is open source and available for anyone to use, modify, and distribute.
Based on: Email Verifier Pro (CodeCanyon)
Converted by: cold-cofffeee
GitHub: https://github.com/cold-cofffeee/API
Contributions welcome! Feel free to:
- π Report bugs
- β¨ Suggest features
- π§ Submit pull requests
- π Improve documentation
Issues?
- Check Troubleshooting section
- Review
logs/error.log - Test database connection
- Verify PHP extensions
Need Help?
- GitHub Issues: https://github.com/cold-cofffeee/API/issues
- Check documentation HTML:
http://localhost/API/docs
- Email Verifier Pro - Original webapp from CodeCanyon
- PHP Community - For excellent documentation
- Contributors - For improvements and bug reports
- β Initial release
- β Complete Email Verifier Pro replication
- β 100% accuracy matching original webapp
- β Public API without authentication
- β 8 database tables with advanced features
- β IP-based rate limiting
- β Result caching
- β Comprehensive documentation
Built with β€οΈ using PHP | Public & Free | No Authentication Required
Star β this repo if you find it useful!