PHP mailer spam???

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jop B

Jop B

22/04/2022 13:54:27
Quote Anchor link
Beste PHPhulp leden,


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)
PHP script in nieuw venster Selecteer het PHP script
1
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.';
        }
    }

?>


Vervolgens word er gekeken of er errors zijn in de array, als dit 0 is dan mag de mailer worden geactiveerd.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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!');
    }
}

?>



Het ingevulde emailadres word als reply gebruikt
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$mail
->addReplyTo($emailaddress, $naam);
?>


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?
 
PHP hulp

PHP hulp

29/11/2022 11:57:10
 
- Ariën  -
Beheerder

- Ariën -

22/04/2022 15:03:16
Quote Anchor link
Hoe worden $emailaddress, $naam gevuld?

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 -
 
Jan R

Jan R

23/04/2022 11:38:42
Quote Anchor link
Bij de meeste providers MOET het send- en replayadres een adres zijn van bij je eigen domain.
voorbeel van one.com https://help.one.com/hc/nl/articles/115005594345-Kan-ik-e-mails-verzenden-vanaf-mijn-website-
methode 2 blauwe opmerking
 
Ozzie PHP

Ozzie PHP

23/04/2022 17:22:36
Quote Anchor link
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.
 
Jop B

Jop B

23/04/2022 21:04:00
Quote Anchor link
@Ariën de variabelen worden gevuld door
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
mailer($_POST['name'], $_POST['emailaddress'], $_POST['phone'], $_POST['subject'], $_POST['message']);
?>



De informatie word verwerkt zoals hieronder
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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;
    }

?>



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
 
Ozzie PHP

Ozzie PHP

23/04/2022 21:59:15
Quote Anchor link
En waar controleer je dan of $_POST['emailaddress'] is ingevuld?
 
Jop B

Jop B

23/04/2022 23:54:26
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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!');
    }
}

?>
 
Ozzie PHP

Ozzie PHP

24/04/2022 15:11:45
Quote Anchor link
Ik zie een mogelijke fout, maar je zult moeten testen of dat ook de daadwerkelijke oorzaak is.

Normaal als iemand (de afzender) jou een mail stuurt, dan is het reply-to adres hetzelfde als dat van de afzender.

Dus als jan@jansen.nl jou een mail stuurt, dan is het reply-to adres ook jan@jansen.nl ... 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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php

    $message_variables
= array(
        'name'             => $name,
        'e-mailaddress' => $emailaddress,
        'phone'             => $phone,
        'subject'         => $subject,
        'message'         => nl2br($message)
    );


?>

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.
 
- Ariën  -
Beheerder

- Ariën -

24/04/2022 16:10:16
Quote Anchor link
Let er ook op dat telefoonnummers ook uit meer of minder dan 10 tekens kunnen bestaan.
 
Jop B

Jop B

25/04/2022 15:59:10
Quote Anchor link
Ik heb die twee dingen aangepast, $naam was inderdaad verkeerd en moest $name zijn.
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?
 
- Ariën  -
Beheerder

- Ariën -

25/04/2022 17:34:31
Quote Anchor link
Controles omzeilen kan sowieso niet. Maar als een mens kan mailen, kan een bot dat ook.
 
Ivo P

Ivo P

26/04/2022 14:21:00
Quote Anchor link
waarom mag volgens jou een mailadres na het @teken maar 1 punt bevatten?

}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 iets@ivo.pxxxxx.nl en dat komt dus niet door jouw check.
Maar ook iemand@bbc.co.uk 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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.