web-dev-qa-db-ja.com

.netを使用してメールアドレスが存在するかどうかを確認できますか?

私は、受信箱にpingを送信して(メールを送信せずに)存在するかどうかを確認する方法のいくつかのphpの例を見てきました。これが.netで可能かどうか誰かが知っているのかと思っていましたか?それが私が自分のサイトを介してキャプチャしたメールのリストを一括チェックするアプリを書くつもりなら。

26
phil crowe

SMTPはこのためにVRFYコマンドを定義します ですが、スパマーによる悪用は正当な使用の数を完全に圧倒するため、事実上世界中のすべての電子メールサーバーが 嘘をつくように設定されています

45
Ben Voigt

「小切手メール」と書いたらどういう意味ですか?メールの所有者に固有のリンクを送信しないと、これを確認できません。確認できるのは、メールの構文と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);
}

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);
9
Svisstack

いいえ、言語に関係なく、メールが存在するかどうかを確認することは原則として不可能です。それを行うプロトコルはありません。

部分的な解決策はいくつかありますが、どれも信頼できません。

詳細は メールを送信せずにメールアドレスが存在するかどうかを確認する方法 を参照してください。

9
sleske

http://www.codicode.com/art/free_asp_net_email_validator_verifier.aspx 。コードへのdll参照を使用します。個人使用、再配布ともに無料です。実際にメールを送信することなく、ドメイン名の存在を確認します。

これは絶対確実ではありません。最善の方法は、構文をチェックして、ドメイン名が解決されるかどうかを確認することです。

メール構文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)))

0
Brad

1.次のコマンドを使用して、メールプロバイダーのMXレコードを取得します。

nslookup -type=mx gmail.com
  1. Tcpクライアントを呼び出して、メールが有効かどうかを確認します。

    private static void Main(string[] args)
    {            
      var gMail = IsEmailAccountValid("gmail-smtp-in.l.google.com", "[email protected]");
      Console.WriteLine($"Gmail account is valid - {gMail.ToString()}");
    
      var live = IsEmailAccountValid("live-com.olc.protection.Outlook.com", "[email protected]");
      Console.WriteLine($"Live account is valid - {live.ToString()}");
    }
    
    private static byte[] BytesFromString(string str)
    {
      return Encoding.ASCII.GetBytes(str);
    }
    
    private static int GetResponseCode(string ResponseString)
    {
      return int.Parse(ResponseString.Substring(0, 3));
    }
    
    private static bool IsEmailAccountValid(string tcpClient, string emailAddress)
    {
      TcpClient tClient = new TcpClient(tcpClient, 25);
      string CRLF = "\r\n";
      byte[] dataBuffer;
      string ResponseString;
      NetworkStream netStream = tClient.GetStream();
      StreamReader reader = new StreamReader(netStream);
      ResponseString = reader.ReadLine();
    
      /* Perform HELO to SMTP Server and get Response */
      dataBuffer = BytesFromString("HELO Hi" + CRLF);
      netStream.Write(dataBuffer, 0, dataBuffer.Length);
      ResponseString = reader.ReadLine();
      dataBuffer = BytesFromString("MAIL FROM:<[email protected]>" + CRLF);
      netStream.Write(dataBuffer, 0, dataBuffer.Length);
      ResponseString = reader.ReadLine();
    
      /* Read Response of the RCPT TO Message to know from google if it exist or not */
      dataBuffer = BytesFromString($"RCPT TO:<{emailAddress}>" + CRLF);
      netStream.Write(dataBuffer, 0, dataBuffer.Length);
      ResponseString = reader.ReadLine();
      var responseCode = GetResponseCode(ResponseString);
    
      if (responseCode == 550)
      {
        return false;
      }
    
      /* QUITE CONNECTION */
      dataBuffer = BytesFromString("QUITE" + CRLF);
      netStream.Write(dataBuffer, 0, dataBuffer.Length);
      tClient.Close();
      return true;
    }
    

MXレコードは、コードを使用して取得できます。

var lookup = new LookupClient();
var result = lookup.QueryAsync("gmail.com", QueryType.ANY).Result;
var domainName = result.Additionals[result.Additionals.Count - 1].DomainName.Value;

上記のコードを使用してMXルックアップを見つけ、そのMXルックアップを使用してメールが有効かどうかを確認します。

0
Nikheel