Email addresses рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╕рдордп, рд╕рдмрд╕реЗ рдЪреБрдиреМрддреАрдкреВрд░реНрдг рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЬрд┐рд╕рдХрд╛ рдЖрдк рд╕рд╛рдордирд╛ рдХрд░реЗрдВрдЧреЗ рд╡рд╣ рд╣реИ catch-all email serverред рдпреЗ servers рдЕрдкрдиреЗ domain рдкрд░ рдХрд┐рд╕реА рднреА address рдХреЗ рд▓рд┐рдП mail рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ standard SMTP verification рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рд╡рд┐рд╢рд┐рд╖реНрдЯ mailbox рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ рдпрд╛ рдирд╣реАрдВред Catch-all email detection рдХреЛ рд╕рдордЭрдирд╛ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдЬреЛ email list рдХреА quality рдмрдирд╛рдП рд░рдЦрдиреЗ рдФрд░ deliverability rates рдХреЛ рдЕрдзрд┐рдХрддрдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧрдВрднреАрд░ рд╣реИред
рдЗрд╕ рд╡реНрдпрд╛рдкрдХ рдЧрд╛рдЗрдб рдореЗрдВ, рд╣рдо catch-all emails рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреЛ рдЬреЛ рдХреБрдЫ рднреА рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЙрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВрдЧреЗ: рд╡реЗ рдХреНрдпрд╛ рд╣реИрдВ, рд╡реЗ рдХреНрдпреЛрдВ рдореМрдЬреВрдж рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ detect рдХрд░реЗрдВ, рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдЕрдкрдиреЗ email verification workflow рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓реЗрдВред рдЪрд╛рд╣реЗ рдЖрдк рдПрдХ developer рд╣реЛрдВ рдЬреЛ email validation system рдмрдирд╛ рд░рд╣реЗ рд╣реЛрдВ рдпрд╛ рдПрдХ marketer рд╣реЛрдВ рдЬреЛ рдЕрдкрдиреА email list рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реЛрдВ, рдпрд╣ рдЧрд╛рдЗрдб рдЖрдкрдХреЛ catch-all domains рд╕реЗ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЬреНрдЮрд╛рди рдФрд░ tools рджреЗрдЧреАред
рдПрдХ рдордЬрдмреВрдд email verification strategy рдореЗрдВ catch-all servers рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЙрдЪрд┐рдд detection рдФрд░ handling рдХреЗ рдмрд┐рдирд╛, рдЖрдкрдХреЗ verification results рдЖрдкрдХреЛ email deliverability рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧрд▓рдд рд╡рд┐рд╢реНрд╡рд╛рд╕ рджрд┐рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЗрдП рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг рдФрд░ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдореЗрдВ рдЧреЛрддрд╛ рд▓рдЧрд╛рдПрдВред
Catch-All Email Server рдХреНрдпрд╛ рд╣реИ?
Catch-all email server, рдЬрд┐рд╕реЗ accept-all server рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдкрдиреЗ domain рдкрд░ рдХрд┐рд╕реА рднреА address рдХреЗ рд▓рд┐рдП incoming email рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП configured рд╣реЛрддрд╛ рд╣реИ, рдЪрд╛рд╣реЗ рд╡рд╣ рд╡рд┐рд╢рд┐рд╖реНрдЯ mailbox рдореМрдЬреВрдж рд╣реЛ рдпрд╛ рдирд╣реАрдВред рдЬрдм рдЖрдк anyaddress@catchall-domain.com рдкрд░ email рднреЗрдЬрддреЗ рд╣реИрдВ, рддреЛ server рдЗрд╕реЗ bounce рдХрд┐рдП рдмрд┐рдирд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА "anyaddress" рдирд╛рдо рдХрд╛ рдХреЛрдИ mailbox рдХрднреА рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реЛред
Catch-All Configuration рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
рдПрдХ typical email server configuration рдореЗрдВ, рдЬрдм рдХрд┐рд╕реА non-existent mailbox рдХреЗ рд▓рд┐рдП message рдЖрддрд╛ рд╣реИ, рддреЛ server "550 User not found" рдпрд╛ рд╕рдорд╛рди rejection message рдХреЗ рд╕рд╛рде respond рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ email verification systems рдХреЛ server рдХреА response рдХреА рдЬрд╛рдВрдЪ рдХрд░рдХреЗ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ address рдореМрдЬреВрдж рд╣реИ рдпрд╛ рдирд╣реАрдВред
Catch-all servers рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рд╡реЗ recipient address рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рд╕рднреА incoming mail рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП configured рд╣реЛрддреЗ рд╣реИрдВред рдлрд┐рд░ mail рдХреЛ:
- Designated mailbox рдкрд░ route рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдПрдХ single administrator рд╕рднреА messages рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ
- General queue рдореЗрдВ store рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - Messages рдХреЛ рдмрд╛рдж рдореЗрдВ sorting рдХреЗ рд▓рд┐рдП рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ
- рдЪреБрдкрдЪрд╛рдк discard рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд▓реЗрдХрд┐рди delivery рдХреЗ рдмрд┐рдирд╛ delete рдХрд┐рдпрд╛ рдЧрдпрд╛
- рджреВрд╕рд░реЗ system рдкрд░ forward рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - Processing рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдЕрдиреНрдп server рдкрд░ рднреЗрдЬрд╛ рдЧрдпрд╛
рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ Postfix mail server configuration рдореЗрдВ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
# /etc/postfix/main.cf # Standard configuration - rejects unknown recipients local_recipient_maps = proxy:unix:passwd.byname $alias_maps # Catch-all configuration - accepts all recipients local_recipient_maps =
Organizations Catch-All Servers рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░рддреЗ рд╣реИрдВ
Organizations рдХреЗ рдкрд╛рд╕ catch-all email configure рдХрд░рдиреЗ рдХреЗ рдХрдИ legitimate рдХрд╛рд░рдг рд╣реИрдВ:
1. рдЦреЛрдП рд╣реБрдП рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рд╕рдВрдЪрд╛рд░ рдХреЛ рд░реЛрдХрдирд╛
рдЫреЛрдЯреЗ businesses рдЕрдХреНрд╕рд░ typos рдпрд╛ employee names рдореЗрдВ variations рдХреЗ рдХрд╛рд░рдг рдорд╣рддреНрд╡рдкреВрд░реНрдг emails рдЦреЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рд░рд╣рддреЗ рд╣реИрдВред рдпрджрд┐ рдХреЛрдИ john.smith@company.com рдкрд░ email рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ address jsmith@company.com рд╣реИ, рддреЛ catch-all configuration рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ message рдЦреЛ рди рдЬрд╛рдПред
2. Flexible Email Routing
рдХреБрдЫ organizations sophisticated email routing system рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ catch-all рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╕рднреА incoming mail рдПрдХ central queue рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЗрд╕реЗ rules рдХреЗ рдЖрдзрд╛рд░ рдкрд░ automatically sorted рдФрд░ distributed рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
3. Security Monitoring
Security teams рдХрднреА-рдХрднреА catch-all рдХреЛ рдпрд╣ monitor рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП configure рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ attackers рдпрд╛ spammers рдХрд┐рди addresses рдХреЛ target рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ intelligence phishing attempts рдпрд╛ data breaches рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреА рд╣реИред
4. Legacy System Compatibility
рдПрдХ email system рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ migrate рдХрд░рдиреЗ рд╡рд╛рд▓реЗ organizations transition рдХреЗ рджреМрд░рд╛рди рдХреЛрдИ message рдЦреЛрдиреЗ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП temporarily catch-all enable рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
5. Privacy Protection
рдХреБрдЫ privacy-conscious organizations рдкреНрд░рддреНрдпреЗрдХ service рдХреЗ рд▓рд┐рдП unique email addresses рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП catch-all domains рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╡реЗ sign up рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ track рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реА companies рдЙрдирдХрд╛ data share рдпрд╛ leak рдХрд░рддреА рд╣реИрдВред
Email Verification рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛
Email verification рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, catch-all servers рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪреБрдиреМрддреА present рдХрд░рддреЗ рд╣реИрдВред рдЬрдм рдЖрдк рдХрд┐рд╕реА catch-all domain рдкрд░ SMTP verification рдХрд░рддреЗ рд╣реИрдВ, рддреЛ server рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ test рдХрд┐рдП рдЧрдП рдкреНрд░рддреНрдпреЗрдХ address рдХреЗ рд▓рд┐рдП "250 OK" acceptance рдХреЗ рд╕рд╛рде respond рдХрд░рддрд╛ рд╣реИтАФрдЪрд╛рд╣реЗ рд╡рд╣ real рд╣реЛ рдпрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ fabricatedред
рдЗрд╕ SMTP session example рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
> MAIL FROM:<test@verify.local> < 250 OK > RCPT TO:<real.user@catchall-domain.com> < 250 OK > RCPT TO:<completely.fake.address@catchall-domain.com> < 250 OK > RCPT TO:<asdfghjkl12345@catchall-domain.com> < 250 OK
рд╕рднреА рддреАрди addresses рдХреЛ рд╕рдорд╛рди positive response рдорд┐рд▓рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ SMTP verification рдЕрдХреЗрд▓реЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ real user рдХреЛ fake addresses рд╕реЗ distinguish рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
Catch-All Email Servers рдХрд╛ рдкрддрд╛ рдХреИрд╕реЗ рд▓рдЧрд╛рдПрдВ
рдпрд╣ detect рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреЛрдИ mail server catch-all рдХреЗ рд░реВрдк рдореЗрдВ configured рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдПрдХ рдЪрддреБрд░ approach рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: рдПрдХ рдРрд╕реЗ address рдХреЗ рд╕рд╛рде testing рдХрд░рдирд╛ рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ server рдХреА response рдХреЛ observe рдХрд░рдирд╛ред
Detection Algorithm
Basic catch-all detection algorithm рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
- Target domain рдкрд░ рдПрдХ random, non-existent address generate рдХрд░реЗрдВ
- рдЗрд╕ fake address рдкрд░ SMTP verification рдХрд░реЗрдВ
- Response рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ:
- рдпрджрд┐ server fake address рдХреЛ accept рдХрд░рддрд╛ рд╣реИ тЖТ рдпрд╣ likely catch-all рд╣реИ
- рдпрджрд┐ server fake address рдХреЛ reject рдХрд░рддрд╛ рд╣реИ тЖТ рд╕рд╛рдорд╛рдиреНрдп verification рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИ
Node.js рдореЗрдВ Implementation
рдпрд╣рд╛рдБ catch-all detection рдХреЗ рд▓рд┐рдП рдПрдХ complete Node.js implementation рд╣реИ:
const net = require('net');
const dns = require('dns').promises;
const crypto = require('crypto');
class CatchAllDetector {
constructor(options = {}) {
this.timeout = options.timeout || 10000;
this.fromEmail = options.fromEmail || 'verify@verify.local';
this.fromDomain = options.fromDomain || 'verify.local';
}
/**
* Generate a random email address that definitely doesn't exist
*/
generateRandomEmail(domain) {
const randomString = crypto.randomBytes(16).toString('hex');
const timestamp = Date.now();
return `nonexistent-${randomString}-${timestamp}@${domain}`;
}
/**
* Get the primary MX server for a domain
*/
async getMXServer(domain) {
try {
const records = await dns.resolveMx(domain);
if (!records || records.length === 0) {
return null;
}
// Sort by priority and return the primary server
records.sort((a, b) => a.priority - b.priority);
return records[0].exchange;
} catch (error) {
return null;
}
}
/**
* Perform SMTP verification on an email address
*/
async smtpVerify(email, mxServer) {
return new Promise((resolve) => {
const socket = new net.Socket();
let step = 0;
let result = { accepted: false, response: '' };
const commands = [
null, // Wait for greeting
`EHLO ${this.fromDomain}\r\n`,
`MAIL FROM:<${this.fromEmail}>\r\n`,
`RCPT TO:<${email}>\r\n`,
'QUIT\r\n'
];
socket.setTimeout(this.timeout);
socket.on('data', (data) => {
const response = data.toString();
const code = parseInt(response.substring(0, 3));
if (step === 0 && code === 220) {
socket.write(commands[1]);
step++;
} else if (step === 1 && code === 250) {
socket.write(commands[2]);
step++;
} else if (step === 2 && code === 250) {
socket.write(commands[3]);
step++;
} else if (step === 3) {
result.response = response.trim();
result.accepted = code === 250 || code === 251;
socket.write(commands[4]);
socket.destroy();
resolve(result);
} else if (code >= 400) {
result.response = response.trim();
result.accepted = false;
socket.destroy();
resolve(result);
}
});
socket.on('timeout', () => {
result.response = 'Connection timeout';
socket.destroy();
resolve(result);
});
socket.on('error', (error) => {
result.response = `Error: ${error.message}`;
socket.destroy();
resolve(result);
});
socket.connect(25, mxServer);
});
}
/**
* Detect if a domain is configured as catch-all
*/
async detectCatchAll(domain) {
// Get MX server
const mxServer = await this.getMXServer(domain);
if (!mxServer) {
return {
isCatchAll: null,
reason: 'Could not resolve MX records',
domain
};
}
// Generate a random non-existent email
const fakeEmail = this.generateRandomEmail(domain);
// Test the fake email
const result = await this.smtpVerify(fakeEmail, mxServer);
return {
isCatchAll: result.accepted,
reason: result.accepted
? 'Server accepts mail for non-existent addresses'
: 'Server rejects non-existent addresses',
domain,
mxServer,
testEmail: fakeEmail,
serverResponse: result.response
};
}
/**
* Verify an email with catch-all detection
*/
async verifyWithCatchAllDetection(email) {
const domain = email.split('@')[1];
// First, detect if domain is catch-all
const catchAllResult = await this.detectCatchAll(domain);
if (catchAllResult.isCatchAll === null) {
return {
email,
valid: null,
catchAll: null,
reason: catchAllResult.reason
};
}
// Get MX server
const mxServer = await this.getMXServer(domain);
// Verify the actual email
const verifyResult = await this.smtpVerify(email, mxServer);
return {
email,
valid: verifyResult.accepted,
catchAll: catchAllResult.isCatchAll,
reason: catchAllResult.isCatchAll
? 'Address accepted but domain is catch-all (deliverability uncertain)'
: verifyResult.accepted
? 'Address verified successfully'
: 'Address rejected by server',
serverResponse: verifyResult.response
};
}
}
// Usage example
async function main() {
const detector = new CatchAllDetector();
// Test catch-all detection
const domains = ['gmail.com', 'example.com', 'company.com'];
for (const domain of domains) {
console.log(`\nTesting domain: ${domain}`);
const result = await detector.detectCatchAll(domain);
console.log(`Is Catch-All: ${result.isCatchAll}`);
console.log(`Reason: ${result.reason}`);
if (result.serverResponse) {
console.log(`Server Response: ${result.serverResponse}`);
}
}
// Verify specific email with catch-all detection
const emailResult = await detector.verifyWithCatchAllDetection('user@example.com');
console.log('\nEmail Verification Result:');
console.log(JSON.stringify(emailResult, null, 2));
}
main().catch(console.error);
Python рдореЗрдВ Implementation
рдпрд╣рд╛рдБ equivalent Python implementation рд╣реИ:
import socket
import dns.resolver
import secrets
import time
from dataclasses import dataclass
from typing import Optional
@dataclass
class CatchAllResult:
is_catch_all: Optional[bool]
reason: str
domain: str
mx_server: Optional[str] = None
test_email: Optional[str] = None
server_response: Optional[str] = None
@dataclass
class VerificationResult:
email: str
valid: Optional[bool]
catch_all: Optional[bool]
reason: str
server_response: Optional[str] = None
class CatchAllDetector:
def __init__(self, timeout: int = 10, from_email: str = 'verify@verify.local',
from_domain: str = 'verify.local'):
self.timeout = timeout
self.from_email = from_email
self.from_domain = from_domain
def generate_random_email(self, domain: str) -> str:
"""Generate a random email address that definitely doesn't exist."""
random_string = secrets.token_hex(16)
timestamp = int(time.time() * 1000)
return f"nonexistent-{random_string}-{timestamp}@{domain}"
def get_mx_server(self, domain: str) -> Optional[str]:
"""Get the primary MX server for a domain."""
try:
records = dns.resolver.resolve(domain, 'MX')
mx_records = sorted(
[(r.preference, str(r.exchange).rstrip('.')) for r in records],
key=lambda x: x[0]
)
return mx_records[0][1] if mx_records else None
except Exception:
return None
def smtp_verify(self, email: str, mx_server: str) -> dict:
"""Perform SMTP verification on an email address."""
result = {'accepted': False, 'response': ''}
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(self.timeout)
sock.connect((mx_server, 25))
# Receive greeting
response = sock.recv(1024).decode()
if not response.startswith('220'):
result['response'] = response.strip()
return result
# Send EHLO
sock.send(f'EHLO {self.from_domain}\r\n'.encode())
response = sock.recv(1024).decode()
if not response.startswith('250'):
result['response'] = response.strip()
return result
# Send MAIL FROM
sock.send(f'MAIL FROM:<{self.from_email}>\r\n'.encode())
response = sock.recv(1024).decode()
if not response.startswith('250'):
result['response'] = response.strip()
return result
# Send RCPT TO
sock.send(f'RCPT TO:<{email}>\r\n'.encode())
response = sock.recv(1024).decode()
result['response'] = response.strip()
code = int(response[:3])
result['accepted'] = code in (250, 251)
# Send QUIT
sock.send(b'QUIT\r\n')
sock.close()
except socket.timeout:
result['response'] = 'Connection timeout'
except socket.error as e:
result['response'] = f'Socket error: {str(e)}'
except Exception as e:
result['response'] = f'Error: {str(e)}'
return result
def detect_catch_all(self, domain: str) -> CatchAllResult:
"""Detect if a domain is configured as catch-all."""
# Get MX server
mx_server = self.get_mx_server(domain)
if not mx_server:
return CatchAllResult(
is_catch_all=None,
reason='Could not resolve MX records',
domain=domain
)
# Generate a random non-existent email
fake_email = self.generate_random_email(domain)
# Test the fake email
result = self.smtp_verify(fake_email, mx_server)
return CatchAllResult(
is_catch_all=result['accepted'],
reason='Server accepts mail for non-existent addresses' if result['accepted']
else 'Server rejects non-existent addresses',
domain=domain,
mx_server=mx_server,
test_email=fake_email,
server_response=result['response']
)
def verify_with_catch_all_detection(self, email: str) -> VerificationResult:
"""Verify an email with catch-all detection."""
domain = email.split('@')[1]
# First, detect if domain is catch-all
catch_all_result = self.detect_catch_all(domain)
if catch_all_result.is_catch_all is None:
return VerificationResult(
email=email,
valid=None,
catch_all=None,
reason=catch_all_result.reason
)
# Get MX server
mx_server = self.get_mx_server(domain)
# Verify the actual email
verify_result = self.smtp_verify(email, mx_server)
if catch_all_result.is_catch_all:
reason = 'Address accepted but domain is catch-all (deliverability uncertain)'
elif verify_result['accepted']:
reason = 'Address verified successfully'
else:
reason = 'Address rejected by server'
return VerificationResult(
email=email,
valid=verify_result['accepted'],
catch_all=catch_all_result.is_catch_all,
reason=reason,
server_response=verify_result['response']
)
# Usage example
if __name__ == '__main__':
detector = CatchAllDetector()
# Test catch-all detection
domains = ['gmail.com', 'example.com', 'company.com']
for domain in domains:
print(f"\nTesting domain: {domain}")
result = detector.detect_catch_all(domain)
print(f"Is Catch-All: {result.is_catch_all}")
print(f"Reason: {result.reason}")
if result.server_response:
print(f"Server Response: {result.server_response}")
# Verify specific email with catch-all detection
email_result = detector.verify_with_catch_all_detection('user@example.com')
print("\nEmail Verification Result:")
print(f" Email: {email_result.email}")
print(f" Valid: {email_result.valid}")
print(f" Catch-All: {email_result.catch_all}")
print(f" Reason: {email_result.reason}")
Advanced Detection Techniques
Basic catch-all detection рдХреЛ рдЗрди advanced techniques рд╕реЗ improve рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
1. Multiple Probe Testing
рд╕рд┐рд░реНрдл рдПрдХ fake address рдХреЗ рд╕рд╛рде test рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдХрдИ randomly generated addresses рдХреЗ рд╕рд╛рде test рдХрд░реЗрдВред рдпрд╣ inconsistent behavior рд╡рд╛рд▓реЗ servers рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ:
async detectCatchAllAdvanced(domain, probeCount = 3) {
const results = [];
for (let i = 0; i < probeCount; i++) {
const fakeEmail = this.generateRandomEmail(domain);
const result = await this.smtpVerify(fakeEmail, await this.getMXServer(domain));
results.push(result.accepted);
// Small delay between probes to avoid rate limiting
await new Promise(resolve => setTimeout(resolve, 500));
}
// Analyze results
const acceptedCount = results.filter(r => r).length;
if (acceptedCount === probeCount) {
return { isCatchAll: true, confidence: 'high' };
} else if (acceptedCount === 0) {
return { isCatchAll: false, confidence: 'high' };
} else {
return { isCatchAll: null, confidence: 'low', note: 'Inconsistent server behavior' };
}
}
2. Pattern-Based Detection
рдХреБрдЫ catch-all servers patterns рдХреЗ рд╕рд╛рде configured рд╣реЛрддреЗ рд╣реИрдВред рд╡рд┐рднрд┐рдиреНрди formats рдХреЗ рд╕рд╛рде addresses рдХреЛ test рдХрд░реЗрдВ:
const testPatterns = [
`nonexistent${Date.now()}@${domain}`, // Random with timestamp
`zzz-fake-user-zzz@${domain}`, // Obvious fake pattern
`test.${crypto.randomUUID()}@${domain}`, // UUID format
`admin-backup-${Date.now()}@${domain}` // Administrative-looking
];
3. Response Code Analysis
рдЕрддрд┐рд░рд┐рдХреНрдд insight рдХреЗ рд▓рд┐рдП specific SMTP response codes рдФрд░ messages рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ:
function analyzeResponse(response) {
const code = parseInt(response.substring(0, 3));
const message = response.toLowerCase();
if (code === 250) {
if (message.includes('accepted for delivery')) {
return { accepted: true, type: 'explicit_accept' };
}
return { accepted: true, type: 'standard_accept' };
}
if (code === 550) {
if (message.includes('user unknown') || message.includes('no such user')) {
return { accepted: false, type: 'user_not_found' };
}
if (message.includes('rejected') || message.includes('denied')) {
return { accepted: false, type: 'policy_rejection' };
}
}
if (code === 451 || code === 452) {
return { accepted: null, type: 'temporary_failure' };
}
return { accepted: code < 400, type: 'unknown' };
}
Catch-All Emails рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдПрдВ
рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рдХрд┐рд╕реА catch-all domain рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЕрдкрдиреЗ email verification workflow рдореЗрдВ рдЙрди addresses рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ strategy рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
Strategy 1: Risk-Based Classification
рдПрдХ risk classification system implement рдХрд░реЗрдВ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди confidence levels assign рдХрд░рддрд╛ рд╣реИ:
function classifyEmailRisk(verificationResult) {
const { valid, catchAll, domain } = verificationResult;
if (!valid) {
return { risk: 'high', action: 'reject', reason: 'Invalid email address' };
}
if (!catchAll) {
return { risk: 'low', action: 'accept', reason: 'Verified deliverable' };
}
// Catch-all domain - assess additional risk factors
const riskFactors = [];
// Check domain age and reputation (would need external data)
// Check if domain is a known business domain
// Check email pattern (role-based, random, etc.)
const localPart = verificationResult.email.split('@')[0];
if (isRoleBasedAddress(localPart)) {
riskFactors.push('role_based');
}
if (looksRandomlyGenerated(localPart)) {
riskFactors.push('random_looking');
}
if (riskFactors.length >= 2) {
return { risk: 'high', action: 'reject', reason: 'Catch-all with multiple risk factors' };
}
if (riskFactors.length === 1) {
return { risk: 'medium', action: 'flag', reason: 'Catch-all with one risk factor' };
}
return { risk: 'medium', action: 'accept_with_caution', reason: 'Catch-all domain' };
}
function isRoleBasedAddress(localPart) {
const rolePatterns = [
'admin', 'info', 'support', 'sales', 'contact',
'help', 'webmaster', 'postmaster', 'noreply', 'no-reply'
];
return rolePatterns.some(pattern =>
localPart.toLowerCase().includes(pattern)
);
}
function looksRandomlyGenerated(localPart) {
// Check for high entropy (random-looking strings)
const consonants = localPart.match(/[bcdfghjklmnpqrstvwxyz]/gi) || [];
const vowels = localPart.match(/[aeiou]/gi) || [];
if (consonants.length > 0 && vowels.length === 0) {
return true; // No vowels suggests random
}
if (localPart.length > 20) {
return true; // Very long local parts are suspicious
}
// Check for number sequences
if (/\d{5,}/.test(localPart)) {
return true; // Long number sequences
}
return false;
}
Strategy 2: Engagement-Based Filtering
Marketing рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, catch-all addresses рдХреЛ filter рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП engagement data рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
function shouldIncludeInCampaign(email, engagementData, catchAllStatus) {
// Always include if we have positive engagement history
if (engagementData.hasOpened || engagementData.hasClicked) {
return { include: true, reason: 'Previous engagement confirmed' };
}
// Non-catch-all verified emails are safe
if (!catchAllStatus.isCatchAll && catchAllStatus.verified) {
return { include: true, reason: 'Verified deliverable' };
}
// Catch-all with no engagement history - be cautious
if (catchAllStatus.isCatchAll) {
// Check if we've successfully delivered before
if (engagementData.previousDeliveries > 0 && engagementData.bounceRate < 0.1) {
return { include: true, reason: 'Previous successful deliveries' };
}
// New catch-all address with no history
return {
include: false,
reason: 'Catch-all domain with no engagement history',
recommendation: 'Send verification email first'
};
}
return { include: true, reason: 'Default include' };
}
Strategy 3: Gradual Warming
Catch-all addresses рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рджреМрд░рд╛рди, рдПрдХ gradual sending strategy implement рдХрд░реЗрдВ:
class CatchAllWarmingStrategy {
constructor() {
this.warmingGroups = {
verified: { dailyLimit: 1000, priority: 1 },
catchAllEngaged: { dailyLimit: 500, priority: 2 },
catchAllNew: { dailyLimit: 100, priority: 3 }
};
}
categorizeAddress(email, verification, engagement) {
if (!verification.catchAll) {
return 'verified';
}
if (engagement.hasInteracted) {
return 'catchAllEngaged';
}
return 'catchAllNew';
}
buildSendingQueue(emails, verifications, engagements) {
const categorized = {
verified: [],
catchAllEngaged: [],
catchAllNew: []
};
emails.forEach(email => {
const category = this.categorizeAddress(
email,
verifications[email],
engagements[email] || {}
);
categorized[category].push(email);
});
// Build queue respecting daily limits
const queue = [];
Object.entries(this.warmingGroups)
.sort((a, b) => a[1].priority - b[1].priority)
.forEach(([category, config]) => {
const addresses = categorized[category].slice(0, config.dailyLimit);
queue.push(...addresses.map(email => ({
email,
category,
priority: config.priority
})));
});
return queue;
}
}
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рдХреЗрд╕ рд╕реНрдЯрдбреАрдЬ
рдХреЗрд╕ рд╕реНрдЯрдбреА 1: E-commerce Company List Cleaning
500,000 email subscribers рдХреЗ рд╕рд╛рде рдПрдХ рдордзреНрдпрдо рдЖрдХрд╛рд░ рдХреА e-commerce company рдЕрдкрдиреА deliverability rates improve рдХрд░рдирд╛ рдЪрд╛рд╣рддреА рдереАред рдЙрдирдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдиреЗ reveal рдХрд┐рдпрд╛:
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐:
- 500,000 рдХреБрд▓ subscribers
- Campaigns рдкрд░ 12% bounce rate
- Catch-all domains рдкрд░ 45,000 addresses (9%)
Verification рдкрд░рд┐рдгрд╛рдо:
- 425,000 verified deliverable (non-catch-all)
- 45,000 catch-all addresses identified
- 30,000 invalid addresses removed
Catch-All Handling Strategy:
рд╕рднреА catch-all addresses рдХреЛ remove рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрдХ tiered approach implement рдХрд┐рдпрд╛:
- Tier 1 - Keep: 15,000 catch-all addresses рдЬрд┐рдирдореЗрдВ previous engagement рд╣реИ (6 рдорд╣реАрдиреЛрдВ рдХреЗ рднреАрддрд░ opens рдпрд╛ clicks)
- Tier 2 - Verify: 20,000 catch-all addresses рдХреЛ re-engagement campaign рднреЗрдЬрд╛ рдЧрдпрд╛
- Tier 3 - Remove: 10,000 catch-all addresses рдЬрд┐рдирдореЗрдВ рдХреЛрдИ engagement history рдирд╣реАрдВ рдереА рдФрд░ suspicious patterns рдереЗ
3 рдорд╣реАрдиреЛрдВ рдХреЗ рдмрд╛рдж рдкрд░рд┐рдгрд╛рдо:
- Bounce rate 2.1% рддрдХ рдЧрд┐рд░ рдЧрдИ
- Open rates рдореЗрдВ 18% рдХреА рд╡реГрджреНрдзрд┐ рд╣реБрдИ
- Sender reputation score рдореЗрдВ significant рд╕реБрдзрд╛рд░ рд╣реБрдЖ
- Email deliverability 98.5% рддрдХ рдкрд╣реБрдВрдЪ рдЧрдИ
рдХреЗрд╕ рд╕реНрдЯрдбреА 2: B2B SaaS Lead Validation
рдПрдХ B2B SaaS company рдЬреЛ monthly 10,000 new leads рдкреНрд░рд╛рдкреНрдд рдХрд░рддреА рдереА, рдЙрдиреНрд╣реЛрдВрдиреЗ рдЕрдкрдиреЗ signup flow рдореЗрдВ catch-all detection implement рдХрд┐рдпрд╛:
рдЪреБрдиреМрддреА: рдХрдИ B2B leads catch-all рдХреЗ рд░реВрдк рдореЗрдВ configured company domains рд╕реЗ рдЖрдИ рдереАрдВ, рдЬрд┐рд╕рд╕реЗ verification рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЧрдпрд╛ред рд╡реЗ valuable leads рдЦреЛрдП рдмрд┐рдирд╛ рд╕рднреА catch-all addresses рдХреЛ simply reject рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдереЗред
рд╕рдорд╛рдзрд╛рди:
async function validateB2BLead(email, companyInfo) {
const verification = await verifyEmail(email);
const catchAllResult = await detectCatchAll(email.split('@')[1]);
if (!verification.valid) {
return { accept: false, reason: 'Invalid email' };
}
if (!catchAllResult.isCatchAll) {
return { accept: true, reason: 'Verified deliverable', confidence: 'high' };
}
// Catch-all domain - use company info to validate
const domainMatchesCompany = email.split('@')[1].includes(
companyInfo.name.toLowerCase().replace(/\s+/g, '')
);
if (domainMatchesCompany) {
// Email domain matches company name - likely legitimate
return {
accept: true,
reason: 'Catch-all but matches company domain',
confidence: 'medium',
requireVerification: true
};
}
// Catch-all with unrelated domain
return {
accept: true,
reason: 'Catch-all domain',
confidence: 'low',
requireVerification: true,
sendDoubleOptIn: true
};
}
рдкрд░рд┐рдгрд╛рдо:
- Lead acceptance rate 95% рдкрд░ maintained рд░рд╣реА
- False positive rejection рдореЗрдВ 60% рдХреА рдХрдореА
- Catch-all рдХреЗ рд▓рд┐рдП double opt-in confirmation rate: 72%
- Overall lead quality рдореЗрдВ 25% рд╕реБрдзрд╛рд░
Catch-All Detection рдХреЗ рд▓рд┐рдП BillionVerify рдХрд╛ рдЙрдкрдпреЛрдЧ
рдЬрдмрдХрд┐ рдЕрдкрдирд╛ catch-all detection рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ, BillionVerify рдЬреИрд╕реА professional email verification service рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдн рдорд┐рд▓рддреЗ рд╣реИрдВ:
API Integration Example
const axios = require('axios');
async function verifyWithBillionVerify(email) {
const response = await axios.post(
'https://api.billionverify.com/v1/verify',
{ email },
{
headers: {
'Authorization': `Bearer ${process.env.BILLIONVERIFY_API_KEY}`,
'Content-Type': 'application/json'
}
}
);
const result = response.data;
return {
email: result.email,
deliverable: result.deliverable,
isCatchAll: result.is_catch_all,
isDisposable: result.is_disposable,
isRoleBased: result.is_role_address,
qualityScore: result.quality_score,
recommendation: result.recommendation
};
}
// Bulk verification with catch-all handling
async function bulkVerifyWithStrategy(emails) {
const results = await Promise.all(
emails.map(email => verifyWithBillionVerify(email))
);
return {
safe: results.filter(r => r.deliverable && !r.isCatchAll),
catchAll: results.filter(r => r.deliverable && r.isCatchAll),
invalid: results.filter(r => !r.deliverable),
stats: {
total: results.length,
safeCount: results.filter(r => r.deliverable && !r.isCatchAll).length,
catchAllCount: results.filter(r => r.deliverable && r.isCatchAll).length,
invalidCount: results.filter(r => !r.deliverable).length
}
};
}
BillionVerify рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдн
Higher Accuracy: рд╣рдорд╛рд░рд╛ catch-all detection рдХрдИ verification techniques рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЬреНрдЮрд╛рдд catch-all domains рдХрд╛ рдПрдХ extensive database maintain рдХрд░рддрд╛ рд╣реИред
Additional Intelligence: Catch-all detection рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ disposable email detection, role-based address identification рдФрд░ quality scoring рдорд┐рд▓рддреА рд╣реИред
Rate Limit Management: рд╣рдо rate limiting рдФрд░ IP rotation рдХреЛ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВ, рдЬреЛ blocks рдХреЗ рдмрд┐рдирд╛ consistent verification рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред
Historical Data: Historical verification data рддрдХ рдкрд╣реБрдВрдЪ patterns рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдФрд░ decision-making рдХреЛ improve рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреА рд╣реИред
Real-Time Updates: рд╣рдорд╛рд░рд╛ catch-all database domain configurations рдХреЗ рдмрджрд▓рдиреЗ рдкрд░ continuously update рд╣реЛрддрд╛ рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
Catch-all email detection рдХрд┐рд╕реА рднреА comprehensive email verification strategy рдХрд╛ рдПрдХ critical component рд╣реИред рдЬрдмрдХрд┐ рдпреЗ servers verification рдХреЗ рд▓рд┐рдП рдЪреБрдиреМрддрд┐рдпрд╛рдВ present рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рд╕рдордЭрдирд╛ рдХрд┐ рд╡реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдЪрд┐рдд detection рдФрд░ handling strategies рдХреЛ implement рдХрд░рдирд╛ рдЖрдкрдХреЛ valuable contacts рдЦреЛрдП рдмрд┐рдирд╛ high deliverability rates рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЗрд╕ рдЧрд╛рдЗрдб рд╕реЗ рдореБрдЦреНрдп takeaways:
- Catch-all servers рд╕рднреА mail рдХреЛ accept рдХрд░рддреЗ рд╣реИрдВ рдЪрд╛рд╣реЗ specific mailbox рдореМрдЬреВрдж рд╣реЛ рдпрд╛ рдирд╣реАрдВ
- Detection рдореЗрдВ рдЙрди addresses рдХреЗ рд╕рд╛рде testing рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВ
- Catch-all addresses рдХреЛ automatically reject рди рдХрд░реЗрдВтАФrisk-based strategies implement рдХрд░реЗрдВ
- Catch-all contacts рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ informed decisions рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП engagement data рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
- Production systems рдХреЗ рд▓рд┐рдП BillionVerify рдЬреИрд╕реА professional services рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ
рдЕрдкрдиреЗ workflow рдореЗрдВ catch-all detection implement рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ? Individual addresses рдХреЛ test рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░рд╛ email checker tool рдЖрдЬрд╝рдорд╛рдПрдВ, рдпрд╛ рдЕрдкрдиреЗ applications рдореЗрдВ seamless integration рдХреЗ рд▓рд┐рдП BillionVerify API рдХреЛ explore рдХрд░реЗрдВред
Catch-all domains рдХреЛ рдареАрдХ рд╕реЗ рд╕рдВрднрд╛рд▓рдХрд░, рдЖрдк рдЕрдкрдиреА email deliverability рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдЕрдкрдиреА sender reputation рдХреА рд░рдХреНрд╖рд╛ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЕрдкрдиреЗ email contacts рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреЗрд╣рддрд░ decisions рд▓реЗрдВрдЧреЗред