PHP mailer spam???
Wie o wie kan mij op weg helpen met het volgende probleem.
Ik maak gebruik van de PHP mailer class.
Deze word pas geactiveerd als er geen fouten zijn zoals lege velden, een emailadres niet geldig is etc.
Daarnaast zal een juist woord moeten worden ingevuld bij anti-spam
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
//voor alle velden is er een check zoals hieronder
if(isset($_POST['captcha'])){
$days_NL = array('zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag');
if(trim($_POST['captcha']) == ''){
$errors[] = 'Vul een woord in bij anti-spam.';
}elseif(strtolower($_POST['captcha']) !== $days_NL[date('w')]){
$errors[] = 'Vul een ander woord in bij anti-spam.';
}
}
?>
//voor alle velden is er een check zoals hieronder
if(isset($_POST['captcha'])){
$days_NL = array('zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag');
if(trim($_POST['captcha']) == ''){
$errors[] = 'Vul een woord in bij anti-spam.';
}elseif(strtolower($_POST['captcha']) !== $days_NL[date('w')]){
$errors[] = 'Vul een ander woord in bij anti-spam.';
}
}
?>
Vervolgens word er gekeken of er errors zijn in de array, als dit 0 is dan mag de mailer worden geactiveerd.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
if(count($errors) > 0){
$response['status'] = 'errors';
$response['errors'] = $errors;
}else{
if(mailer($_POST['name'], $_POST['emailaddress'], $_POST['phone'], $_POST['subject'], $_POST['message'])){
$response['status'] = 'success';
}else{
$response['status'] = 'errors';
$response['errors'] = array('Er is een fout opgetreden!');
}
}
?>
if(count($errors) > 0){
$response['status'] = 'errors';
$response['errors'] = $errors;
}else{
if(mailer($_POST['name'], $_POST['emailaddress'], $_POST['phone'], $_POST['subject'], $_POST['message'])){
$response['status'] = 'success';
}else{
$response['status'] = 'errors';
$response['errors'] = array('Er is een fout opgetreden!');
}
}
?>
Het ingevulde emailadres word als reply gebruikt
Soms komt het voor (1x in 2 maanden) dat ik een mail krijg van de mailer met geen enkele informatie.
Het emailadres voor de reply is dan mijn eigen emailadres omdat deze dan ook leeg is.
Is dit nu een geval van spam of een systeem dat mijn mailer kan afvuren?
Dit zou betekenen dat alle errors genegeerd worden dan?
Als je echt een betrouwbare spamfilter wilt, gebruik dan ReCaptcha V3. Die werkt onzichtbaar en doet niet aan die puzzelongein waarbij je stoplichten en zebrapaden moet aanklikken.
Gewijzigd op 22/04/2022 16:07:50 door - Ariën -
voorbeel van one.com https://help.one.com/hc/nl/articles/115005594345-Kan-ik-e-mails-verzenden-vanaf-mijn-website-
methode 2 blauwe opmerking
Je zult wat meer relevante code moeten geven. Laat het stukje PHP-code eens zien waarin je de informatie uit het formulier verwerkt en de e-mail verstuurt.
Code (php)
1
2
3
2
3
<?php
mailer($_POST['name'], $_POST['emailaddress'], $_POST['phone'], $_POST['subject'], $_POST['message']);
?>
mailer($_POST['name'], $_POST['emailaddress'], $_POST['phone'], $_POST['subject'], $_POST['message']);
?>
De informatie word verwerkt zoals hieronder
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
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
<?php
function mailer($name, $emailaddress, $phone, $subject, $message){
$body = file_get_contents('template_mail.html');
$message_variables = array(
'name' => $name,
'e-mailaddress' => $emailaddress,
'phone' => $phone,
'subject' => $subject,
'message' => nl2br($message)
);
foreach($message_variables as $variable => $value){
$body = str_replace('%'.$variable.'%', $value, $body);
}
$mail = new PHPMailer();
$mail->Host = 'server.domein.nl';
$mail->SMTPAuth = true;
$mail->Username = 'GEBRUIKERSNAAM';
$mail->Password = 'WACHTWOORD';
$mail->SMTPSecure = 'tls';
$mail->Port = 587;
$mail->isHTML(true);
$mail->addReplyTo($emailaddress, $naam);
$mail->setFrom('info@domein', 'Contactformulier');
$mail->addAddress('info@domein', 'NAAM');
$mail->Subject = $subject;
$mail->Body = $body;
if($mail->send()){
return true;
}else{
return false;
}
?>
function mailer($name, $emailaddress, $phone, $subject, $message){
$body = file_get_contents('template_mail.html');
$message_variables = array(
'name' => $name,
'e-mailaddress' => $emailaddress,
'phone' => $phone,
'subject' => $subject,
'message' => nl2br($message)
);
foreach($message_variables as $variable => $value){
$body = str_replace('%'.$variable.'%', $value, $body);
}
$mail = new PHPMailer();
$mail->Host = 'server.domein.nl';
$mail->SMTPAuth = true;
$mail->Username = 'GEBRUIKERSNAAM';
$mail->Password = 'WACHTWOORD';
$mail->SMTPSecure = 'tls';
$mail->Port = 587;
$mail->isHTML(true);
$mail->addReplyTo($emailaddress, $naam);
$mail->setFrom('info@domein', 'Contactformulier');
$mail->addAddress('info@domein', 'NAAM');
$mail->Subject = $subject;
$mail->Body = $body;
if($mail->send()){
return true;
}else{
return false;
}
?>
Het gekke is als ik zelf het contactformulier test met mijn prive email (van hotmail tot gmail en een aantal andere) dat het gewoon netjes binnen komt.
Het is dus niet zo dat het niet werkt maar ik het gek vind dat er soms dus een geheel lege email binnenkomt
Gewijzigd op 23/04/2022 21:04:31 door Jop B
En waar controleer je dan of $_POST['emailaddress'] is ingevuld?
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST'){
if(isset($_POST['name'])){
if(trim($_POST['name'] == '')){
$errors[] = 'Je bent vergeten je naam in te vullen.';
}
}
if(isset($_POST['emailaddress'])){
if(trim($_POST['emailaddress']) == ''){
$errors[] = 'Je bent vergeten je e-mailadres in te vullen.';
}elseif(!preg_match('/(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z]+$)/', $_POST['emailaddress'])){
$errors[] = 'Het ingevulde e-mailadres is niet geldig.';
}
}
if(isset($_POST['phone'])){
if(trim($_POST['phone']) == ''){
$errors[] = 'Je bent vergeten telefoonnummer in te vullen.';
}elseif(!preg_match('/^\d+$/', $_POST['phone'])){
$errors[] = 'Het telefoonnummer mag alleen uit cijfers bestaan.';
}elseif(strlen($_POST['phone']) !== 10){
$errors[] = 'Een telefonnummer bestaat uit 10 cijfers!';
}
}
if(isset($_POST['subject'])){
if(trim($_POST['subject']) == ''){
$errors[] = 'Je bent vergeten een onderwerp in te vullen.';
}
}
if(isset($_POST['message'])){
if(trim($_POST['message']) == ''){
$errors[] = 'Je bent vergeten een bericht te typen.';
}
}
if(isset($_POST['captcha'])){
$days_NL = array('zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag');
if(trim($_POST['captcha']) == ''){
$errors[] = 'Vul een woord in bij anti-spam.';
}elseif(strtolower($_POST['captcha']) !== $days_NL[date('w')]){
$errors[] = 'Vul een ander woord in bij anti-spam.';
}
}
}else{
$errors[] = 'Het bericht is niet verzonden! Probeer het opnieuw.';
}
if(count($errors) > 0){
$response['status'] = 'errors';
$response['errors'] = $errors;
}else{
if(mailer($_POST['name'], $_POST['emailaddress'], $_POST['phone'], $_POST['subject'], $_POST['message'])){
$response['status'] = 'success';
}else{
$response['status'] = 'errors';
$response['errors'] = array('Er is een fout opgetreden!');
}
}
?>
if($_SERVER['REQUEST_METHOD'] == 'POST'){
if(isset($_POST['name'])){
if(trim($_POST['name'] == '')){
$errors[] = 'Je bent vergeten je naam in te vullen.';
}
}
if(isset($_POST['emailaddress'])){
if(trim($_POST['emailaddress']) == ''){
$errors[] = 'Je bent vergeten je e-mailadres in te vullen.';
}elseif(!preg_match('/(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z]+$)/', $_POST['emailaddress'])){
$errors[] = 'Het ingevulde e-mailadres is niet geldig.';
}
}
if(isset($_POST['phone'])){
if(trim($_POST['phone']) == ''){
$errors[] = 'Je bent vergeten telefoonnummer in te vullen.';
}elseif(!preg_match('/^\d+$/', $_POST['phone'])){
$errors[] = 'Het telefoonnummer mag alleen uit cijfers bestaan.';
}elseif(strlen($_POST['phone']) !== 10){
$errors[] = 'Een telefonnummer bestaat uit 10 cijfers!';
}
}
if(isset($_POST['subject'])){
if(trim($_POST['subject']) == ''){
$errors[] = 'Je bent vergeten een onderwerp in te vullen.';
}
}
if(isset($_POST['message'])){
if(trim($_POST['message']) == ''){
$errors[] = 'Je bent vergeten een bericht te typen.';
}
}
if(isset($_POST['captcha'])){
$days_NL = array('zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag');
if(trim($_POST['captcha']) == ''){
$errors[] = 'Vul een woord in bij anti-spam.';
}elseif(strtolower($_POST['captcha']) !== $days_NL[date('w')]){
$errors[] = 'Vul een ander woord in bij anti-spam.';
}
}
}else{
$errors[] = 'Het bericht is niet verzonden! Probeer het opnieuw.';
}
if(count($errors) > 0){
$response['status'] = 'errors';
$response['errors'] = $errors;
}else{
if(mailer($_POST['name'], $_POST['emailaddress'], $_POST['phone'], $_POST['subject'], $_POST['message'])){
$response['status'] = 'success';
}else{
$response['status'] = 'errors';
$response['errors'] = array('Er is een fout opgetreden!');
}
}
?>
Normaal als iemand (de afzender) jou een mail stuurt, dan is het reply-to adres hetzelfde als dat van de afzender.
Dus als [email protected] jou een mail stuurt, dan is het reply-to adres ook [email protected] ... tenzij dat anders wordt ingesteld.
In jouw code stel je expliciet een reply-to adres in. Echter, mogelijk zit daar een fout in (daar kom ik zo op terug). Die regel werkt mogelijk niet en daarom is het reply-to adres hetzelfde als het adres van de afzender. Eigenlijk gaat het dus toevallig goed.
Wat gaat er mogelijk niet goed?
$mail->addReplyTo($emailaddress, $naam);
Je gebruikt hier plotseling een variabele $naam terwijl je nergens anders een variabele $naam gebruikt. Die variabele is zover ik kan zien dus altijd leeg. Daarom kan het zo zijn dat die regel nooit werkt.
Ik zou dit:
$mail->addReplyTo($emailaddress, $naam);
Dus wijzigen naar dit:
$mail->addReplyTo($emailaddress, $name);
Verder viel me dit op:
Code (php)
In plaats van emailadresss aan elkaar, staat er ineens een streepje tussen. Ik ga er vanuit dat er in 'template_mail.html' dan ook een streepje tussen staat, maar probeer altijd consequent te zijn om misverstanden te voorkomen.
In ieder geval die $naam dus even wijzigen naar $name. Wellicht lost dat het op, maar ik kan het niet met 100% zekerheid zeggen.
Let er ook op dat telefoonnummers ook uit meer of minder dan 10 tekens kunnen bestaan.
Maar toch heb ik altijd als ik een test deed met het formulier de mails gewoon gekregen met de info.
Alleen komt er heel sporadisch een binnen wat geheel leeg is.
Dus vroeg mij af of het mogelijk was dat alle controles werden omzeild, of dat een mailer functie op een andere manier kon worden geactiveerd?
Controles omzeilen kan sowieso niet. Maar als een mens kan mailen, kan een bot dat ook.
}elseif(!preg_match('/(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z]+$)/', $_POST['emailaddress'])){
$errors[] = 'Het ingevulde e-mailadres is niet geldig.';
Ik heb zelf een mailadres [email protected] en dat komt dus niet door jouw check.
Maar ook [email protected] heeft volgens jou een ongeldig adres?
waarom gebruik je niet de filter_input functies? Daar wordt met FILTER_VALIDATE_EMAIL een hoop extra getest, wat je nu allemaal mist.