Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Como Saber si una Dirección de Correo es Válida???? (https://www.clubdelphi.com/foros/showthread.php?t=21741)

AGAG4 26-05-2005 16:04:50

Como Saber si una Dirección de Correo es Válida????
 
Uso D6

Estoy usando un demo de los indy's MailClient que sirve para enviar EMAIL's, pero no he podido encontrar como saber si la Dirección de Correo del Destinatario es VALIDA para serciorarme que le llegará el correo, de lo contrario si es inválido avisarle al usuario que Corrija dicha dirección de correo.

Agradezco cualquier sugerencia.

JXJ 26-05-2005 16:37:26

¿¿de que este bien escrita. por ejemplo Cuenta@hotmail.com y no
Cuienta@hotmail,com??

¿o de que esa cuenta de correo este activa en el servidor. del correo de
destinatario?

JXJ 26-05-2005 16:41:13

Esto es para aeguranos que la sintaxis de la cuenta de correo este
bien escrita. como el primer ejemplo que de di.

Código Delphi [-]
 
function IsValidEmail(const Value: string): Boolean;
 
function CheckAllowed(const s: string): Boolean;
var i: Integer;
begin
Result:= false;
for i:= 1 to Length(s) do
if not (s[i] in ['a'..'z', 
'A'..'Z', 
'0'..'9', 
'_', 
'-', 
'.']) then Exit;
Result:= true;
end;
 
var
i: Integer;
NamePart, ServerPart: string;
begin
Result:= False;
i:=Pos('@', Value);
if i=0 then Exit;
NamePart:=Copy(Value, 1, i-1);
ServerPart:=Copy(Value, i+1, Length(Value));
if (Length(NamePart)=0) or ((Length(ServerPart)<5)) then Exit;
i:=Pos('.', ServerPart);
if (i=0) or (i>(Length(serverPart)-2)) then Exit;
Result:= CheckAllowed(NamePart) and CheckAllowed(ServerPart);
end;

el codigo fuente de un pryecto de muestra. por si no fui claro.
http://greatis.com/delphicb/tips/lib...checkemail.zip

jachguate 26-05-2005 16:56:55

No he probado "en vivo" pero me parece que el algoritmo fallaría con algo como:

juanperez@servidor.com.

Donde evidentemente el último punto está de mas.

Hasta luego.

;)

marcoszorrilla 26-05-2005 17:01:30

Pues yo lo acabo de probar y falla, pues me da valida una dirección de correo terminada en .

Un Saludo.

JXJ 26-05-2005 18:59:58

Claro que falla. lo que revisa es si la dirección esta bien escrita.
en las primeras partes antes y despues de la @
juanperez@servidor.com. y eso por que hay ciertas formas de enviar el correo
por ejemplo, algunos componente o dll, para enviar correo
solo admiten o ( , ) o ( ; ) o ambas, indy creo que permite usar dos formas
de separar los destinatarios por ( , ) o ( ; ), no faltara quien crea mejor usar un ( . )
--}
si saben como solucionar ese defecto. decirlo. o los otros posibles que al separar
los destinatarios se vaya un dedo de may se agregen ( ,,) o ( ;; ) o semejantes.

aparte, AgAg4 no dice si es solo verificar, la sintaxis o se refiere a revisar si
la cuenta de correo esta activa.

roman 26-05-2005 19:18:13

¿Y qué tal si escribo una dirección como ésta?

"Informático Román %&$" <roman@gmail.com>

// Saludos

Lepe 26-05-2005 19:55:06

Personalmente y con todo el afán del mundo para convertir este hilo en un debate.... :D :D creo que todo lo expuesto aqui es excesivo.

"Por favor, introduzca un e-mail válido!!!" y listo...... sin problemas, si la persona quiere enviar/recibir "lo que sea" se esforzará en escribir el correo bien.

Es bueno realizar algunas comprobaciones, que haya un nombre, la @ y despues algo más. Pero ya está. No nos compliquemos la vida.

Se envia el correo, y si se produce un fallo, (porque el correo no existe) pues se informa a posteriori.

Un saludo

AGAG4 26-05-2005 19:55:58

ok
 
Pues lo que quiero es que sea Valida, es decir, que la Cuenta de Correo este activa en el servidor del correo del destinatario....

Ya ven que cuando envian un EMAIL con un correo Incorrecto del Destinatario, al mandarlo te dice el Servidor de Correo, Cuenta de Correo No Existe....

