Hallo

Heb een formulier gemaakt in PHP in met een gedeelte HTML nu wil het formulier niet verzenden en de items die ingevuld moeten worden worden na het versturen ook niet uit de tekst vakken gewist. Ben niet erg thuis in html en php maar zou graag dit formulier werkend willen krijgen. Kan iemand mij vertellen wat er fout is en hoe het op de juiste moet zijn??
Hieronder het php scriptje en het stukje html

vr gr Gert

HTML gedeelte

<form id="main-contact-form" name="contact-form" method="post" action="contact.php">
<div class="form-group">
<input type="text" name="name" class="form-control" placeholder="Name" required>
</div>
<div class="form-group">
<input type="email" name="email" class="form-control" placeholder="Email" required>
</div>
<div class="form-group">
<input type="text" name="subject" class="form-control" placeholder="Subject" required>
</div>
<div class="form-group">
<textarea name="message" class="form-control" rows="8" placeholder="Message" required></textarea>
</div>
<button type="submit" class="btn btn-primary">Verstuur</button>
</form>


contact.php

<?php
$name       = @trim(stripslashes($_POST['name'])); 
$from       = @trim(stripslashes($_POST['email'])); 
$subject    = @trim(stripslashes($_POST['subject'])); 
$message    = @trim(stripslashes($_POST['message'])); 
$to   		= '[email protected]';//replace with your email

$headers   = array();
$headers[] = "MIME-Version: 1.0";
$headers[] = "Content-type: text/plain; charset=iso-8859-1";
$headers[] = "From: {$name} <{$from}>";
$headers[] = "Reply-To: <{$from}>";
$headers[] = "Subject: {$subject}";
$headers[] = "X-Mailer: PHP/".phpversion();

mail($to, $subject, $message, $headers);

die;
?>
Allereerst lijkt het mij zaak om echte fouten uit dit script te halen, daarna kunnen we eens gaan kijken wat er verder scheelt. Als we de definitie van de mail() functie erbij pakken... lijkt dit te kloppen, ik wist niet dat je de headers() ook als array kon doorgeven :D.

mail() verstuurt zelf geen mail. mail() stuurt een verzoek aan een proces dat de verzending verder afhandelt.

Er kunnen vervolgens een heleboel dingen misgaan:
- het overdragen lukt niet
- het overdragen lukt wel, maar de wachtrij waarin het mailtje terecht komt wordt nooit geleegd, met als resultaat dat de mail nooit echt verstuurd wordt
- de mail komt wel aan, maar wordt opgegeten door de spamfilter (om nom nom)
- mail wordt gebounced
- et cetera

Het ding is, op het moment dat je mail()t, is het in wezen uit handen van PHP.

Het enige waar je dus aan de verzendkant op kunt controleren, is of het "op de bus doen" van de brief is geslaagd:
<?php
$name = $_POST['name']; // dat trim() en stripslashes zijn nogal loos...
// ... et cetera
$headers = array();
// ... et cetera
// hier controleren we of het "verzenden" slaagt:
if (mail($to, $subject, $message, $headers)) {
    echo 'success!';
} else {
    echo 'er ging iets mis :(';
}
?>

Voor de goede orde: er moet dus wel ondersteuning zijn voor het daadwerkelijk versturen van mail. Waar vandaan draait dit PHP-script? Op een lokale machine? Op een gratis webaccount? Ergens anders?

EDIT sommige providers zijn nogal kritisch over afzendadressen geloof ik, je kunt hier dus niet altijd een willekeurige "from" invullen.
We hebben ook code-tags om je script tussen te plaatsen.

De eerste stap is om je apenstaartjes uit je script te halen, je wilt immers geen foutmeldingen onderdrukken.

Verder raad ik aan om de juiste mailheaders te gebruiken:
http://wiki.phpbeginners.nl/index.php?title=De_juiste_mailheaders

Ook raad ik aan om een if-else statement om in je mailfunctie te bouwen zodat je kan zien of de functie werkt. Het geeft geen garantie dat de mail aan komt.
OKe dank jullie voor de snelle reactie dit formulier draait bij Strato.nl ook heb ik al gekeken of PHP aan staat bij hun heb het als proef ook nog op een andere server geprobeerd maar daar verstuurde hij het ook niet. Ik snap nog niet alles wat jullie bedoelen maar ga eens kijken of ik er uit kan komen. Zoals ik al aangaf zit begin ik net met PHP en HTML. als ik er niet uitkom dan meld ik mij wel weer.
vr gr Gert
Thomas van den Heuvel op 10/08/2018 14:18:49

Als we de definitie van de mail() functie erbij pakken... lijkt dit te kloppen, ik wist niet dat je de headers() ook als array kon doorgeven :D.

Ik wist dit ook niet, maar zo te zien is het ook pas vanaf PHP 7.2.0 mogelijk.

