Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Istnienie skrzynki pocztowej
Forum PHP.pl > Forum > PHP
escaflowne
Witam!
Czy w php istnieje funkcja pozwalająca sprawdzić, czy w danej domenie istnieje skrzynka email o podanej nazwie. Najlepiej, żeby potrafiło także sprawdzać aliasy. Szukałem w manualu, ale wydaje mi się, że imap_open raczej nie spełnia moich wymogów...
spenalzo
Chodzi o [manual:82cd9ca670]getmxrr[/manual:82cd9ca670] ?

Zobacz komentarze, może to sie przyda
[php:1:82cd9ca670]<?php
$host=$host.".";
if ( getmxrr( $host, $mxhosts ) == FALSE &&
gethostbyname( $host ) == $host ) {
echo "$host is not a valid e-mail host.";
} else {
echo "$host is a valid e-mail host.";
}
?>[/php:1:82cd9ca670]

Aha, php Początkujący -> php
adwol
Cytat
Witam!
Czy w php istnieje funkcja pozwalająca sprawdzić, czy w danej domenie istnieje skrzynka email o podanej nazwie. Najlepiej, żeby potrafiło także sprawdzać aliasy.

Niewykonalne. Nigdy nie masz gwarancji istnienia skrzynki, że o aliasie nie wspomnę. Była już kiedyś o tym dyskusja. Poszukaj na forum.
Cytat
Szukałem w manualu, ale wydaje mi się, że imap_open raczej nie spełnia moich wymogów...

imap_open pozwala Ci otworzyć skrzynkę tylko jeśli masz do niej prawa (np. znasz login i hasło). Jeśli skrzynka nie istnieje najprawdopodobniej również dostaniesz błąd, że podałeś złe hasło (w przypadku zdalnych skrzynek oczywiście).
<kros>
Czesc. Moim skromnym zdaniem jest to mozliwe, a jesli chcesz sprawdzic to wejdz na strone kliknij menu Pomoc i sprubuj wyslac maila na nie istniejącą skrzynkę pocztową i zobaczysz co się stanie smile.gif
Nie wysyłaj tylko z istniejącym adresem skrzynki pocztowej, chyba ze w temacie wpisz test, bo jest to firmowa strona, a ja jestem tam tylko adminem.
jono
[php:1:ed246c07cb]<?php
/* =======================================================================

ifsnow's email valid check function SnowCheckMail Ver 0.1

funtion SnowCheckMail ($Email,$Debug=false)

$Email : E-Mail address to check.
$Debug : Variable for debugging.

* Can use everybody if use without changing the name of function.

Reference : O'REILLY - Internet Email Programming

HOMEPAGE : http://www.hellophp.com

ifsnow is korean phper. Is sorry to be unskillful to English. *^^*;;

========================================================================= */

