2010-10-07 13 views
20

He visto algunos ejemplos php de cómo puede hacer ping a una bandeja de entrada (sin enviar ningún correo) para verificar si existe. Me preguntaba si alguien sabe si esto es posible con .net? Si voy a escribir una aplicación para hacer un control masivo de la lista de correos electrónicos que he capturado a través de mi sitio.¿Puedo verificar si existe una dirección de correo electrónico usando .net?

+10

No solo no es posible en .NET, no es remotamente posible en absoluto. –

+2

posible duplicado de [¿Cómo verificar si existe una dirección de correo electrónico sin enviar un correo electrónico?] (Http://stackoverflow.com/questions/565504/how-to-check-if-an-email-dress-exists-without- enviando un correo electrónico) –

+3

@Daniel, creo que eso es lo que phil quiere decir con "He visto algunos ejemplos de php", esta pregunta es sobre .NET. Por supuesto, "no hay una manera confiable" es la respuesta correcta independientemente del idioma. –

Respuesta

7

¿Qué quieres decir si escribes "consultar correo electrónico"? Sin enviar un enlace exclusivo para el propietario del correo electrónico, no puede verificarlo, solo puede verificar la sintaxis del correo electrónico y la conexión a smtp.

public static bool isEmail(string inputEmail) 
{ 
    inputEmail = NulltoString(inputEmail); 
    string strRegex = @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}" + 
     @"\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\" + 
     @".)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"; 
    Regex re = new Regex(strRegex); 
    if (re.IsMatch(inputEmail)) 
    return (true); 
    else 
    return (false); 
} 

comprobación SMTP

string[] host = (address.Split('@')); 
string hostname = host[1]; 

IPHostEntry IPhst = Dns.Resolve(hostname); 
IPEndPoint endPt = new IPEndPoint(IPhst.AddressList[0], 25); 
Socket s= new Socket(endPt.AddressFamily, 
     SocketType.Stream,ProtocolType.Tcp); 
s.Connect(endPt); 
+0

verifique mi respuesta para obtener más información comprobación de sintaxis exacta – Brad

+0

+1 para la resolución del nombre de host – Brad

+0

¿De dónde vino 'NulltoString'? – Dementic

0

Esto no es infalible. Lo mejor que puede hacer es verificar la sintaxis y ver si el nombre de dominio se resuelve.

Email sintaxis RegEx: (?<username>#?[_a-zA-Z0-9-+]+(\.[_a-zA-Z0-9-+]+)*)@(?<domain>[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.(([0-9]{1,3})|([a-zA-Z]{2,3})|(aero|arpa|asia|coop|info|jobs|mobi|museum|name|travel)))

+1

Bueno, no me cansé, pero podría ser porque la pregunta específicamente solicita una solución para hacer ping al servidor, no verificar la sintaxis. Tal vez la pregunta fue cambiada después de tu respuesta. –

41

SMTP defines the VRFY command for this, pero como el abuso por parte de los spammers abruma totalmente la cantidad de usos legítimos, prácticamente todos los servidores de correo electrónico del mundo son configured to lie.

+4

+1 para explicar exactamente por qué no hay una manera confiable de hacer lo que el OP quiere. En una nota personal, cualquier cosa que haga que el correo masivo sea más difícil es sin dudas algo bueno. –

+0

+1 dittoing @Joel – Brad

+0

@Joel: Bueno, * hay * correo masivo legítimo (listas de correo, etc.). Pero es cierto que la mayoría del correo masivo es ilegítimo, aunque eso es deplorable. – sleske

-2
protected bool checkDNS(string host, string recType = "MX") 
{ 
    bool result = false; 
    try 
    { 
     using (Process proc = new Process()) 
     { 
      proc.StartInfo.FileName = "nslookup"; 
      proc.StartInfo.Arguments = string.Format("-type={0} {1}", recType, host); 
      proc.StartInfo.CreateNoWindow = true; 
      proc.StartInfo.ErrorDialog = false; 
      proc.StartInfo.RedirectStandardError = true; 
      proc.StartInfo.RedirectStandardOutput = true; 
      proc.StartInfo.UseShellExecute = false; 
      proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
      proc.OutputDataReceived += (object sender, DataReceivedEventArgs e) => 
       { 
        if ((e.Data != null) && (!result)) 
         result = e.Data.StartsWith(host); 
       }; 
      proc.ErrorDataReceived += (object sender, DataReceivedEventArgs e) => 
       { 
        if (e.Data != null) 
        { 
         //read error output here, not sure what for? 
        } 
       }; 
      proc.Start(); 
      proc.BeginErrorReadLine(); 
      proc.BeginOutputReadLine(); 
      proc.WaitForExit(30000); //timeout after 30 seconds. 
     } 
    } 
    catch 
    { 
     result = false; 
    } 
    return result; 
} 
+0

Esto ha sido probado y está funcionando. Básicamente convertí el ejemplo de php. –

Cuestiones relacionadas