De array is ook niet juist opgebouwd, als ik zo lees. Want de 'header names' zijn een key, en de header values zijn de value in de array. Dus dan krijg je dit:


<?php
$headers = array();
$headers['MIME-Version'] = "1.0";
$headers['Content-type'] = "text/plain; charset=iso-8859-1";
$headers['From'] = "{$name} <{$from}>";
$headers['Reply-To'] = "<{$from}>";
$headers['Subject'] = "{$subject}";
$headers['X-Mailer'] = "PHP/".phpversion();

// hier je mail en een controle of op de status ervan..
?>


Stukken beter leesbaarder, en zelfs makkelijker uit te breiden. Het verbaast me eigenlijk dat dit niet eerder ingebouwd is ;-)
Hallo Thomas van den Heuvel
het stukje code wat je stuurt waar moet ik dit plaatsen in mijn gedeelte van mijn script

gr Gert
Als je mijn code en die van Thomas' bij elkaar voegt, krijg je zoiets als hieronder.
Ik zou wel ervoor zorgen dat het mailadres in de afzender een mailadres die in jouw beheer valt, en bij jouw domein hoort. Het mailadres van diegene die het verstuurt, en dus in het tekstveld staat, hoort altijd in de Reply-To toegewezen te worden.

Ik denk zelf dat dit het probleem zal zal zijn. Veel webhostingproviders weigeren mails in de $to (eerste parameter binnen de mailfunctie) vanaf een ander domein, of een niet bestaande alias in je domein zelfs.


<?php
$jouw_mail= "[email protected]"; // nieuwe variabele


$name = $_POST['name']; // dat trim() en stripslashes zijn nogal loos...
// ... et cetera
$headers = array();
$headers['MIME-Version'] = "1.0";
$headers['Content-type'] = "text/plain; charset=iso-8859-1";
$headers['From'] = "{$name} <{$jouw_mail}>";
$headers['Reply-To'] = "<{$from}>";
$headers['Subject'] = "{$subject}";
$headers['X-Mailer'] = "PHP/".phpversion();

// hier controleren we of het "verzenden" slaagt:
if (mail($to, $subject, $message, $headers)) {
    echo 'success!';
} else {
    echo 'er ging iets mis :(';
}
?>

Lees ook de commentaren even door. het is geen kant en klaar script, maar een basis over hoe je een simpel mail-script maakt.
Ik heb onderstaande code aangepast zonder trim en stripslashes verzend hij niet en blijft verzenden.
er komt nu wel een mail binnen met onderstaande code maar er staat niets in ook geen ondewerp etc.

<?php
$name = trim(stripslashes($_POST['name']));
$from = trim(stripslashes($_POST['email']));
$subject = trim(stripslashes($_POST['subject']));
$message = trim(stripslashes($_POST['message']));
$to = '[email protected];//replace with your email

$headers = array();
$headers['MIME-Version'] = "1.0";
$headers['Content-type'] = "text/plain; charset=iso-8859-1";
$headers['From'] = "{$name} <{$from}>";
$headers['Reply-To'] = "<{$from}>";
$headers['Subject'] = "{$subject}";
$headers['X-Mailer'] = "PHP/".phpversion();
// ... et cetera
// hier controleren we of het "verzenden" slaagt:
if (mail($to, $subject, $message, $headers)) {
echo 'success!';
} else {
echo 'er ging iets mis :(';
}
?>
Lees ook even mijn opmerking over de From-header. Misschien dat het nu nog werkt, maar dat je script uit veiligheidsoverwegingen later juist niet meer zal werken.

Haal die trim() en stripslashes() er gewoon uit. Waarom zou je invoer daarop willen filteren?
Wat staat er nu in je mail? Ik vind je vorige bericht een beetje onduidelijk.
Hallo ik krijg nu een mail binnen met onderwerp: [email protected]

sorry maar de opmerking over de From header is mij ontgaan.
de PHP code ziet er nu zo uit, hoop dat jullie nog iets kunnen ontdekken wat niet klopt.
gr gert

<?php

$name = $_POST['name'];
$from = $_POST['email'];
$subject = $_POST['subject'];
$message = $_POST['message'];
$jouw_mail= "[email protected]"; // nieuwe variabele


$headers = array();
$headers['MIME-Version'] = "1.0";
$headers['Content-type'] = "text/plain; charset=iso-8859-1";
$headers['From'] = "{$name} <{$jouw_mail}>";
$headers['Reply-To'] = "<{$from}>";
$headers['Subject'] = "{$subject}";
$headers['X-Mailer'] = "PHP/".phpversion();

// hier controleren we of het "verzenden" slaagt:
if (mail($to, $subject, $message, $headers)) {
echo 'success!';
} else {
echo 'er ging iets mis :(';
}
?>
$to bestaat niet, en dus valt PHP terug op een standaard instelling van de Strato-server. Je bedoelt dat je dat postmaster e-mailadres ziet als afzender.

Reageren