Hlavní navigace

Názory k článku
PHP okénko: Kontrola e-mailové adresy

LesTR
LesTR (neregistrovaný)
5. 5. 2006 0:29 Nový

Doplneni treti moznosti

celé vlákno
Odeslat e-mail i v html podobe, kde napr. na src tagu povesit nas skript, ktery e-mail zalobuje jako pouzivany a odesle obrazek s prislusnou hlavickou.
V mnoha pripadech byva nacitani obrazku z jinych url zakazane, avsak BFU si je casto ze zvedavosti povoluji : )
Takova spise spamerska vec ... fuj fuj : )
LesTR
LesTR (neregistrovaný)
5. 5. 2006 0:31 Nový

Re: Doplneni treti moznosti

celé vlákno
he nejak mi tam za src tagu vypadlo <img /> :(
Kalda
Kalda (neregistrovaný)
5. 5. 2006 11:33 Nový

Re: Doplneni treti moznosti

celé vlákno
Jenže to asi neodpovídá tomu řešení, proč se provádí třetí možnost. Třetí možnost je zde kvůli tomu, aby se zjistilo, jestli si skutečně daný člověk danou službu (např. zasílání newsletteru) objednal.

Použití IMG je spíše kontrolou, jestli je daná emailová schránka funkční, jenže pro to je ve většině případů vhodnější použití druhé varianty (občas může druhé řešení selhat - např. mailservery Atlas.cz vrací kód 250 i pro neexistujícího uživatele atd.).
Michal Ludvig aura:100
5. 5. 2006 1:33 Nový

Ke druhe moznosti

celé vlákno
Druha moznost neni 100% spravna:
1) Nechavas otevrene sockety
2) SMTP konverzace by mela koncit QUITem (prip. RSET, QUIT) a ne ji proste utnout nebo nechat uhnit.

Jen tak rejpu kdyz zrovna nemam u obeda co delat ;-)
Mirek Topinka
Mirek Topinka (neregistrovaný)
5. 5. 2006 7:27 Nový

Re: Ke druhe moznosti

celé vlákno
Do člověka který se snaží poučovat ostatní a přitom sám dělá základní chyby se rejpat jednoduše musí...
M jako Molitan
M jako Molitan (neregistrovaný)
5. 5. 2006 13:44 Nový

Re: Ke druhe moznosti

celé vlákno
Je mi lito, ale lepsi blog o PHP nez ten Vranuv v cestine neni.
Martin
Martin (neregistrovaný)
8. 5. 2006 18:44 Nový

Re: Ke druhe moznosti

celé vlákno
a) co znamená v tomto kontextu slovo "lepší"?
b) je nutné mít (chtít) všechny informace v češtině?
Jakub Vrána aura:60
5. 5. 2006 10:11 Nový

Re: Ke druhe moznosti

celé vlákno
Díky za připomínky, máš samozřejmě úplnou pravdu. Sockety se automaticky zavřou při ukončení skriptu, ale není důvod je nezavřít hned.
Lampa
Lampa (neregistrovaný)
5. 5. 2006 7:48 Nový

druha moznost + dalsi moznost

celé vlákno
druha moznost je ponekud nevyhovujici, kdyz si vezmeme casovou prodlevu a mail posilame na nejaky vytizenejsi server

pak je tady moznost jeste vyuzit PEAR:
<?
require_once('PEAR.php');
require_once('Mail/RFC822.php');

$p = new PEAR();
$m = new Mail_RFC822();

