✦ Oplossingen · Website & hosting

Mail vanaf je website komt niet aan (PHP mail, SPF, DKIM)

Contactformulier verstuurt niets, of de mail belandt in spam? Vaak verstuurt PHP mail() zonder SPF/DKIM namens je domein. Zo zet je verzending via SMTP op en controleer je de DNS.

Waarom gebeurt dit?

Veel websites versturen mail met de PHP-functie mail(). Die geeft de mail af aan de mailserver van de webserver, die hem namens jouw domein verstuurt. Staat die server niet in het SPF-record van je domein en ondertekent hij niet met DKIM, dan zien ontvangers de mail als verdacht: hij komt in de spam of wordt geweigerd.

mail() geeft bovendien alleen terug of de mail is afgegeven, niet of hij aankwam. Een formulier kan dus 'verzonden' zeggen terwijl er niets aankomt.

Zo los je het op, stap voor stap

Menunamen kunnen per versie of toestel iets anders heten. Loop de stappen op volgorde af en stop zodra het werkt.

  1. Controleer het SPF-record van je domein

    Het SPF-record (een TXT-record) noemt welke servers namens je domein mogen mailen. Met onze Mail-DNS-check of met dig zie je het.

    dig +short TXT voorbeeld.nl | grep spf
  2. Verstuur via SMTP met een echte mailbox

    Laat de website inloggen op de mailserver van je domein en daar versturen. Dan klopt SPF en kan DKIM worden toegepast. In WordPress doe je dat met een SMTP-plugin; in eigen code bijvoorbeeld met PHPMailer.

    <?php
    use PHPMailer\PHPMailer\PHPMailer;
    
    $mail = new PHPMailer(true);
    $mail->isSMTP();
    $mail->Host = 'smtp.jouwmailprovider.nl';
    $mail->SMTPAuth = true;
    $mail->Username = 'website@voorbeeld.nl';
    $mail->Password = getenv('SMTP_WACHTWOORD');
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
    $mail->Port = 587;
    $mail->setFrom('website@voorbeeld.nl', 'Website');
    $mail->addAddress('info@voorbeeld.nl');
    $mail->addReplyTo($emailBezoeker);
    $mail->Subject = 'Nieuw bericht via de website';
    $mail->Body = $bericht;
    $mail->send();
  3. Gebruik je eigen domein als afzender

    Zet als afzender (From) een adres van je eigen domein, en het adres van de bezoeker in Reply-To. Mail 'namens' een Gmail- of Hotmail-adres van een bezoeker faalt door hun DMARC-beleid.

  4. Zet DKIM en DMARC aan

    Laat je mailprovider DKIM inschakelen (een TXT- of CNAME-record) en voeg een DMARC-record toe. Zie mail komt in de spam.

  5. Controleer de mailserver-log

    Op een eigen server laat het maillog zien of de mail is verstuurd en wat de ontvangende server antwoordde.

    sudo tail -n 50 /var/log/mail.log

Lukt het niet? Wij helpen

Kom je er met deze stappen niet uit, of wil je het liever niet zelf doen? We kijken online mee of komen langs. Hulp op afstand kost €20 per uur; komen we langs, dan is de prijs op aanvraag. Je weet vooraf waar je aan toe bent.

Aanvraag

Hulp aanvragen

Schrijf kort wat er misgaat en wat je al hebt geprobeerd. Kies of we bellen, online meekijken of langskomen.

Veelgestelde vragen

Vragen over dit probleem

Het formulier zegt 'verzonden', maar er komt niets.

mail() meldt alleen dat de mail is afgegeven. Kijk in de spam, in het maillog, en stap over op SMTP.

Mag ik het adres van de bezoeker als afzender gebruiken?

Liever niet: de mail wordt dan namens een domein verstuurd dat jouw server niet toestaat. Zet de bezoeker in Reply-To.

Waar laat ik het SMTP-wachtwoord?

Niet in code die in een openbare repository staat. Gebruik een configuratiebestand buiten de webmap of een omgevingsvariabele.