function SnowCheckMail($Email,$Debug=false)
{
global $HTTP_HOST;
$Return =array();
// Variable for return.
// $Return[0] : [true|false]
// $Return[1] : Processing result save.

if (!eregi("^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,3})$", $Email)) {
$Return[0]=false;
$Return[1]="${Email} is E-Mail form that is not right.";
if ($Debug) echo "Error : {$Email} is E-Mail form that is not right.<br>";
return $Return;
}
else if ($Debug) echo "Confirmation : {$Email} is E-Mail form that is not right.<br>";

// E-Mail @ by 2 by standard divide. if it is $Email this "lsm@ebeecomm.com"..
// $Username : lsm
// $Domain : ebeecomm.com
// list function reference : http://www.php.net/manual/en/function.list.php
// split function reference : http://www.php.net/manual/en/function.split.php
list ( $Username, $Domain ) = split ("@",$Email);

// That MX(mail exchanger) record exists in domain check .
// checkdnsrr function reference : http://www.php.net/manual/en/function.checkdnsrr.php
if ( checkdnsrr ( $Domain, "MX" ) ) {
if($Debug) echo "Confirmation : MX record about {$Domain} exists.<br>";
// If MX record exists, save MX record address.
// getmxrr function reference : http://www.php.net/manual/en/function.getmxrr.php
if ( getmxrr ($Domain, $MXHost)) {
if($Debug) {
echo "Confirmation : Is confirming address by MX LOOKUP.<br>";
for ( $i = 0,$j = 1; $i < count ( $MXHost ); $i++,$j++ ) {
echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result($j) - $MXHost[$i]<BR>";
}
}
}
// Getmxrr function does to store MX record address about $Domain in arrangement form to $MXHost.
// $ConnectAddress socket connection address.
$ConnectAddress = $MXHost[0];
}
else {
// If there is no MX record simply @ to next time address socket connection do .
$ConnectAddress = $Domain;
if ($Debug) echo "Confirmation : MX record about {$Domain} does not exist.<br>";
}

// fsockopen function reference : http://www.php.net/manual/en/function.fsockopen.php
$Connect = fsockopen ( $ConnectAddress, 25 );

// Success in socket connection
if ($Connect)
{
if ($Debug) echo "Connection succeeded to {$ConnectAddress} SMTP.<br>";
// Judgment is that service is preparing though begin by 220 getting string after connection .
// fgets function reference : http://www.php.net/manual/en/function.fgets.php
if ( ereg ( "^220", $Out = fgets ( $Connect, 1024 ) ) ) {

// Inform client's reaching to server who connect.
fputs ( $Connect, "HELO $HTTP_HOSTrn" );
if ($Debug) echo "Run : HELO $HTTP_HOST<br>";
$Out = fgets ( $Connect, 1024 ); // Receive server's answering cord.

// Inform sender's address to server.
fputs ( $Connect, "MAIL FROM: <{$Email}>rn" );
if ($Debug) echo "Run : MAIL FROM: &lt;{$Email}&gt;<br>";
$From = fgets ( $Connect, 1024 ); // Receive server's answering cord.

// Inform listener's address to server.
fputs ( $Connect, "RCPT TO: <{$Email}>rn" );
if ($Debug) echo "Run : RCPT TO: &lt;{$Email}&gt;<br>";
$To = fgets ( $Connect, 1024 ); // Receive server's answering cord.

// Finish connection.
fputs ( $Connect, "QUITrn");
if ($Debug) echo "Run : QUIT<br>";

fclose($Connect);

// Server's answering cord about MAIL and TO command checks.
// Server about listener's address reacts to 550 codes if there does not exist
// checking that mailbox is in own E-Mail account.
if ( !ereg ( "^250", $From ) || !ereg ( "^250", $To )) {
$Return[0]=false;
$Return[1]="${Email} is address done not admit in E-Mail server.";
if ($Debug) echo "{$Email} is address done not admit in E-Mail server.<br>";
return $Return;
}
}
}
// Failure in socket connection
else {
$Return[0]=false;
$Return[1]="Can not connect E-Mail server ({$ConnectAddress}).";
if ($Debug) echo "Can not connect E-Mail server ({$ConnectAddress}).<br>";
return $Return;
}
$Return[0]=true;
$Return[1]="{$Email} is E-Mail address that there is no any problem.";
return $Return;
}

?>[/php:1:ed246c07cb]

Powinno działać...
adwol
Cytat
Powinno działać...

Ale nie działa. Dlaczego tak uparcie wszyscy starają się znaleźć metodę na rozwiązanie tego, skoro dla protokołu SMTP jest to w ogólności nierozwiązalne? Jedyne na czym może bazować zewnętrzny kod sprawdzający istnienie skrzynki to odpowiedzi od serwera pocztowego. I o ile jeszcze w przypadku odpowiedzi, że skrzynki nie ma, możemy być tego pewni, to potwierdzenie przyjęcia listu nie gwarantuje w żaden sposób tego, że ona istnieje. Wysyłanie komunikatu o tym, że podany adres jest błędny to tylko i wyłącznie dobra wola administratora. Jeśli będzie chciał to nikt z zewnątrz nie odróżni istniejącego adresu od nieistniejącego.
kris_
kris:~$ telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 kris.wlkp.pl ESMTP Sendmail 8.12.9/8.12.6; Mon, 13 Oct 2003 22:39:50 +0200 (CEST)
helo lamer
250 kris.wlkp.pl Hello localhost [127.0.0.1], pleased to meet you
mail from: kris@wlkp.top.pl
250 2.1.0 kris@wlkp.top.pl... Sender ok
rcpt to: test
550 5.1.1 test... User unknown
rcpt to: kris
250 2.1.5 kris... Recipient ok
quit
221 2.0.0 kris.wlkp.pl closing connection
Connection closed by foreign host.

adwol ja rozumiem o co Tobie chodzi, ale to jest zawsze jakis sposob.
Lepszy rydz niz nic
mozna spokojnie uznać że 99% serverów prawidłowo zareaguje na to sprawdzenie
adwol
Cytat
Czesc. Moim skromnym zdaniem jest to mozliwe, a jesli chcesz sprawdzic to wejdz na strone skaytek.and.pl kliknij menu Pomoc i sprubuj wyslac maila na nie istniejącą skrzynkę pocztową i zobaczysz co się stanie smile.gif

Spróbowałem i zobaczyłem to:
Kod
Warning: fsockopen(): unable to connect to xxx.xxxx.pl:25 in /var/set/virtual/and.pl/httpd/skaytek/cgi-bin/wer_domain.php on line 57