Gracias por sus respuestas....

JXJ 26-05-2005 20:47:06

Pues retomando lo que dice. Lepe.

Se envia el correo, y si se produce un fallo, (porque el correo no existe) pues se informa a posteriori.

He tenido la curiosidad de hacer lo que dices AgAg4, pero hay algunos
problemas que he tenido para dejarlo en paz.
se puede hacer lo que pides.
he aqui algunos de los problemas.


Algunos servidores. de cuando en cuando, el correo que envias tarda en llegar
al servidor. de segundos a minutos.

hay servidores que aunque la cuenta de correo, no exista. reciben el correo
y no dan respuesta de que esa cuenta de correo, no existe. no te mandan
un dalivery notification faillure o similar.


y el codigo puesto solo es una pequeña ayuda,.
al estilo de las ayudas que se dan en el foro, no se tiene el tiempo suficiente para
andar codificando para otro. o unos no quieren compartir, todo el codigo.
si no que prefieren que aprendamos. desde cosas sencillas, pero funcionales.
o como yo que mi nivel es de menos termino medio - hacia abajo.
no podemos poner codigo en poco tiempo, que maneje todas las posibles excepciones.
a un correo bien escrito
Personalmente me tardo.


¿si crees que esos casos, van a pasar donde hay caracteres especiales,?
pues solo codificas.

AGAG4 27-05-2005 02:49:27

ok
 
Gracias JXJ por su respuesta, tiene muchísima razón con respecto a sus comentarios sobre el regreso de respuesta por parte del servidor de correo, he investigado un poco y me he percatado que no va hacer muy exacto el monitoreo de envios de EMAILS a Direcciones Incorrectas, pero en fin algo saldrá más preciso.... de ante mano gracias ...

Que tengan buen día.

S.M.S. 27-05-2005 11:47:52

Yo utilizo la siguiente función que no recuerdo de donde la saqué, pero que funciona perfectamente con los ejemplos de jachguate y de roman