if (!$p->isError($m->parseAddressList($from, NULL, false, true)) {
# mail je v poradku
}
?>
Jakub Vrána aura:60
5. 5. 2006 10:28 Nový

Re: druha moznost + dalsi moznost

celé vlákno
Tato knihovna kontroluje řetězec na to, zda lze použít v hlavičkách From, To a dalších (jak se rozebírá v perexu). Pokud si z e-mailové adresy chceme tento řetězec následně sestavit sami (např. ve tvaru Jmeno <email>), tak je tato kontrola nešikovná. Knihovna navíc propustí např. i adresy 1@1 nebo <1>, které jsou platné jen za určitých specifických podmínek.
Lampa
Lampa (neregistrovaný)
5. 5. 2006 10:42 Nový

Re: druha moznost + dalsi moznost

celé vlákno
no prave ty parametry zarucuji ze se to jmeno nebude kontrolovat a bude se kontrolovat pres regularni vyraz pouze ta adresa
Jakub Vrána aura:60
5. 5. 2006 10:47 Nový

Re: druha moznost + dalsi moznost

celé vlákno
Proč si to raději nejdřív nevyzkoušíte třeba s $from = 'Name <richard> (comment)'?
Lampa
Lampa (neregistrovaný)
5. 5. 2006 12:01 Nový

Re: druha moznost + dalsi moznost

celé vlákno
mate pravdu, dal jsem zde spatny priklad

<?php
require_once('Mail/RFC822.php');
$x = new Mail_RFC822();
$y = $x->isValidInetAddress('lampa@root.cz', 1);
?>

vraci false kdyz je to spatne a kdyz je to dobre, tak vraci pole obsahujici cast pred a za zavinacem
uživatel si přál zůstat v anonymitě
5. 5. 2006 12:30 Nový

Re: druha moznost + dalsi moznost

celé vlákno
a prelezie cez to aj taketo daco?

user%gmail.com@root.cz
user%gmail.com%seznam.cz@root.cz

:-))
J
J (neregistrovaný)
5. 5. 2006 10:30 Nový

vsechno spatne

celé vlákno
Pokud dobre vidim, pripousti fce check_email jen ASCII znaky, coz je nesmysl, protoze uz ted muze email klido obsahovat diakritiku a to jak v domene, tak pravdepodobne i v uzivatelskym jmenu.
Jakub Vrána aura:60
5. 5. 2006 10:42 Nový

Re: vsechno spatne

celé vlákno
Tyto znaky musí být zakódované, což funkce zohledňuje. Viz např. http://www.lupa.cz/clanky/jak-funguji-hacky-a-carky-v-domenach/.
Kalda
Kalda (neregistrovaný)
5. 5. 2006 11:41 Nový

Re: vsechno spatne

celé vlákno
Funkce zohledňuje, pakliže tam dostanu ten email již zakódovaný. Ale pokud bych tam chtěl poslat např. kontrolu pole přímo získaného z formuláře, tak by se musel nejprve uskutečnit převod. Vím, že je to nyní úplně mimo téma - neznáte nebo nemáte někde hotovou funkci, která převod udělá?
uživatel si přál zůstat v anonymitě
5. 5. 2006 11:58 Nový

Re: vsechno spatne

celé vlákno
Mnooo, nevim nevim jestli ti do formularu nekdo bude psat zakodovanou domenu. Spis ti, jakozto hrdy majitel diakriticke domeny, zada rovnou <běžný.franta@uživatel.cz>. a ne nejake <=?utf8?skdjfksjbf?@xn--uivatel-xyz.cz> ;-) Ale tim bych se nezatezoval, stejne mu {zatim} takova adresa nebude skoro nikde fungovat, tak proc by mela fungovat zrovna u me.
Michal Ludvig aura:100
6. 5. 2006 2:11 Nový

Re: vsechno spatne

celé vlákno
Nepřál jsem si zůstat v anonymitě, grrrr
Kalda
Kalda (neregistrovaný)
5. 5. 2006 11:00 Nový

Ke druhému rešení

A) zdá se mi zbytečné procházet všechny mailservery, protože toto řešení je časově náročné, ale ještě bych zjistil preference jednotlivých mailserverů a testoval bych na serveru s největší preferencí. Zdá se mi zbytečný např. test na sekundárním mailserveru.

B) Se skriptem obdobně napsaným jsem už měl i několik drobných problémů s rychlostí odezvy od serveru (což zmiňuje Lampa), ale to jde vyřešit pomocí funkce stream_set_timeout() .
zet
zet (neregistrovaný)
5. 5. 2006 11:30 Nový

regex

celé vlákno
dany regex neresi napr. vice pomlcek za sebou, ja pouzivam svuj osvedceny:

/^((?:(?:(?:[a-zA-Z0-9][\.\-\+_]?)*)[a-zA-Z0-9])+)\@((?:(?:(?:[a-zA-Z0-9][\.\-_]?){0,62})[a-zA-Z0-9])+)\.([a-zA-Z0-9]{2,6})$/
Jakub Vrána aura:60
5. 5. 2006 11:51 Nový

Re: regex

celé vlákno
Tento výraz zakazuje řadu znaků, které ve skutečnosti povolené jsou. Dvě pomlčky za sebou se používají třeba ve zmiňovaných národních doménách (prefix xn--). Jedna část domény by neměla mít víc než 63 znaků, vy jich povolujete libovolné množství, výraz {0,62} ve vašem výrazu toto omezení nezaručuje.
Martin Mareš
5. 5. 2006 20:16 Nový

