contact formulier verzend niet
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
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<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>
<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
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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;
?>
$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;
?>
Gewijzigd op 10/08/2018 16:01:11 door - Ariën -
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:
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.
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() 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:
Code (php)
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.
Gewijzigd op 10/08/2018 14:23:22 door Thomas van den Heuvel
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.
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?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..
?>
$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 ;-)
Gewijzigd op 10/08/2018 14:38:38 door - Ariën -
het stukje code wat je stuurt waar moet ik dit plaatsen in mijn gedeelte van mijn script
gr Gert
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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 :(';
}
?>
$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.
Gewijzigd op 10/08/2018 14:50:25 door - Ariën -
er komt nu wel een mail binnen met onderstaande code maar er staat niets in ook geen ondewerp etc.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?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 :(';
}
?>
$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 :(';
}
?>
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.
[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
Hallo ik krijg nu een mail binnen met onderwerp: 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
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?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 :(';
}
?>
$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 :(';
}
?>
Gewijzigd op 10/08/2018 15:41:23 door - Ariën -
Het is aan te raden om een editor (tekstverwerkingsprogramma) te gebruiken met "code highlighting" (tekst met kleurtjes) voor de specifieke taal (HTML, PHP et cetera). Bijvoorbeeld Sublime Text.
Zoals @Ariën al aangaf is een array voor de mailheaders pas beschikbaar vanaf PHP versie 7.2.0, dus tenzij je deze versie hebt is het wellicht beter om hier een string van te maken (een ander type voor je variabele), en wel als volgt - voortbordurend op @Ariën zijn aanpassingen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
$jouw_mail = "[email protected]"; // nieuwe variabele
$name = $_POST['name']; // dat trim() en stripslashes zijn nogal loos...
$from = $_POST['email'];
$subject = $_POST['subject'];
$message = $_POST['message'];
$to = '[email protected]';
define('MAIL_LINEBREAK', "\r\n");
$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}"; // moesten hier wel punthaken staan?
$headers['Subject'] = "{$subject}";
$headers['X-Mailer'] = "PHP/".phpversion();
// hier controleren we of het "verzenden" slaagt:
if (mail($to, $subject, $message, implode(MAIL_LINEBREAK, $headers))) {
echo 'succes!';
} else {
echo 'er ging iets mis :(';
}
?>
$jouw_mail = "[email protected]"; // nieuwe variabele
$name = $_POST['name']; // dat trim() en stripslashes zijn nogal loos...
$from = $_POST['email'];
$subject = $_POST['subject'];
$message = $_POST['message'];
$to = '[email protected]';
define('MAIL_LINEBREAK', "\r\n");
$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}"; // moesten hier wel punthaken staan?
$headers['Subject'] = "{$subject}";
$headers['X-Mailer'] = "PHP/".phpversion();
// hier controleren we of het "verzenden" slaagt:
if (mail($to, $subject, $message, implode(MAIL_LINEBREAK, $headers))) {
echo 'succes!';
} else {
echo 'er ging iets mis :(';
}
?>
Anders moet je de headers uit de array slopen.
Edit: Ah, Thomas' implode het al zie ik, tot een string.
het vast natuurlijk te bekijken of dat nodig is. Als je een mail krijgt, kan je in je mail-programma wel zien welke headers eraan vasthangen. En eigenlijk ook zelfs welke PHP-versie je hebt.
Gewijzigd op 10/08/2018 15:56:11 door - Ariën -
PHP version had je in principe al in de vorm van phpversion() ;).
Als je dat niet weet dan is een phpinfo() bestand ook prima ;-)
En idd de melding van de postmaster stond inderdaad bij afzender in mijn email programma
dank jullie
gr Gertjan
Toevoeging op 10/08/2018 17:24:51:
Gelijk het aangepaste formulier geprobeerd maar krijg nu totaal niks meer binnen.
PHP versie die bij strato draait is 7.2
gr gert
Wat heb je nu aan code?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
$jouw_mail="[email protected]";// nieuwe variabele
$name=$_POST['name'];// dat trim() en stripslashes zijn nogal loos...
$from=$_POST['email'];
$subject=$_POST['subject'];
$message=$_POST['message'];
$to='[email protected]';
define('MAIL_LINEBREAK',"\r\n");
$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}";// moesten hier wel punthaken staan?
$headers['Subject'] ="{$subject}";
$headers['X-Mailer'] ="PHP/".phpversion();
// hier controleren we of het "verzenden" slaagt:
if(mail($to,$subject,$message,implode(MAIL_LINEBREAK,$headers))) {
echo'succes!';
}else{
echo'er ging iets mis :(';
}
?>
$jouw_mail="[email protected]";// nieuwe variabele
$name=$_POST['name'];// dat trim() en stripslashes zijn nogal loos...
$from=$_POST['email'];
$subject=$_POST['subject'];
$message=$_POST['message'];
$to='[email protected]';
define('MAIL_LINEBREAK',"\r\n");
$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}";// moesten hier wel punthaken staan?
$headers['Subject'] ="{$subject}";
$headers['X-Mailer'] ="PHP/".phpversion();
// hier controleren we of het "verzenden" slaagt:
if(mail($to,$subject,$message,implode(MAIL_LINEBREAK,$headers))) {
echo'succes!';
}else{
echo'er ging iets mis :(';
}
?>
"Ik krijg niets meer binnen" vertelt ons dan ook niet zoveel. Zie je bijvoorbeeld wel "succes!" op je scherm staan ofzo?
Misschien staat er ergens wel een punt of een komma scheef, wie zal het zeggen.
Als je gewoon in een los scriptje een plat mailtje stuurt, werkt dat dan wel?
Weet je zeker dat er niets in je spamfilter blijft hangen ofzo?
EDIT: bij goedkope/gratis hosts zit er mogelijk ook een limiet op de hoeveelheid te verzenden mail, of een vertraging in het versturen, dus mogelijk rolt er na verloop van tijd nog van alles binnen of heb je ondertussen je tax voor de dag/week/maand al bereikt. Wat voor hostingpakket heb je? Kun je contact opnemen met je
Heb je misschien ergens een controlepaneel waar je (geretourneerde) mail in kunt zien?
Het is op dit moment nogal koffiedik kijken waarom "dit niet werkt", dus we zullen echt stap voor stap op een semi-slimme/intelligente manier naar een oplossing moeten werken maar het startpunt is toch wel een beetje een methodische aanpak.
Gewijzigd op 10/08/2018 20:00:15 door Thomas van den Heuvel
Op je vraag of ik geen succes melding krijg, nee helemaal niks. Heb inmiddels dit script ook op een andere server gezet en daar werkt het ook niet, terwijl het eigenlijk een kort scriptje is. Heb op internet wel grotere scripts voorbij zien komen.
Als ik de mail verzend komt er op dit moment niks binnen, bij het script een stukje terug, kwam de mail wel binnen maar er stond niks in ook geen afzender. Ook met wat aanpassingen kreeg de postmastermelding. Maar nu met het laatste aagepast script gebeurt er helemaal niks als ik op verzenden klik. Ook in de spam box zit niks. Bij strato heb ik een box van 10 gig die zit nog lang niet vol. Als ik een gewoon plat mailtje stuur werkt alles gewoon dus bedoel het verzenden en ontvangen.Ik ga morgen eens kijken met een ander script of dit wel werkt bij strato, en anders moet ik ze maar eens bellen. Mocht je nog een brilliant idee hebben hoor ik het graag.
Vr gr gertjan
Gewijzigd op 10/08/2018 20:20:38 door gertjan spit
Zet bovenaan dit neer:
Dan zal je foutmeldingen moeten zien.
Quote:
Heb op internet wel grotere scripts voorbij zien komen.
Dat zal wel met validatie en spam-beveiligingen zijn, wat eigenlijk sowieso wel handig is.