Código Delphi [-]
function ValidEmail(email: string): boolean;
   // Devuelve True si la dirección de email es válida
   const
     // Caracteres válidos en un "átomo"
     atom_chars = [#33..#255] - ['(', ')', '<', '>', '@', ',', ';', 
     ':', '\', '/', '"', '.', '[', ']', #127];
     // Caracteres válidos en una "cadena-entrecomillada"
     quoted_string_chars = [#0..#255] - ['"', #13, '\'];
     // Caracteres válidos en un subdominio
     letters = ['A'..'Z', 'a'..'z'];
     letters_digits = ['0'..'9', 'A'..'Z', 'a'..'z'];
     subdomain_chars = ['-', '0'..'9', 'A'..'Z', 'a'..'z'];
   type
     States = (STATE_BEGIN, STATE_ATOM, STATE_QTEXT,
     STATE_QCHAR, STATE_QUOTE, STATE_LOCAL_PERIOD,
     STATE_EXPECTING_SUBDOMAIN, STATE_SUBDOMAIN, STATE_HYPHEN);
   var
     State: States;
     i, n, subdomains: integer;
     c: char;
begin 
  State := STATE_BEGIN;
  n := Length(email); 
  i := 1;
  subdomains := 1; 
  while (i <= n) do 
    begin
      c := email[i];
      case State of 
         STATE_BEGIN: 
                  if c in atom_chars then
                  State := STATE_ATOM 
                  else if c = '"' then 
                  State := STATE_QTEXT
                  else break;
         STATE_ATOM:
                  if c = '@' then
                  State := STATE_EXPECTING_SUBDOMAIN
                  else if c = '.' then 
                  State := STATE_LOCAL_PERIOD
                  else if not (c in atom_chars) then 
                  break; 
         STATE_QTEXT:
                  if c = '\' then
                  State := STATE_QCHAR 
                  else if c = '"' then
                  State := STATE_QUOTE 
                  else if not (c in quoted_string_chars) then 
                  break; 
         STATE_QCHAR:   
                  State := STATE_QTEXT; 
         STATE_QUOTE:
                  if c = '@' then 
                  State := STATE_EXPECTING_SUBDOMAIN
                  else if c = '.' then
                  State := STATE_LOCAL_PERIOD 
                  else break; 
         STATE_LOCAL_PERIOD:
                  if c in atom_chars then
                  State := STATE_ATOM 
                  else if c = '"' then 
                  State := STATE_QTEXT
                              else break; 
         STATE_EXPECTING_SUBDOMAIN: 
                  if c in letters then
                  State := STATE_SUBDOMAIN 
                  else break;
         STATE_SUBDOMAIN:
                  if c = '.' then
                  begin 
                      inc(subdomains);
                      State := STATE_EXPECTING_SUBDOMAIN
                  end
                  else if c = '-' then 
                  State := STATE_HYPHEN
                  else if not (c in letters_digits) then 
                  break;
         STATE_HYPHEN:
                  if c in letters_digits then
                  State := STATE_SUBDOMAIN
                  else if c <> '-' then break;
      end;
      inc(i);
    end;
  if i <= n then
  Result := False
  else
  Result := (State = STATE_SUBDOMAIN) and (subdomains >= 2);
end;
Saludos.

johncook 27-05-2005 13:48:18

Muchachos, muchachos... Tanto lío para validar un mail...
Porque mejor no valernos de expresiones regulares, no? En C# no hay q instalar ninguna libreria de terceros para el uso de éstas expresiones... En delphi yo utilizo RegExpr, porque desconozco si existe alguna función nativa del lenguaje...
Código Delphi [-]
 uses RegExpr;
 
procedure TForm1.Button1Click(Sender: TObject);
// Valida la dirección de email en Edit1
begin
  if not ExecRegExpr('[\w\d\-\.]+@[\w\d\-]+(\.[\w\d\-]+)+',
      Edit1.Text) then begin
    ShowMessage('La dirección de email no es válida');
    Edit1.SetFocus;
  end else
    ShowMessage('La dirección de email es válida');
end;
Les dejo el enlace

__hector 27-05-2005 15:54:47

Puedes conectarte al servidor smtp del dominio al que quieres mandar el mail, y con un par de comandos, puedes saber si esa cuenta existe en dicho servidor. Digo, si te refieres a validar que existe, y no exactamente a validar la sintaxis de la direccion.

AGAG4 27-05-2005 16:23:15

oki
 
Muchas Gracias por sus respuestas, estoy tomando en cuenta todas sus opiniones, Que Tengan Buen Día....!!!!

JXJ 28-05-2005 00:39:56

johncook

Una busqueda rapida, me llevo a sitios
Pero ya estan muertos.

¿¿Cual es el enlace. ??

gracias.

jachguate 28-05-2005 01:00:52

Con la ayuda de algunos trucos, he llegado al nuevo sitio oficial de TRegExpr para delphi

Hasta luego.

;)

johncook 28-05-2005 05:42:13

Sorry, se me olvidó el enlace.... Pero es el que puso el amigo jachguate.. Gracias. Saludos.

AGAG4 28-05-2005 21:31:25

oki
 
Gracias por sus respuestas....

Que Tengan Buen Día....

ContraVeneno 26-07-2005 20:40:51

Pues por más que le busque no pude utilizar el componete TRegExpr..
En las notas de instalación menciona que hay que agregar el .pas al proyecto y y agregar el Unit RegExpr, pero cuando hice eso, me marco que el archivo RegExp.dcu no existe, y en efecto, no existía, hasta que lo compile y por fin aparecio el archivo .dcu el problema luego fue que no lo encontraba, así que agregue el directorio en Enviroment Options - Lybrary pero entonces al tratar de correr uno de los demos me marca la excepcion EIOInputError....
en fin, el punto es que no pude hacer que funcionara, supongo que la forma de instalarlo es lo que me esta fallando. Si alguien tiene alguna pista o una idea para poder instalar el RegExpr se los agradecíra mucho.

Trabajo con D5 con UpdatePack 1 (6.18)

German 27-07-2005 11:47:44

Las librerias de Synapse tienen una funcion para chequear si una dirección de email existe directamente (http://www.ararat.cz/synapse/). La función mailcheck(Email) devuelve un valor, que indica lo siguiente:

0 - La direccion existe
1 - La direccion "podría" existir
2 - La DNS no funciona
3 - La DNS no está definida
4 - No se ha conectado con ningun servidor MX
5 - El dominio no contiene ningun registro MX
6 - La direccion no existe
7 - La direccion es incorrecta (supongo que esta es la que buscais)

Salu2.

ContraVeneno 29-07-2005 00:31:35

Grax German
pero realmente estoy interesado en las Regexpr, ya que quiero validar que se escriba correctamente un Mail o un teléfono (para este último podría usar un maskedit... ya veremos)

Alguien ya instaló las RegExpr??? :confused:

Lepe 29-07-2005 10:39:37

Pues yo me he bajado esa libreria y tiene muy buena pinta; lo que mas me ha gustado: es libre.

Además son clases, nada de andar instalando en delphi..... solo añadir el library path y corriendo que es gerundio.

Asias German.

dec 16-10-2007 08:38:16

Hola pataliebres,

Revivo este hilo porque estoy interesado en conocer un método para validar si una dirección de correo es válida y existe realmente. Respecto de conocer si es válida puedo usar alguna función de las que se ha mostrado en este hilo, sin embargo, el compañero Héctor dice que es posible, mediante una comunicación con el servidor SMTP, conocer si una dirección de correo existe realmente ahí.

Pero... no se me ocurre qué comandos habría que usar en el Servidor SMTP... y en todo caso quiero revivir este hilo para replantear la pregunta, ¿cómo es posible validar una dirección de correo electrónico? No ya comprobar que esta es válida "sintácticamente" hablando, sino que realmente es una dirección de correo que existe en un determinado servidor, o que no lo es.

Yo estoy investigando un poco por Google, y también voy a seguir buscando en estos Foros, pero, si alguien se ha pegado con este asunto y quiere exponer por aquí sus resultados... le estaría muy agradecido, como no puede ser de otro modo. Así que lo dicho, gracias de antemano y que tengáis un buen día. :)

PD. Descargué la librería Synapse que propone el compañero Germán, para buscar la función "mailcheck" y ver cómo realiza su trabajo, pero, debe ser que hayan quitado esa función de donde estuviera, porque no he sido capaz de encontrarla... y parece interesante. :)

