Deze functie heb ik gemaakt, en de bedoeling is dat ik hiermee controleer of er een bestaand domein in een mailadres gebruikt wordt in mijn contactformulier. Dus iets als bladieblaargh.nl zal geweigerd moeten worden.

Is dit nog een beetje van de tijd, of moet ik met andere dingen rekening houden?
Of heeft dit weinig zin meer omdat ik bepaalde legit domeinen uitsluit?

<?php
function ValidateDomainForMail($email){
list($user, $domain) = explode('@', $email);
$array = dns_get_record($domain,DNS_MX);
if($array[0]['host']==$domain&&!empty($array[0]['target'])){
return $array[0]['target'];
}
}
$mail= '[email protected]';

if(ValidateDomainForMail($mail)) {
echo "Het domein accepteert e-mails.";
}
else {
echo "Het domein accepteert geen mail. ";
}
?>
Wat returnt dit?

return $array[0]['target'];
Ik heb het even verbeterd met een boolean als return, en een print_r.
<?php
function ValidateDomainForMail($email) {
list($user, $domain) = explode('@', $email);
$array = dns_get_record($domain, DNS_MX);
print_r($array);
if ($array[0]['host'] == $domain && !empty($array[0]['target'])) {
return true;
} else {
return false;
}
}
?>

Ik heb een aantal domeinen getest en geen probleem.
Maar als het goed is sluit ik hopelijk niemand buiten?
>> Ik heb het even verbeterd met een boolean als return

Dat lijkt me inderdaad al logischer :)

$array[0]['host'] == $domain

Kan de host überhaupt iets anders opleveren dan het ingevoerde domein via dns_get_record?

Ik zou via : bool aangeven dat er een boolean wordt gereturned.

Die else in de if-constructie kun je weglaten.

Beter nog, alles op 1 regel:

<?php

return ($array[0]['host'] == $domain && !empty($array[0]['target']));

?>
Hier komt altijd een true of false uit.
Dat is veel netter. Maar het gaat mij vooral om de controle op de DNS.
- Ariën - op 23/12/2022 15:51:09

Deze functie heb ik gemaakt, en de bedoeling is dat ik hiermee controleer of er een bestaand domein in een mailadres gebruikt wordt in mijn contactformulier. Dus iets als bladieblaargh.nl zal geweigerd moeten worden.

Is dit nog een beetje van de tijd, of moet ik met andere dingen rekening houden?
Of heeft dit weinig zin meer omdat ik bepaalde legit domeinen uitsluit?
?>

Hangt er van af of domeinen checken echt is wat je wilt.
Omdat het in combinatie met een e-mailveld is wil je waarschijnlijk eerder het mailadres valideren. Maar dat kan niet, omdat er geen enkele wereldwijd gebruikte standaard bestaat voor mailadressen. De enige manier om een e-mailadres te valideren is door een mail te sturen naar dat adres, en een antwoord te verwachten vanaf dat mailadres.
Vanuit dat oogpunt kan je van te voren een paar logische checks bedenken op de domeinnaam. Bijvoorbeeld een geldige TLD, die kan je met de lijst van TLD's filteren. Pas dan zou ik checken op DNS record en pas daarna mailen, om het verkeer te beperken.
Je zegt dat er geen standaard is om te controleren of mailadressen kloppen. Daar heb je gelijk in.
Maar als een domein geen MX-record heeft, dan kan ik je er toch vanuit gaan dat mailen altijd zinloos is?

Ik snap wel dat niet 100% kan controleren of een alias zoals [email protected] wel zou bestaan en [email protected] weer niet. De enige oplossing is een bouncemail afwachten, maar dat is niet altijd zo op domeinen. Sommige hebben (hopelijk bewust) een catch-all draaien.

Maar het gaat mij om de domein. Zodat iets als ikbestaechtniet.nl geweigerd wordt als deze niet bestaat of een MX-record heeft.
Dat is slim, om vooraf het MX-record te controleren.
Ik denk dat er veel contactformulieren zijn die dat niet hebben.
>> Je zegt dat er geen standaard is om te controleren of mailadressen kloppen.

filter_var('[email protected]', FILTER_VALIDATE_EMAIL)

Deze checkt of in ieder geval de syntax klopt.
Klopt, maar ik doelde niet op de validatie. Die kende ik allang.
Het ging mij erom of de domein ervan bekend was op internet en of die mails accepteert.

Reageren