Email functie met ajax
Ik heb nu een werkend formulier met validation die opslaat in de database (met dank aan dit forum).
Nu wil ik een mail functie toevoegen, die gewoon de bestaande insert verstuurd in een mail. Dus geen nieuwe dingen, gewoon de naam, achternaam, mail en telefoonnummer versturen (naar de mail die is ingevoerd.
Hier m'n bestaande ajax 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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
$(function(){
// initialisatie formulier validatie. (zie http://rickharrison.github.io/validate.js)
var validator = new FormValidator('form', [{
name: 'voornaam',
display: 'Voornaam',
rules: 'required'
}, {
name: 'achternaam',
display: 'achternaam',
rules: 'required'
},{
name: 'telefoonnummer',
display: 'telefoon',
rules: 'required|numeric'
},{
name: 'email',
display: 'email',
rules: 'required|valid_email'
}], function(errors, event) {
var berichten = document.getElementById('fout');
berichten.innerHTML = '';
// als er fouten zijn:
if (errors.length > 0) {
for (var i = 0, l = errors.length; i < l; i++) {
berichten.innerHTML += errors[i].message + '<br>';
}
// als de validatie goed gegaan is:
} else {
var voornaam = $('#voornaam').val();
var achternaam = $('#achternaam').val();
var telefoonnummer = $('#telefoonnummer').val();
var email = $('#email').val();
$.post('action.php',{action: "button", voornaam:voornaam, achternaam:achternaam, telefoonnummer:telefoonnummer, email:email},function(res){
$('#result').html(res);
});
document.getElementById('goed').innerHTML = 'Verstuurd!';
}
// voorkom ten allertijde dat het formulier daadwerkelijk ge-submit wordt!
event.preventDefault();
});
});
// initialisatie formulier validatie. (zie http://rickharrison.github.io/validate.js)
var validator = new FormValidator('form', [{
name: 'voornaam',
display: 'Voornaam',
rules: 'required'
}, {
name: 'achternaam',
display: 'achternaam',
rules: 'required'
},{
name: 'telefoonnummer',
display: 'telefoon',
rules: 'required|numeric'
},{
name: 'email',
display: 'email',
rules: 'required|valid_email'
}], function(errors, event) {
var berichten = document.getElementById('fout');
berichten.innerHTML = '';
// als er fouten zijn:
if (errors.length > 0) {
for (var i = 0, l = errors.length; i < l; i++) {
berichten.innerHTML += errors[i].message + '<br>';
}
// als de validatie goed gegaan is:
} else {
var voornaam = $('#voornaam').val();
var achternaam = $('#achternaam').val();
var telefoonnummer = $('#telefoonnummer').val();
var email = $('#email').val();
$.post('action.php',{action: "button", voornaam:voornaam, achternaam:achternaam, telefoonnummer:telefoonnummer, email:email},function(res){
$('#result').html(res);
});
document.getElementById('goed').innerHTML = 'Verstuurd!';
}
// voorkom ten allertijde dat het formulier daadwerkelijk ge-submit wordt!
event.preventDefault();
});
});
Om dit stuk gaat het:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
var voornaam = $('#voornaam').val();
var achternaam = $('#achternaam').val();
var telefoonnummer = $('#telefoonnummer').val();
var email = $('#email').val();
$.post('action.php',{action: "button", voornaam:voornaam, achternaam:achternaam, telefoonnummer:telefoonnummer, email:email},function(res){
$('#result').html(res);
});
document.getElementById('goed').innerHTML = 'Verstuurd!';
var achternaam = $('#achternaam').val();
var telefoonnummer = $('#telefoonnummer').val();
var email = $('#email').val();
$.post('action.php',{action: "button", voornaam:voornaam, achternaam:achternaam, telefoonnummer:telefoonnummer, email:email},function(res){
$('#result').html(res);
});
document.getElementById('goed').innerHTML = 'Verstuurd!';
Hier insert ie, daar wil ik dus graag dat die een mail verstuurd.
Dit is wat ik nu op action.php heb staan:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
//connectie
include ('connection.php');
//als de knop is ingedrukt insert dan
if($_POST['action'] == 'button'){
$voornaam = mysql_real_escape_string($_POST['voornaam']);
$achternaam = mysql_real_escape_string($_POST['achternaam']);
$email = mysql_real_escape_string($_POST['email']);
$telefoonnummer = mysql_real_escape_string($_POST['telefoonnummer']);
$sql = "insert into
`form` (`id`,`voornaam`, `achternaam`, `email`, `telefoonnummer`)
values ('','".$voornaam."', '".$achternaam."', '".$email."', '".$telefoonnummer."')";
$query = mysql_query($sql);
if($query){
echo "Toegevoegd!";
}else {
echo "Er is iets fout gegaan.";
}
$voornaam = $_POST['voornaam'];
$achternaam = $_POST['achternaam'];
$telefoonnummer = $_POST['telefoonnummer'];
$email = $_POST['email'];
$subject = 'Email!';
$headers = 'MIME-Version: 1.0' ."\r\n";
$headers .= "Content-type: text/html; charset=utf-8\r\n";
$content = '<html><header><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </header><body><img src="../images/Koala.jpg"></img>';
$content .= $voornaam;
$content .= $achternaam;
$content .= $telefoonnummer;
$content .= '</body></html>';
mail($email, $subject, $content, $headers); //This method sends the mail.
echo "Email verzonden"; // success message
}
?>
//connectie
include ('connection.php');
//als de knop is ingedrukt insert dan
if($_POST['action'] == 'button'){
$voornaam = mysql_real_escape_string($_POST['voornaam']);
$achternaam = mysql_real_escape_string($_POST['achternaam']);
$email = mysql_real_escape_string($_POST['email']);
$telefoonnummer = mysql_real_escape_string($_POST['telefoonnummer']);
$sql = "insert into
`form` (`id`,`voornaam`, `achternaam`, `email`, `telefoonnummer`)
values ('','".$voornaam."', '".$achternaam."', '".$email."', '".$telefoonnummer."')";
$query = mysql_query($sql);
if($query){
echo "Toegevoegd!";
}else {
echo "Er is iets fout gegaan.";
}
$voornaam = $_POST['voornaam'];
$achternaam = $_POST['achternaam'];
$telefoonnummer = $_POST['telefoonnummer'];
$email = $_POST['email'];
$subject = 'Email!';
$headers = 'MIME-Version: 1.0' ."\r\n";
$headers .= "Content-type: text/html; charset=utf-8\r\n";
$content = '<html><header><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </header><body><img src="../images/Koala.jpg"></img>';
$content .= $voornaam;
$content .= $achternaam;
$content .= $telefoonnummer;
$content .= '</body></html>';
mail($email, $subject, $content, $headers); //This method sends the mail.
echo "Email verzonden"; // success message
}
?>
Kan iemand me op weg helpen?
Mailadres verwijderd om spamharvesters te voorkomen.[/modedit]
Gewijzigd op 14/01/2014 12:17:18 door Snelle Jaap
Standaard heeft een lokale server geen mail functie/server. Stel dus een mailserver in of maak gebruik van STMP -> bv PphMailer heeft daar een class voor.
Metal Hertog Jan op 14/01/2014 11:22:37:
Wat lukt er niet? Wat gaat er mis?
Standaard heeft een lokale server geen mail functie/server. Stel dus een mailserver in of maak gebruik van STMP -> bv PphMailer heeft daar een class voor.
Standaard heeft een lokale server geen mail functie/server. Stel dus een mailserver in of maak gebruik van STMP -> bv PphMailer heeft daar een class voor.
Ik gebruik wamp, maar heb de stmp al ingesteld dus dat zou goed moeten zijn. Ik heb de code nu zoals ik hem heb geplaatst, maar hij verstuurd nog geen mail (het is een outlook adres, geen idee of dat nog dingen met zich meebrengt, want ik las problemen over hotmail)
Toevoeging op 14/01/2014 12:17:54:
Even de phpcode aangepast, nog steeds wil die niks versturen. Volgens mij klopt alles nu.
Gewijzigd op 14/01/2014 11:25:29 door Snelle Jaap
Wat zegt de error log?
Metal Hertog Jan op 14/01/2014 12:26:27:
Wat zegt de error log?
Hoe kijk je die in?
Heb even zitten zoeken maar kan het niet vinden.
In de php.ini de volgende regel gezet:
error_log = C:/wamp/www/Opdracht/php_error.log
Maar dat maakt geen error log bestand aan.
Nevermind heb het toch werkend gekregen.
De error logs na het runnen van index.php :
[14-Jan-2014 11:39:11 UTC] PHP Warning: mail(): SMTP server response: 550 The address is not valid. in C:\wamp\www\Opdracht\action.php on line 43
[14-Jan-2014 11:39:11 UTC] PHP Stack trace:
[14-Jan-2014 11:39:11 UTC] PHP 1. {main}() C:\wamp\www\Opdracht\action.php:0
[14-Jan-2014 11:39:11 UTC] PHP 2. mail() C:\wamp\www\Opdracht\action.php:43
[14-Jan-2014 11:39:11 UTC] PHP Warning: error_log() expects at least 1 parameter, 0 given in C:\wamp\www\Opdracht\action.php on line 45
[14-Jan-2014 11:39:11 UTC] PHP Stack trace:
[14-Jan-2014 11:39:11 UTC] PHP 1. {main}() C:\wamp\www\Opdracht\action.php:0
[14-Jan-2014 11:39:11 UTC] PHP 2. error_log() C:\wamp\www\Opdracht\action.php:45
Toevoeging op 14/01/2014 12:55:53:
Laat maar ik heb het al werkend gekregen! Zat nog een fout in m'n php.ini. Bedankt voor het vertellen over de log_errors, handig.
Gewijzigd op 14/01/2014 12:39:58 door Snelle Jaap
Je neemt dat nu klakkeloos aan, maar als het "ik heb geen mail" is, dan gaat die mail nergens heen.
Is het "[email protected], [email protected]" dan gaat die mail 2 kanten op,
en als iemand een enter toevoegt + nog wat leuke headers dan staat je server open om spam mee te versturen.
a) controleer http://www.pfz.nl/wiki/invoer-validatie/#regular-expressions-is-het-een-geldig-email-adres
b) gebruik een class als PHPMailer die van zichzelf ook al een paar van dat soort controles uitvoert.
Dat wordt al gedaan. Door middel van jquery valideer ik de velden, ik weet dat het veiliger is om dat via de server te doen, maar dit is even voor een opdracht waarbij de pagina niet kan refreshen. Je kan geen meerdere mails invoeren zoals je aangeeft in je post.
Nu is het zo, dat mensen die misbruik willen maken van jouw server zich meestal niet storen aan jouw "ja maar dat mag niet!".
Je hebt met Firebug in 2 tellen gezien wat de werkelijke ajax call naar jouw script is.
Dus laten we zeggen je post die velden naar emailajax.php.
Dan maakt de hacker in simpele opzet een form:
<form method=post action=jouwsite/emailajax.php>
<input name=email value="heel veel bagger">
<input name=voornaam>
</form>
Dat wordt gesubmit en weg is je controle.
Dan kun je allerlei dingen proberen om weer te controleren dat het echt een ajaxcall is met een ref. naar de goede pagina, maar
if(filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL) && preg_match('#\.[a-z]{2,6}$#i', $_POST['email']))
is natuurlijk geen moeite om in te voeren.
Snelle Jaap op 14/01/2014 13:25:47:
Dat wordt al gedaan. Door middel van jquery valideer ik de velden, ik weet dat het veiliger is om dat via de server te doen, maar dit is even voor een opdracht waarbij de pagina niet kan refreshen. Je kan geen meerdere mails invoeren zoals je aangeeft in je post.
Javascript is eenvoudig te omzeilen (uit te schakelen) dus kwa veiligheid moet je daar zeker niet op vertrouwen.
Jouw script is nou kwetsbaar voor kwaadwillende code.
Variabelen alleen maar van naam veranderen voor je ze gebruikt is ook verloren tijd en ruimte
Code (php)
1
2
3
4
2
3
4
$voornaam = $_POST['voornaam'];
$achternaam = $_POST['achternaam'];
$telefoonnummer = $_POST['telefoonnummer'];
$email = $_POST['email'];
$achternaam = $_POST['achternaam'];
$telefoonnummer = $_POST['telefoonnummer'];
$email = $_POST['email'];
zelfde doe je voor mysql_real_escape_string. je kunt mysql_real_escape_string($_POST['voornaam']); gewoon in je query gebruiken ipv eerst te hernoemen.
Daarbij wordt mysql functies uitgefaseerd en wordt afgeraden voor nieuwe code. Kijk eens naar mysqli of PDO.
Ik weet dat mysqli en PDO veel beter is, maar weet er nog te weinig van. Moet ik wat over lezen.