Specifiek mail blokkeren
Had een script gevonden voor die mail checkt maar ik kan nu wel domain blocken maar niet wat voor de @ staat.
Ik heb gezocht hoe dat kan oplossen maar kon niet zo vinden. Via het systeem waar mail wordt verzonden typen somsige mensen mail voor @ niet goed en als dan op mail checker.net kijk bestaat die wel maar eigenlijk is die mail niet in gebruik.
Een voorbeeld iemand typt woongroepmeerkoet@...nl
Maar woongroep hoor er niet voor te staan hoe kan ik dat blocken via php.
Dit is het script dat ik gevonden heb en nu gebruikt.
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
<?php
/*
* This script was writed by Setec Astronomy - [email protected]
*
* This script is distributed under the GPL License
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* http://www.gnu.org/licenses/gpl.txt
*
*/
define ('DEBUG_OK', false);
class CCheckMail
{
var $timeout = 10;
var $domain_rules = array ("live.nl", "hotmail.nl");
function _is_valid_email ($email = "")
{ return preg_match('/^[.\w-]+@([\w-]+\.)+[a-zA-Z]{2,6}$/', $email); }
function _check_domain_rules ($domain = "")
{ return in_array (strtolower ($domain), $this->domain_rules); }
function execute ($email = "")
{
if (!$this->_is_valid_email ($email))
{ return false; }
$host = substr (strstr ($email, '@'), 1);
if ($this->_check_domain_rules ($host))
{ return false; }
$host .= ".";
if (getmxrr ($host, $mxhosts[0], $mxhosts[1]) == true)
{ array_multisort ($mxhosts[1], $mxhosts[0]); }
else
{
$mxhosts[0] = $host;
$mxhosts[1] = 10;
}
if (DEBUG_OK) { print_r ($mxhosts); }
$port = 25;
$localhost = $_SERVER['HTTP_HOST'];
$sender = 'info@' . $localhost;
$result = false;
$id = 0;
while (!$result && $id < count ($mxhosts[0]))
{
if (function_exists ("fsockopen"))
{
if (DEBUG_OK) { print_r ($id . " " . $mxhosts[0][$id]); }
if ($connection = fsockopen ($mxhosts[0][$id], $port, $errno, $error, $this->timeout))
{
fputs ($connection,"HELO $localhost\r\n"); // 250
$data = fgets ($connection,1024);
$response = substr ($data,0,1);
if (DEBUG_OK) { print_r ($data); }
if ($response == '2') // 200, 250 etc.
{
fputs ($connection,"MAIL FROM:<$sender>\r\n");
$data = fgets($connection,1024);
$response = substr ($data,0,1);
if (DEBUG_OK) { print_r ($data); }
if ($response == '2') // 200, 250 etc.
{
fputs ($connection,"RCPT TO:<$email>\r\n");
$data = fgets($connection,1024);
$response = substr ($data,0,1);
if (DEBUG_OK) { print_r ($data); }
if ($response == '2') // 200, 250 etc.
{
fputs ($connection,"data\r\n");
$data = fgets($connection,1024);
$response = substr ($data,0,1);
if (DEBUG_OK) { print_r ($data); }
if ($response == '2') // 200, 250 etc.
{ $result = true; }
}
}
}
fputs ($connection,"QUIT\r\n");
fclose ($connection);
if ($result) { return true; }
}
}
else
{ break; }
$id++;
}
return false;
}
}
?>
/*
* This script was writed by Setec Astronomy - [email protected]
*
* This script is distributed under the GPL License
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* http://www.gnu.org/licenses/gpl.txt
*
*/
define ('DEBUG_OK', false);
class CCheckMail
{
var $timeout = 10;
var $domain_rules = array ("live.nl", "hotmail.nl");
function _is_valid_email ($email = "")
{ return preg_match('/^[.\w-]+@([\w-]+\.)+[a-zA-Z]{2,6}$/', $email); }
function _check_domain_rules ($domain = "")
{ return in_array (strtolower ($domain), $this->domain_rules); }
function execute ($email = "")
{
if (!$this->_is_valid_email ($email))
{ return false; }
$host = substr (strstr ($email, '@'), 1);
if ($this->_check_domain_rules ($host))
{ return false; }
$host .= ".";
if (getmxrr ($host, $mxhosts[0], $mxhosts[1]) == true)
{ array_multisort ($mxhosts[1], $mxhosts[0]); }
else
{
$mxhosts[0] = $host;
$mxhosts[1] = 10;
}
if (DEBUG_OK) { print_r ($mxhosts); }
$port = 25;
$localhost = $_SERVER['HTTP_HOST'];
$sender = 'info@' . $localhost;
$result = false;
$id = 0;
while (!$result && $id < count ($mxhosts[0]))
{
if (function_exists ("fsockopen"))
{
if (DEBUG_OK) { print_r ($id . " " . $mxhosts[0][$id]); }
if ($connection = fsockopen ($mxhosts[0][$id], $port, $errno, $error, $this->timeout))
{
fputs ($connection,"HELO $localhost\r\n"); // 250
$data = fgets ($connection,1024);
$response = substr ($data,0,1);
if (DEBUG_OK) { print_r ($data); }
if ($response == '2') // 200, 250 etc.
{
fputs ($connection,"MAIL FROM:<$sender>\r\n");
$data = fgets($connection,1024);
$response = substr ($data,0,1);
if (DEBUG_OK) { print_r ($data); }
if ($response == '2') // 200, 250 etc.
{
fputs ($connection,"RCPT TO:<$email>\r\n");
$data = fgets($connection,1024);
$response = substr ($data,0,1);
if (DEBUG_OK) { print_r ($data); }
if ($response == '2') // 200, 250 etc.
{
fputs ($connection,"data\r\n");
$data = fgets($connection,1024);
$response = substr ($data,0,1);
if (DEBUG_OK) { print_r ($data); }
if ($response == '2') // 200, 250 etc.
{ $result = true; }
}
}
}
fputs ($connection,"QUIT\r\n");
fclose ($connection);
if ($result) { return true; }
}
}
else
{ break; }
$id++;
}
return false;
}
}
?>
In je script kan je deze dan opvragen met $alias = explode("@",$email), en dan het eerste element uit $alias.
Met in_array controleer je of deze overeenkomt, en in dat geval blokkeer je de alias.
Tevens raad ik wel aan om je reguliere expressie aan te passen naar, want nu kan iemand met een .amsterdam tld zich niet aanmelden:
Gewijzigd op 18/01/2018 11:38:18 door - Ariën -
Toevoeging op 18/01/2018 13:29:49:
Ik heb naar gekeken maar ik snap nog niet echt hoe ik die $alias = explode("@",$email), moet toe passen in de code.
Code (php)
1
2
3
4
5
2
3
4
5
<?php // kleurtjes tonen
function _check_alias_rules($email= "") {
/* Hier je controle op $email waarop je explode. Waarbij je de alias ophaalt, en met in_array controleert of deze in de array staan. */
}
?>
function _check_alias_rules($email= "") {
/* Hier je controle op $email waarop je explode. Waarbij je de alias ophaalt, en met in_array controleert of deze in de array staan. */
}
?>
In die functie haal je met explode op de @ de alias op: $alias[0]
Vervolgens roep in execute() de functie aan, net als je ook al doen met de _check_domain_rules() functie.
Gewijzigd op 18/01/2018 14:22:45 door - Ariën -
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
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
<?php var $alias_rules = array ("woongroep", "ronald1999");
function _check_alias_rules($email= "")
{return in_array (strtolower ($email), $this->alias_rules);}
function _is_valid_email ($email = "")
{ return filter_var($email, FILTER_VALIDATE_EMAIL);}
function _check_domain_rules ($domain = "")
{ return in_array (strtolower ($domain), $this->domain_rules); }
function execute ($email = "")
{
if (!$this->_is_valid_email ($email))
{ return false; }
$host = substr (strstr ($email, '@'), 1);
if ($this->_check_domain_rules ($host))
{ return false; }
$host .= ".";
$alias = explode("@",$email);
if ($this->_check_alias_rules ($alias))
{ return false; }
?>
function _check_alias_rules($email= "")
{return in_array (strtolower ($email), $this->alias_rules);}
function _is_valid_email ($email = "")
{ return filter_var($email, FILTER_VALIDATE_EMAIL);}
function _check_domain_rules ($domain = "")
{ return in_array (strtolower ($domain), $this->domain_rules); }
function execute ($email = "")
{
if (!$this->_is_valid_email ($email))
{ return false; }
$host = substr (strstr ($email, '@'), 1);
if ($this->_check_domain_rules ($host))
{ return false; }
$host .= ".";
$alias = explode("@",$email);
if ($this->_check_alias_rules ($alias))
{ return false; }
?>
Toevoeging op 18/01/2018 14:44:42:
Ik snapte niet helemaal waar ik de $alias moet toepassen
let er wel op dat dit naar de hele alias kijkt, en niet een deel!
Anders moet je met strpos aan de slag.
Gewijzigd op 18/01/2018 15:00:53 door - Ariën -
Toevoeging op 18/01/2018 15:15:26:
Maar heb nu 1 dingtje ik wil het woord "woongroep" blocken maar ook als het al voor komt in mail hoe kan dat het beste doen.
Gewijzigd op 18/01/2018 15:08:19 door - Ronald -
Gewijzigd op 18/01/2018 16:03:09 door - Ariën -
- Ronald - op 18/01/2018 11:10:27:
Via het systeem waar mail wordt verzonden typen somsige mensen mail voor @ niet goed
Hoe ontstaat die situatie dan? Los daarvan, is je mail dan zo geconfigureerd dat deze alles accepteert?
Enne, je hebt nu een script dat mail uitleest ofzo? Kun je niet beter mail-instellingen beheren op de mailserver/via een controlepaneel waarbij je de toegestane/geldige adressen inperkt? Dit lijkt mij een beetje dweilen met de kraan open.
EDIT: je wilt waarschijnlijk ook niet specifieke adressen blokkeren (blacklist) maar slechts enkele toestaan (whitelist)? Een blacklist werkt alleen als je alle gevallen opneemt in de blacklist. Als iemand iets compleet anders invult ([email protected]) dan ben je met een blacklist-aanpak nog steeds nat... (oftewel, deze aanpak biedt geen soelaas)
Gewijzigd op 18/01/2018 20:19:50 door Thomas van den Heuvel
Om hen niet op te zadelen bedacht de TS dus dat deze alias geblokkeerd wordt.
Als Ronald dit kan bevestigen, dan weten we het zeker.
- Ariën - op 18/01/2018 20:28:44:
dat sommige mensen in een organisatie een verkeerd mailadres invullen.
Mja, tijd voor wat eenvoudige
Gewijzigd op 18/01/2018 21:23:47 door Thomas van den Heuvel
Gewijzigd op 18/01/2018 21:48:02 door - Ariën -
Blijkbaar heeft topicstarter bovenstaande functionaliteit nodig om door mailtjes heen te ploeteren maar in feite is het kwaad dan al geschied. Los daarvan zorgt alle verkeerd bezorgde mail of te ruim ingestelde filters (of helemaal geen filters) voor ruis en dit kan op den duur ook nog voor andere problemen zorgen (terugvinden van serieuze mail tussen spam, diskruimte etc).
Dit zou voor mij een signaal zijn om het roer om te gooien, niet om op dezelfde wijze verder te gaan en deze (m.i. verkeerde) werkhouding verder te promoten. Zo van "maakt niet uit wat je invult voor de @, wij vissen je mailtje wel uit een berg met zooi".
Daarnaast, er zijn mogelijk legio redenen waarom een verkeerd e-mailadres wordt gebruikt. Typefout, verouderd adres, whatever. Tijd om dat op te lossen door contactinformatie beter te communiceren, of door mail gewoon te retourneren. Laat foute dingen gewoon fout gaan.
Vergelijk het met de normale post - als iemand een niet bestaand adres als bestemming opgeeft hoef je ook niet te verwachten dat het bij de juiste persoon aankomt, waarom zou je dat bij e-mail dan wel verwachten?
Bij kleine organisaties lijkt het mij juist des te belangrijker dat dit soort zaken gewoon goed geregeld zijn?
EDIT: om terug te koment op de oorspronkelijke vraagstelling:
Quote:
Niet; PHP is hoogstwaarschijnlijk niet de juiste plaats om dit probleem op te lossen.Maar woongroep hoor er niet voor te staan hoe kan ik dat blocken via php.
Gewijzigd op 18/01/2018 22:34:18 door Thomas van den Heuvel
Thomas van den Heuvel op 18/01/2018 22:31:58:
EDIT: om terug te koment op de oorspronkelijke vraagstelling:
Quote:
Niet; PHP is hoogstwaarschijnlijk niet de juiste plaats om dit probleem op te lossen.Maar woongroep hoor er niet voor te staan hoe kan ik dat blocken via php.
Lijkt mij inderdaad gewoon een mailserver probleem.
Of natuurlijk gewoon zorgen dat je gebruikers een beetje intelligent zijn.
Mensen daar weten soms hun mail niet zoals woongroepen denken dat hun mail is woongroep(naam)@..nl maar ze moet geen woongroep er voorzetten als dan de bestelling doen kijk ik in mijn mail box een mail van mail server van het bedrijf dat het mailtje niet kan bezorgen.
En ik wilde daarvan af want wil graag dat ze achter komen dat ze verkeerd invullen. Daarom dacht ik is niet handig om het te blokken. In dit script zat al blokkade voor domains want die typen ze soms zelf ook verkeerd.
Op moment ben ik aan het kijken als me lukt om met de functie strpos het te kunnen blocken wat - Ariën - al heeft aangeraden.
Een oplossing in PHP is mogelijk, maar ik zou die organisatie dan liever duidelijk maken dat zij steeds verkeerde mail-adressen invullen, en of zij dit in een mailing aan hun werknemers kunnen benadrukken.
Ik zou dan zelf hoogstens de melding op je formulier verduidelijken dat mensen "hun JUISTE mailadres invoeren". Een blacklist met bepaalde namen kan wel, maar wat als er uiteindelijk wel een aanvraag komt van een mailadres met een alias met daarin het woord 'woongroep'. Dan schuif je het probleem door naar de andere bestellende partij.
Dus mijn advies: Draai de oplossing teug, en pak het bij de bron aan.
Je zou misschien zelf er een klantensysteem aan kunnen hangen, waarbij ze moeten inloggen. Uiteraard hoeven ze bij het registratieproces enkel hun mail te bevestigen.
Gewijzigd op 19/01/2018 10:18:38 door - Ariën -
De mensen daar weten mail niet want ze allemaal met outlook werken en het uit adressen boek halen.
Het zou dan wel mogelijk zijn om het om te draaien en dan een adressen boek in het systeem te bouwen en dat ze nooit meer verkeerd kunnen doen.
Of zorg voor een registratie-proces, zodat je de gegevens van de klant steeds weer weet.
Dit kan mogelijk ook een strategie zijn: als er ergens de kans bestaat dat iemand iets verkeerd in kan invullen: bied iemand die kans dan gewoon niet, bijvoorbeeld door hun een beperkte selectie van vaste waarden te geven of leg deze waarden ergens vast en koppel deze aan accounts van de applicatie voor het doen van bestellingen.