Re: regex

celé vlákno
O 63 znacích se v RFC 2822 (formát mailových hlaviček a adres) určitě nic nepíše, ale máte pravdu, že pokud se bude mail doručovat pomocí SMTP, stejně na tento limit nakonec dojde.

Svého času jsem se pokusil kontrolu podle RFC 2822 napsat, výsledek, který povolenou syntaxi velmi dobře aproximuje, najdete na http://www.ucw.cz/~mj/tmp/checkaddr . Zvládne i takové špeky, jako je třeba "a b"@c.d nebo x@[y z.org].
ooohhhmmm
ooohhhmmm (neregistrovaný)
5. 5. 2006 14:37 Nový

navrh na dalsi PHP okenko ...

Platba kartou.

Tedy se vsim vsudy: bezpecny kod pro placeni kartou pres internet.
Bilbo
Bilbo (neregistrovaný)
6. 5. 2006 13:34 Nový

ne zcela spravne

celé vlákno
No a co dve tecky za sebou v adrese?

Maily typu a..b@neco.cz
(jeden takovy pouziva treba moje pritelkyne :)

Mozna to neni uplne dle RFC, ale v praxi to funguje ... kratke, dobre zapamatovatelne jmeno.

A co tecka na konci domeny?

xyz@neco.cz.

(trochu nestandardni pouziti, ale platna domena .... )

> "Podle RFC 2821 sice doména může poštu přijímat i bez MX záznamu, ale nebývá to zvykem."

Ve chvili kdy nemam nad svymi dns zaznamy uplnou kontrolu tak jsem rad ze se dorucuje i na A zaznam ... obvykly to sice neni, ale zas tak okrajovy pripad to nemusi byt.

Myslim ze v praxi je asi lepsi pouzit co nejjednodussi regexp asi ve stylu "[^@]+@[^@]+" a kdyz to neni platne tak holt uzivateli neprijde aktivacni email a ma smulu :)
.
. (neregistrovaný)
1. 6. 2008 1:16 Nový

Re: ne zcela spravne

celé vlákno
> Mozna to neni uplne dle RFC, ale v praxi to funguje ...

Takže to budeme hodně podporovat, aby se to stalo standardem :/
Neviem
Neviem (neregistrovaný) 94.136.144.---
26. 12. 2011 23:46 Nový

Re: PHP okénko: Kontrola e-mailové adresy

A ako mam vypisat ze neplatny email z toho?

<?php
/** Odeslání příkazů SMTP serveru
* @param resource otevřený socket k SMTP serveru
* @param array příkazy k odeslání
* @return bool false v případě, že některý příkaz nevrátí 250
*/
function smtp_commands($fp, $commands) {
foreach ($commands as $command) {
fwrite($fp, "$command\r\n");
$s = fgets($fp);
if (substr($s, 0, 3) != '250') {
return false;
}
while ($s[3] == '-') {
$s = fgets($fp);
}
}
return true;
}

/** Ověření funkčnosti e-mailu
* @param string adresa příjemce
* @param string adresa odesílatele
* @return bool na adresu lze doručit zpráva, null pokud nejde ověřit
* @copyright Jakub Vrána, http://php.vrana.cz/
*/
function try_email($email, $from) {
if (!function_exis­ts('getmxrr')) {
return null;
}
$domain = preg_replace('~­.*@~', '', $email);
getmxrr($domain, $mxs);
if (!in_array($domain, $mxs)) {
$mxs[] = $domain;
}
$commands = array(
"HELO " . preg_replace('~­.*@~', '', $from),
"MAIL FROM: <$from>",
"RCPT TO: <$email>",
);
$return = null;
foreach ($mxs as $mx) {
$fp = @fsockopen($mx, 25);
if ($fp) {
$s = fgets($fp);
while ($s[3] == '-') {
$s = fgets($fp);
}
if (substr($s, 0, 3) == '220') {
$return = smtp_commands($fp, $commands);
}
fwrite($fp, "QUIT\r\n");
fgets($fp);
fclose($fp);
if (isset($return)) {
return $return;
}
}
}
return false;
}
?>

skusal som if(try_email == true)... ale nejde ta

Zasílat nově přidané příspěvky e-mailem