Pomijając fakt, że ten skrypt jakoś nie radzi sobie z DNSowymi rekordami MX (próbuje na siłę wysłać do serwera, który chociaż jako pierwszy jest zwracany przez DNS, lecz ma mniejszy priorytet), to nie wierzę za bardzo w jego jasnowidztwo.
<kros>
sorki...sorki wszystkich - weryfikacja adresu emila na stronie skaytek.and.pl jest nie prawidlowa poniewaz dopiero sam to zweryfikowalem he.. he.. mały blad poprostu nie ten plik (stara wersja)
Macie nową i na pewno działa no może tylko na wp.pl nie , moze ktos wie czemu serwer przyjmuje wszystkie smieci he.. he.. to niech mi da znac... ups...
[php:1:16c90898c3]<?php
/*
** Funkcja: verifyEmail
** Argumenty: STRING address, REFERENCE error
** Wartość: BOOLEAN
** Opis: próbuje zweryfikować adres email
** kontaktując się z wymiennikiem poczty. Zarejestrowane wymienniki
** są wywoływane najpierw przez kontrolera domen,
** a następnie przez samą domenę. Argument error
** będzie zawierał stosowny tekst w przypadku niemożliwości weryfikacji adresu
**
*/

$address = "weryfikujmnie@interia.pl";
//$address = "weryfikujmnie@klub.chip.pl";
//$address = "weryfikujmnie@poczta.onet.pl";
//$address = "weryfikujmnie@wp.pl";

function verifyEmail($address, &$error)
{
global $SERVER_NAME;

list($user, $domain) = split("@", $address, 2);

//upewnienie się czy domena posiada wymiennik poczty
if(checkdnsrr($domain, "MX"))
{
//pobranie informacji z wymiennika
if(!getmxrr($domain, $mxhost, $mxweight))
{
$error = "Nie można pobrać wymienników poczty!<BR>n";
return(FALSE);
}
}
else
{
//Jeżeli nie ma wymienników, być może
//sam host przyjmuje pocztę
$mxhost[] = $domain;
$mxweight[] = 1;
}

//utworzenie sortowanej tablicy hostów
for($i = 0; $i < count($mxhost); $i++)
{
$weighted_host[($mxweight[$i])] = $mxhost[$i];
}
ksort($weighted_host);

//pętla wśród poszczególnych hostów
foreach($weighted_host as $host)
{
//połączenie z portem hosta SMTP
if(!($fp = fsockopen($host, 25)))
{
//nie można połączyć sie z tym hostem,
//być może następny będzie działał
continue;
}


/*
** przepuszczenie 220 wiadomości
** rezygnacja w przypadku braku odpowiedzi w czasie 10 sekund
*/
set_socket_blocking($fp, FALSE);

$stopTime = time() + 10;
$gotResponse = FALSE;

while(TRUE)
{
//próba pobranie wiersza z serwera pocztowego
$line = fgets($fp, 1024);

if(substr($line, 0, 3) == "220")
{
//wyzerowanie zegara
$stopTime = time() + 10;
$gotResponse = TRUE;
}
elseif(($line == "") AND ($gotResponse))
{
break;
}
elseif(time() > $stopTime)
{
break;
}
}

if(!$gotResponse)
{
//ten host nie odpowiada,
//może następny będzie lepszy
continue;
}

set_socket_blocking ($fp, TRUE);

//logowanie
fputs($fp, "HELO $SERVER_NAMErn");
fgets($fp, 1024);

//ustawienie from
fputs($fp, "MAIL FROM: <$user@$domain>rn");
fgets($fp, 1024);

//próbowanie adresu
fputs($fp, "RCPT TO: <$address>rn");
$line = fgets($fp, 1024);

//zamknięcie połączenia
fputs($fp, "QUITrn");
fclose($fp);

if(substr($line, 0, 3) != "250")
{
//serwer pocztowy nie rozpoznaje tego adresu
//zapewne jest on nieprawidłowy
$error = $line;
return(FALSE);
}
else
{
//adres nieznany
return(TRUE);
}
}

$error = "Nie można połączyć się z wymiennikiem poczty!";
return(FALSE);
}


if(verifyEmail($address, &$error))
{
print("Zweryfikowany!<BR>n");
}
else
{
print("Nie można zweryfikować adresu!<BR>n");
print("Błąd: $error<BR>n");
}
?>[/php:1:16c90898c3]
<kros>
Cytat
Cytat
Powinno działać...

