Elke e-mail die je verstuurt, reist door een zorgvuldig georkestreerd netwerk van servers, en Mail Exchange (MX) records zijn de wegwijzers die deze reis begeleiden. Het begrijpen van hoe je MX records valideert, is een fundamentele vaardigheid voor elke ontwikkelaar die e-mailverificatiesystemen, contactformulieren of applicaties bouwt die e-mailadressen verzamelen. Deze uitgebreide gids verkent MX record validatie van basisconcepten tot geavanceerde implementatiestrategieën, waardoor je de kennis krijgt om robuuste e-mailverificatie in je applicaties te bouwen.
MX Records Begrijpen
Mail Exchange records zijn DNS-records die specificeren welke mailservers verantwoordelijk zijn voor het accepteren van e-mail namens een domein. Wanneer je een e-mail stuurt naar user@example.com, moet je mailserver weten waar deze te bezorgen. MX records leveren deze informatie door te verwijzen naar de mailservers van het domein.
Hoe MX Records Werken
Wanneer een e-mail wordt verzonden, voert de verzendende mailserver een DNS lookup uit om de MX records voor het domein van de ontvanger te vinden. Deze lookup retourneert een of meer mailserver hostnamen samen met prioriteitswaarden die de voorkeursvolgorde aangeven.
Een typische MX record lookup voor gmail.com zou kunnen teruggeven:
De verzendende server probeert eerst bezorging naar de server met de laagste prioriteit (in dit geval prioriteit 5). Als die server niet beschikbaar is, probeert deze het volgende prioriteitsniveau, enzovoort. Deze redundantie zorgt voor e-mailbezorging zelfs wanneer individuele servers offline zijn.
MX Record Componenten
Elk MX record bevat twee essentiële informatiestukken:
Prioriteit (Voorkeur)
Een numerieke waarde die de volgorde aangeeft waarin mailservers geprobeerd moeten worden. Lagere nummers geven hogere prioriteit aan. Servers met dezelfde prioriteit worden in willekeurige volgorde geprobeerd, wat load balancing biedt.
Mailserver Hostnaam
De Fully Qualified Domain Name (FQDN) van de mailserver die e-mail afhandelt voor het domein. Deze hostnaam moet oplossen naar een IP-adres via een A of AAAA record.
Waarom MX Records Belangrijk Zijn voor E-mailverificatie
MX record validatie dient als een kritisch controlepunt in het e-mailverificatieproces:
Bevestiging van Domeinbestaan
Als een domein geen MX records heeft, kan het doorgaans geen e-mail ontvangen. Sommige domeinen hebben mogelijk een A record fallback, maar de afwezigheid van MX records is vaak een sterke indicator dat het domein niet is geconfigureerd voor e-mail.
Begin vandaag nog met het verifiëren van e-mails met BillionVerify. Ontvang 100 gratis credits bij aanmelding - geen creditcard vereist. Sluit u aan bij duizenden bedrijven die hun e-mailmarketing-ROI verbeteren met nauwkeurige e-mailverificatie.
Geen creditcard vereist · 100+ gratis credits per dag · Start binnen 30 seconden
99.9%
Nauwkeurigheid
Real-time
API-snelheid
$0.00014
Per e-mail
100/day
Altijd gratis
Infrastructuurverificatie
Geldige MX records die oplossen naar werkende mailservers geven aan dat het domein e-mailinfrastructuur heeft. Dit garandeert niet dat een specifiek adres bestaat, maar bevestigt wel dat het domein e-mail kan ontvangen.
Spam en Fraudedetectie
Legitieme bedrijven onderhouden correcte MX records. Verdachte domeinen die worden gebruikt voor spam of fraude hebben vaak verkeerd geconfigureerde of ontbrekende MX records.
Prestatieoptimalisatie
Het controleren van MX records voordat je SMTP-verificatie probeert, voorkomt verspilde tijd bij het verbinden met domeinen die geen e-mail kunnen ontvangen.
MX Record Lookups Implementeren
Laten we verkennen hoe je MX record validatie implementeert in verschillende programmeeromgevingen.
Node.js Implementatie
Node.js biedt ingebouwde DNS-resolutie via de dns module:
const dns = require('dns').promises;
async function getMxRecords(domain) {
try {
const records = await dns.resolveMx(domain);
// Sort by priority (lowest first)
records.sort((a, b) => a.priority - b.priority);
return {
success: true,
domain,
records: records.map(r => ({
exchange: r.exchange,
priority: r.priority
}))
};
} catch (error) {
return {
success: false,
domain,
error: error.code,
message: getMxErrorMessage(error.code)
};
}
}
function getMxErrorMessage(code) {
const messages = {
'ENODATA': 'No MX records found for this domain',
'ENOTFOUND': 'Domain does not exist',
'ETIMEOUT': 'DNS lookup timed out',
'ESERVFAIL': 'DNS server failed to respond'
};
return messages[code] || 'Unknown DNS error';
}
// Usage
const result = await getMxRecords('gmail.com');
console.log(result);
Python Implementatie
Python's dns.resolver module uit de dnspython bibliotheek biedt uitgebreide DNS lookup mogelijkheden:
import dns.resolver
import dns.exception
def get_mx_records(domain):
try:
answers = dns.resolver.resolve(domain, 'MX')
records = []
for rdata in answers:
records.append({
'exchange': str(rdata.exchange).rstrip('.'),
'priority': rdata.preference
})
# Sort by priority
records.sort(key=lambda x: x['priority'])
return {
'success': True,
'domain': domain,
'records': records
}
except dns.resolver.NXDOMAIN:
return {
'success': False,
'domain': domain,
'error': 'NXDOMAIN',
'message': 'Domain does not exist'
}
except dns.resolver.NoAnswer:
return {
'success': False,
'domain': domain,
'error': 'NoAnswer',
'message': 'No MX records found for this domain'
}
except dns.exception.Timeout:
return {
'success': False,
'domain': domain,
'error': 'Timeout',
'message': 'DNS lookup timed out'
}
# Usage
result = get_mx_records('gmail.com')
print(result)
Go Implementatie
Go's net package biedt eenvoudige DNS lookup functies:
package main
import (
"fmt"
"net"
"sort"
)
type MxResult struct {
Success bool
Domain string
Records []MxRecord
Error string
}
type MxRecord struct {
Exchange string
Priority uint16
}
func getMxRecords(domain string) MxResult {
records, err := net.LookupMX(domain)
if err != nil {
return MxResult{
Success: false,
Domain: domain,
Error: err.Error(),
}
}
if len(records) == 0 {
return MxResult{
Success: false,
Domain: domain,
Error: "No MX records found",
}
}
// Sort by priority
sort.Slice(records, func(i, j int) bool {
return records[i].Pref < records[j].Pref
})
result := MxResult{
Success: true,
Domain: domain,
Records: make([]MxRecord, len(records)),
}
for i, r := range records {
result.Records[i] = MxRecord{
Exchange: r.Host,
Priority: r.Pref,
}
}
return result
}
func main() {
result := getMxRecords("gmail.com")
fmt.Printf("%+v\n", result)
}
Geavanceerde MX Validatietechnieken
Basis MX lookups bevestigen dat records bestaan, maar uitgebreide e-mailvalidatie vereist diepere analyse.
Mailserver Connectiviteit Valideren
MX records verwijzen naar hostnamen die moeten oplossen naar IP-adressen. Verifieer dat de mailservers daadwerkelijk bereikbaar zijn:
const dns = require('dns').promises;
const net = require('net');
async function validateMxConnectivity(domain) {
// Get MX records
const mxResult = await getMxRecords(domain);
if (!mxResult.success) {
return mxResult;
}
// Validate each mail server
const validatedRecords = [];
for (const record of mxResult.records) {
const validation = await validateMailServer(record.exchange);
validatedRecords.push({
...record,
...validation
});
}
return {
success: true,
domain,
records: validatedRecords,
hasReachableServer: validatedRecords.some(r => r.reachable)
};
}
async function validateMailServer(hostname) {
try {
// Resolve hostname to IP
const addresses = await dns.resolve4(hostname);
if (addresses.length === 0) {
return { reachable: false, error: 'No A record' };
}
// Test connection to port 25
const connected = await testConnection(addresses[0], 25);
return {
reachable: connected,
ip: addresses[0],
error: connected ? null : 'Connection refused'
};
} catch (error) {
return {
reachable: false,
error: error.message
};
}
}
function testConnection(host, port, timeout = 5000) {
return new Promise((resolve) => {
const socket = new net.Socket();
socket.setTimeout(timeout);
socket.on('connect', () => {
socket.destroy();
resolve(true);
});
socket.on('timeout', () => {
socket.destroy();
resolve(false);
});
socket.on('error', () => {
resolve(false);
});
socket.connect(port, host);
});
}
A Record Fallback Afhandelen
Wanneer er geen MX records bestaan, specificeren e-mailstandaarden (RFC 5321) dat het A record van het domein als fallback gebruikt moet worden. Implementeer deze fallback in je validatie:
async function getMailServers(domain) {
// Try MX records first
try {
const mxRecords = await dns.resolveMx(domain);
if (mxRecords.length > 0) {
return {
type: 'MX',
servers: mxRecords.sort((a, b) => a.priority - b.priority)
};
}
} catch (error) {
if (error.code !== 'ENODATA') {
throw error;
}
}
// Fallback to A record
try {
const aRecords = await dns.resolve4(domain);
if (aRecords.length > 0) {
return {
type: 'A_FALLBACK',
servers: [{ exchange: domain, priority: 0 }],
warning: 'Using A record fallback - no MX records found'
};
}
} catch (error) {
if (error.code !== 'ENODATA') {
throw error;
}
}
return {
type: 'NONE',
servers: [],
error: 'No mail servers found for domain'
};
}
Null MX Records Detecteren
RFC 7505 definieert "null MX" records die expliciet aangeven dat een domein geen e-mail accepteert. Deze records hebben een enkel MX entry met prioriteit 0 en een lege hostnaam ("."):
function hasNullMx(mxRecords) {
if (mxRecords.length === 1) {
const record = mxRecords[0];
if (record.priority === 0 &&
(record.exchange === '.' || record.exchange === '')) {
return true;
}
}
return false;
}
async function validateDomainMx(domain) {
const mxResult = await getMxRecords(domain);
if (!mxResult.success) {
return mxResult;
}
if (hasNullMx(mxResult.records)) {
return {
success: false,
domain,
error: 'NULL_MX',
message: 'Domain explicitly does not accept email'
};
}
return mxResult;
}
MX Lookups Cachen
DNS lookups voegen latency toe aan elke verificatie. Implementeer caching om de prestaties te verbeteren:
Hoewel het zelf implementeren van MX validatie educatieve waarde biedt, behandelen professionele e-mailverificatieservices zoals BillionVerify MX validatie als onderdeel van uitgebreide e-mailverificatie.
Voordelen van een E-mailverificatie API Gebruiken
Uitgebreide Controles
BillionVerify's e-mailverificatie API combineert MX validatie met syntaxcontrole, SMTP-verificatie, detectie van wegwerp-e-mail en meer in een enkele API call. Dit elimineert de noodzaak om meerdere validatiesystemen te onderhouden.
Geoptimaliseerde Infrastructuur
Professionele services onderhouden wereldwijd verspreide DNS resolvers, handelen caching op schaal af en optimaliseren voor prestaties over miljoenen verificaties.
Continue Updates
Mailserver configuraties veranderen constant. E-mailverificatieservices updaten voortdurend hun databases van bekende providers, wegwerpdomeinen en mailserver patronen.
API Integratie Voorbeeld
async function verifyEmailWithBillionVerify(email) {
const response = await fetch('https://api.billionverify.com/v1/verify', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.BV_API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({ email })
});
const result = await response.json();
// MX information is included in the response
console.log('MX Valid:', result.mx_found);
console.log('Domain Valid:', result.domain_valid);
console.log('Is Deliverable:', result.is_deliverable);
return result;
}
Conclusie
MX record validatie is een fundamenteel onderdeel van e-mailverificatie dat bevestigt dat een domein e-mail kan ontvangen voordat meer resource-intensieve controles worden geprobeerd. Door correcte MX validatie te implementeren, kun je snel ongeldige domeinen filteren, verificatieprestaties optimaliseren en betrouwbaardere e-mailverwerkende applicaties bouwen.
Belangrijkste lessen voor MX record validatie:
Controleer altijd MX records voordat je SMTP-verificatie probeert om tijd en resources te besparen
Behandel de A record fallback volgens RFC-standaarden voor domeinen zonder MX records
Implementeer caching om DNS lookup overhead te verminderen voor herhaalde validaties
Herken veelvoorkomende patronen om e-mailproviders en potentiële risico's te identificeren
Behandel fouten netjes met timeouts, retries en correcte foutmeldingen
Of je nu een aangepast e-mailverificatiesysteem bouwt of integreert met een service zoals BillionVerify, het begrijpen van MX records helpt je betere e-mailafhandeling in je applicaties te bouwen. Begin vandaag nog met het implementeren van MX validatie en zet de eerste stap naar uitgebreide e-mailverificatie.
Teams die Instantly of Smartlead gebruiken, verbeteren hun bezorgbaarheid door lijsten met BillionVerify te reinigen voor elke campagne.
Vergelijk BillionVerify met ZeroBounce op nauwkeurigheid en snelheid voordat u een verificatieprovider kiest.