dec 16-10-2007 09:31:05

Hola,

Voy a tratar de responderme a mí mismo... por si puede ayudar a alguien, o alguien puede decir algo a partir de aquí. El caso es que validar direcciones de correo no parece nada sencillo, por varios motivos.

Pensando en un software que fuera capaz de validar direcciones de correo (y parece que existen) este se toparía con no pocos problemas. Validar la dirección de correo "sintácticamente" no parece imposible. Valga como ejemplo la función que se muestra en este hilo, recogida, como esta otra, de Delphi 3000.

Ahora bien, una cosa es validar una dirección de correo sintácticamente y otra muy distinta validar que una dirección de correo existe realmente en un determinado servidor. Comienzan los problemas. Primero que nada habría que averiguar, a partir de una dirección de correo, el servidor SMTP correspondiente.

Esto no parece imposible, si bien no es un asunto sencillo, o a lo menos yo me pierdo bastante, pues hablamos de localizar registros MX, servidores DNS... y todo esto me queda un poco grande, para qué nos vamos a engañanar. Pero, supongamos que hemos conseguido un servidor SMTP al que supuestamente pertenecería una determinada dirección de correo.

Bien. Ya tenemos el Servidor SMTP. ¿Cómo podemos solicitarle que nos diga si un "recipiente" es válido? Pues con el comando "RCPT TO", tal como se puede ver en esta página Web, donde muestran el uso de dicho comando y de algunos otros más.

Sin embargo, no todos los servidores SMTP parecen responder al comando de la misma forma. Por ejemplo, haciendo pruebas con el servidor SMTP de Wanadoo.es, resulta que este me responde que no estoy utilizando el comando correctamente, pero, yo lo uso como se supone que hay que hacerlo... luego no hay forma de que este servidor SMTP y yo podamos entendernos.

Eso, por un lado. Es decir, distintos servidores SMTP pueden entender distintas formas de comunicación, tratar de forma diferente ciertos comandos, etc. Pero, vamos con más problemas. ¿Qué pasa si quiero validar una dirección de correo de Gmail, por ejemplo? Pues que no podré hacerlo sin más, puesto que necesitaré antes autenticarme en el servidor SMTP de Gmail, que no admite comunicaciones si previamente no te autentificas.

Es decir, por un lado tenemos que no todos los servidores SMTP van a poder responder a nuestras cuitas; que no todos los servidores SMTP esperan los mismos comandos ni responden de igual forma a estos; y que los servidores SMTP que requieran autenticación... no van a responder a nuestros comandos a no ser que nos autentiquemos como usuarios de dicho servidor SMTP.

La conclusión es clara: validar una dirección de correo de modo que podamos considerarla válida sintácticamente hablando, es posible. Pero, validar que una dirección de correo exista realmente... se antoja complicado, poco seguro, muy expuesto a errores de todo tipo. Ahora bien... existen programas que prometen hacer esto... ¿estoy diciendo que estos programas no funcionan?