Ale nie działa. Dlaczego tak uparcie wszyscy starają się znaleźć metodę na rozwiązanie tego, skoro dla protokołu SMTP jest to w ogólności nierozwiązalne? Jedyne na czym może bazować zewnętrzny kod sprawdzający istnienie skrzynki to odpowiedzi od serwera pocztowego. I o ile jeszcze w przypadku odpowiedzi, że skrzynki nie ma, możemy być tego pewni, to potwierdzenie przyjęcia listu nie gwarantuje w żaden sposób tego, że ona istnieje. Wysyłanie komunikatu o tym, że podany adres jest błędny to tylko i wyłącznie dobra wola administratora. Jeśli będzie chciał to nikt z zewnątrz nie odróżni istniejącego adresu od nieistniejącego.

Doradzam przeczytac RCF 821 opisuje protokol SMTP, ktory jest uzywany do wymiany poczty.
spenalzo
Ech... ja tam za bardzo w praktyce nie miałem z tym do czynienia, ale trochę się naczytałem i tak jak mówi adwol, wszystko zależy od serwera - czy to do Was kiedyś dotrze? Owszem protokół SMTP umożliwia sprawdzanie czy takie konto istnieje, ale nie zawsze jest to ustawione od strony serwera - nawet przy nie istniejącej skrzynce serwer zwróci OK...
adwol
Cytat
Doradzam przeczytac RCF 821 opisuje protokol SMTP, ktory jest uzywany do wymiany poczty.

Doradzam myśleć i samemu poczytać RFC2821 (który zastępuje RFC821).
Cytat
Servers MAY forward messages when they are aware of an address change.  When they do so, they MAY either provide address-updating information with a 251 code, or may forward "silently" and return a 250 code. But, if a 251 code is used, they MUST NOT assume that the client will actually update address information or even return that information to the user.

Dodatkowo ani RFC821 ani RFC2821 nie precyzują co to znaczy ,,unknown recipient'', a tylko dla takiego przypadku jest określane działanie. W szczególności status adresata może być nieznany w momencie dialogu SMTP.

Poza tym niezależnie od standardu, rozwiązanie takie jest czasami wykorzystywane np. ze względów bezpieczeństwa, a chodziło o fakty, a nie o akademickie dyskusje.

Jednym słowem, wykrycie czy adres jest rzeczywiście poprawny (tj. czy dotrze do jakiegoś konkretnego, rzeczywistego adresata) może być niewykonalne (wspomniany przez Ciebie przykład -- Wirtualna Polska).
kris_
ale jezeli tostaniesz odpowiedz odmowna to jestes pewien ze jest niepoprawny, a to juz jest cos!
wojtek
Faktycznie nie da sie ocenic czy dany e-mail na pewno istnieje. Przytocze tutaj maly cytat z programu GroupMail, ktory ma wlasnie opcje 'check/verify' przy kazdym z e-mailu:

Cytat
Please note that this test only confirms that the Recipients email server exists and is availible to accept email


Co potwierdza to co wyzej napisaliscie. Jednak uwazam ze i to moze sie nam przydac, np. do sprawdzania czy podany przez usera email istnieje (nie daje nam 100% pewnosci, ale przeciez jesli jest bledny to nigdy nam nie zwroci ze istnieje, tak?). Mozna dzieki temu weryfikowac liste subskrybentow, dzieki czemu przy wysylce dostaniemy duzo mniej zwrotow, co pozwoli odciazyc troche serwer..

Co do przytoczonej funkcji sprawdzajacej mail, jej zrodlo mozna znalezc tutaj - http://www.zend.com/codex.php?id=449&single=1
<kros>
...przytocze ostatni wywod. Pomimo wszystkich wysilkow niema 100% pewnosci istnienia skrzynki wszystko zalezy od admina czy chce czytac smieci czy nie to juz jego sprawa. Jednak poprawnie skonfigurowanu serwer nie powinien moim zdaniem przyjmowac takich emili i staje sie to powoli regula.I jeszcze ostatnie zdanie. Jesli mamy mozliwosci odrzucenia czesci nie prawidlowych adresow to jest juz przeciez sukces i nie wazne jak to ktos zrobi wazny jest rezultat moze 50% ,a moze 90% mniej smieci. I nie zgadzam sie z twierdzeniem nic nie rob bo to nie mozliwe. Niektorzy tez kiedys mowili skrzydla sa tylko dla bogow i co... - to byl tylko taki wywod. cze:)
Danon
Cytat
Czesc. Moim skromnym zdaniem jest to mozliwe, a jesli chcesz sprawdzic to wejdz na strone skaytek.and.pl kliknij menu Pomoc i sprubuj wyslac maila na nie istniejącą skrzynkę pocztową i zobaczysz co się stanie smile.gif


Sprawdzałem weryfiację mail'a i fakt skrypt sprawdza czy istnieje serwer np. wp.pl ale istnienia maila na tym serwerze nie ma możliwości sprawdzenia. Wysyła każdy :wink: jaki komu przyjdzie na myśl.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.