Bueno. Tal vez podría decirse que en ningún caso funcionarán en un cien por cien de los casos. Los programas tratarán de hacer su trabajo lo mejor posible, pero, ¿cómo conseguirá saber un programa de estos que una dirección de Gmail es válida? ¿Cómo lo hará si no puede autentificarse en el servidor? A mí no se me ocurre la forma de hacerlo. Es decir, se me ocurre que contaran con una cuenta en Gmail... para estos casos, pero, ¿y qué ocurre con otros servidores SMTP? ¿Tendrán cuentas para todos ellos? Es imposible.

Así que... me he hinchado a buscar en Google y la información que encuentro no me llega sino a lo que he dicho. Si alguien tuviera otro tipo de información o pudiera rebatir algo de lo que he dicho, o pudiera ofrecer otra opinión, en fin, yo estaría encantado de escucharla y de atender a la misma. Pero, hasta que no se me demuestre lo contrario, no creo que exista una forma segura y cien por cien eficaz de averiguar si una dirección de correo existe realmente.

PD. ¿Entonces cómo hacen los Spammers? Según lo que he dicho... probablemente estos no comprueban si sus direcciones de correo son válidas (de ahí que se recomiende no responder jamás a un Spammer... porque si lo haces estás diciéndole, "eh, realmente estoy aquí"). Sino que se limitarán a enviar correos y más correos sabiendo que algunos, efectivamente, no llegarán a su destino. Entre otras cosas porque la dirección de correo de marras no exista realmente.

JuanErasmo 17-10-2007 23:44:06

Utiliza un Web Service!
 
Hola amigos, me encontre este web service muy facil de utilizar e improtar en C++ Builder 6.0, a lo mejor lo tiene Delphi.

se usa en 1 linea de codigo! te devuelve si existe o no....

curioso no?

mira el WSDL aqui en este http.

http://wavendon.dsdata.co.uk/axis/se...ilChecker?wsdl

lo importas, invocas el metodo y ya esta!


lo mejor,,,,es gratisssssss..

Gracias!

JuanErasmo 17-10-2007 23:54:35

http://www.devv.com/webservices/authemail/?wsdl
 
http://www.devv.com/webservices/authemail/?wsdl

este si funciona todavia :D

en un hilo que recien hice post, interactuando con las paginas web tambien se podria,,pero no se como, el caso del web service es la solucion que propongo
:D

mario2000 19-02-2010 22:54:25

El tema tendra tiempo pero me interesa, una sugerencia para los programadores, cuando uno se va a registrar en un sistema de correo, este verifica si la direccion esta en uso osea no te deja crearla, ahora yo pienso que esto se puede usar para comprobar la existencia de la casilla de correo, ;) no se ud ustedes que opinan :confused:

jachguate 19-02-2010 23:37:58

@Mario2000: Eso supone un nível de acceso que difícilmente estará disponible para tu programa, no así para el que usa el administrador del correo, que tendrá acceso a la base de datos interna del servidor.

¿Cómo podrías saber si la cuenta xxx@ejemplo.com existe sin ser el administrador de ejemplo.com?

Por no entrar al tema de forwarders, catch-all y otras yerbas.

Por otro lado, suponiendo que hay unos 20 servidores de correo populares y unos cuantos miles no tan populares... supondría también un nível de especialización muy grande para una desarrollo que no vale tanto. No imagino a un cliente dispuesto a pagar tanto por una rutina que simplemente verifique si un correo es válido o no. Claro que este segundo punto es totalmente inválido a menos que tuvieras el acceso directo a la base de datos de cada dominio... cosa que no creo posible.

Un saludo.

ContraVeneno 20-02-2010 01:03:49

¿Cuanto tiempo pasa desde que yo mando un correo a una dirección que no es válida hasta que me llegue un mensaje de error diciendo que ese correo no pudo ser entregado?

¿vale la pena validar algo que se valida solo con el primer envio?

pnsd_89 19-07-2011 18:36:48

buscando y buscando y buscando.... encontre esto el exe que presenta funciona ahora como lo hace nose lo voy a mirar :D

http://www.ajpdsoft.com/modules.php?...rticle&sid=414

el codigo fuente se puede descargar :D


La franja horaria es GMT +2. Ahora son las 06:58:44.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi