Làm thế nào để kiểm tra xem một địa chỉ email có tồn tại mà không cần gửi email?


123

Tôi đã tìm thấy mã PHP này để kiểm tra địa chỉ email bằng SMTP mà không cần gửi email .

Có ai đã thử bất cứ điều gì tương tự hoặc nó làm việc cho bạn? Bạn có thể cho biết liệu email khách hàng / người dùng nhập có đúng và tồn tại không?



2
Chỉ tự hỏi, tại sao cái này lại có thẻ Telnet?
Piccolo

2
Có một thư viện PHP thực hiện chính xác điều đó: github.com/kickboxio/kickbox-php
Dan

Kickbox không miễn phí. API này chỉ là một trình bao bọc để kết nối với dịch vụ của họ.
Ashit Vora

Câu trả lời:


92

Đôi khi bạn có thể sử dụng hai phương pháp để xác định xem người nhận có thực sự tồn tại hay không:

  1. Bạn có thể kết nối với máy chủ và ra VRFYlệnh. Rất ít máy chủ hỗ trợ lệnh này, nhưng nó được thiết kế cho chính xác điều này. Nếu máy chủ phản hồi bằng DSN 2.0.0, người dùng tồn tại.

    VRFY user
  2. Bạn có thể phát hành một RCPTvà xem liệu thư có bị từ chối hay không.

    MAIL FROM:<>
    RCPT TO:<user@domain>
    

Nếu người dùng không tồn tại, bạn sẽ nhận được DSN 5.1.1. Tuy nhiên, chỉ vì email không bị từ chối, không có nghĩa là người dùng tồn tại. Một số máy chủ sẽ âm thầm loại bỏ các yêu cầu như thế này để ngăn chặn việc liệt kê người dùng của họ. Các máy chủ khác không thể xác minh người dùng và phải chấp nhận thông báo bất kể.

Ngoài ra còn có một kỹ thuật chống thư rác được gọi là greylisting, sẽ khiến máy chủ từ chối địa chỉ ban đầu, hy vọng một máy chủ SMTP thực sẽ cố gắng gửi lại một thời gian sau. Điều này sẽ làm xáo trộn các nỗ lực xác thực địa chỉ.

Thành thật mà nói, nếu bạn đang cố gắng xác thực một địa chỉ, cách tốt nhất là sử dụng một regex đơn giản để chặn các địa chỉ rõ ràng không hợp lệ và sau đó gửi một email thực có liên kết trở lại hệ thống của bạn để xác thực email đã nhận được. Điều này cũng đảm bảo rằng người dùng của họ đã nhập email thực của họ, không một lỗi đánh máy nhỏ nào xảy ra là của người khác.


10
Một số máy chủ thậm chí sẽ chấp nhận thư nhưng sau đó gửi lại thông báo lỗi cho người gửi phong bì, đặc biệt nếu tổ chức đó là một tổ chức lớn với nhiều phòng ban nội bộ có máy chủ thư riêng của họ. Máy chủ biên giới thậm chí có thể không biết tất cả các tài khoản bên trong.
David Mårtensson

3
Vậy tại sao những kẻ gửi thư rác không sử dụng phương pháp này để xác minh các địa chỉ email? Ý tôi là thực tế là những phương pháp này được hỗ trợ bởi rất ít máy chủ. Hay là họ?
Shahriyar Imanov

7
@Shehi: Trên thực tế, những kẻ gửi thư rác có thể sử dụng phương pháp này, điều đó thật khó nói. Tuy nhiên, vì những kẻ gửi thư rác có thể sử dụng nó, hầu như tất cả các máy chủ thư đều vô hiệu hóa VRFY, vì vậy trong thực tế, VRFY có thể vô dụng.
sleske

2
Bạn có thể đưa ra một ví dụ mã về cách sử dụng RCPT TO: <user @ domain> không? Cảm ơn
Papa De Beau

4
Để VRFY, thích ứng gmail "Gửi một số thư, tôi sẽ cố gắng tốt nhất của tôi" ;-)
Armel Larcier

46

Các câu trả lời khác ở đây thảo luận về các vấn đề khác nhau khi cố gắng thực hiện điều này. Tôi nghĩ tôi sẽ chỉ cho bạn cách bạn có thể thử điều này trong trường hợp bạn muốn tự học bằng cách tự làm.

Bạn có thể kết nối với máy chủ thư qua telnet để hỏi xem địa chỉ email có tồn tại hay không. Đây là một ví dụ về việc kiểm tra một địa chỉ email cho stackoverflow.com:

C: \> nslookup -q = mx stackoverflow.com
Câu trả lời không có thẩm quyền:
stackoverflow.com MX tùy chọn = 40, bộ trao đổi thư = STACKOVERFLOW.COM.S9B2.PSMTP.com
stackoverflow.com MX tùy chọn = 10, bộ trao đổi thư = STACKOVERFLOW.COM.S9A1.PSMTP.com
stackoverflow.com MX tùy chọn = 20, bộ trao đổi thư = STACKOVERFLOW.COM.S9A2.PSMTP.com
stackoverflow.com MX tùy chọn = 30, bộ trao đổi thư = STACKOVERFLOW.COM.S9B1.PSMTP.com

C: \> telnet STACKOVERFLOW.COM.S9A1.PSMTP.com 25
220 Postini ESMTP 213 y6_35_0c4 đã sẵn sàng. Bộ luật Kinh doanh và Nghề nghiệp CA Phần 17538.45 cấm sử dụng hệ thống này cho các quảng cáo qua thư điện tử không được yêu cầu.

helo xin chào
250 Postini nói xin chào trở lại

thư từ: <me@myhost.com>
250 Ok

rcpt tới: <fake@stackoverflow.com>
550-5.1.1 Tài khoản email mà bạn đã cố gắng truy cập không tồn tại. Vui lòng thử
550-5.1.1 kiểm tra kỹ địa chỉ email của người nhận để tìm lỗi chính tả hoặc
550-5.1.1 khoảng trắng không cần thiết. Tìm hiểu thêm tại
550 5.1.1 http://mail.google.com/support/bin/answer.py?answer=6596 w41si3198459wfd.71

Các dòng có tiền tố là mã số là phản hồi từ máy chủ SMTP. Tôi đã thêm một số dòng trống để làm cho nó dễ đọc hơn.

Nhiều máy chủ thư sẽ không trả lại thông tin này như một phương tiện để ngăn chặn việc thu thập địa chỉ email bởi những kẻ gửi thư rác, vì vậy bạn không thể dựa vào kỹ thuật này. Tuy nhiên, bạn có thể thành công trong việc loại bỏ một số địa chỉ email rõ ràng là xấu bằng cách phát hiện máy chủ thư không hợp lệ hoặc địa chỉ người nhận bị từ chối như trên.

Cũng lưu ý rằng các máy chủ thư có thể đưa bạn vào danh sách đen nếu bạn thực hiện quá nhiều yêu cầu từ chúng.


Trong PHP Tôi tin rằng bạn có thể sử dụng fsockopen, fwritefreadđể thực hiện các bước trên lập trình:

$smtp_server = fsockopen("STACKOVERFLOW.COM.S9A1.PSMTP.com", 25, $errno, $errstr, 30);
fwrite($smtp_server, "helo hi\r\n");
fwrite($smtp_server, "mail from: <me@myhost.com>\r\n");
fwrite($smtp_server, "rcpt to: <fake@stackoverflow.com>\r\n");

đội nón ra đi! một vấn đề tôi tìm thấy là, cổng 25 luôn hoạt động với bản ghi mx ưu tiên thấp ??
Dhruvenkumar Shah

@DhruvenkumarShah, xin lỗi tôi không biết. Nếu bạn phát hiện ra, hãy comment lại.
Drew Noakes

Xin chào, tôi vừa cố gắng cho tài khoản trường đại học của riêng mình để tìm hiểu tất cả về bản ghi MX nhưng nó không hoạt động trong 25 .. nhưng loại trang web verify-email.org trực tuyến đã hoạt động .. cách họ làm việc đó .. tôi sẽ cho bạn biết về nó nếu tôi tìm thấy nó ra
Dhruvenkumar Shah

1
@DhruvenkumarShah nó cung cấp một vài tên máy chủ trao đổi thư. xem câu trả lời cho người trao đổi thư. vì vậy nếu một cái không thành công, cái khác trong danh sách sẽ hoạt động.
Janaka R Rajapaksha

thực sự rất giúp đầy đủ để mee .. cảm ơn bạn sir..i thử nó trong putty và hoạt động giống như nét quyến rũ .. nhờ ..
Mohammed Sufian

8

Câu trả lời chung là bạn không thể kiểm tra xem một địa chỉ email có tồn tại sự kiện hay không nếu bạn gửi email đến địa chỉ đó: nó có thể đi vào một lỗ đen.

Điều đó đang được nói rằng phương pháp được mô tả ở đó là khá hiệu quả. Nó được sử dụng trong mã sản xuất trong ZoneCheck ngoại trừ việc nó sử dụng RSET thay vì QUIT.

Nơi mà người dùng tương tác với hộp thư của anh ta không quá nhiều, nhiều trang web thực sự kiểm tra xem thư có đến nơi nào đó bằng cách gửi một số bí mật phải được gửi lại cho người phát (bằng cách truy cập URL bí mật hoặc gửi lại số bí mật này qua email). Hầu hết các danh sách gửi thư đều hoạt động như vậy.



6

Điều này sẽ không thành công (trong số các trường hợp khác) khi máy chủ thư mục tiêu sử dụng danh sách xám.

Greylisting : Máy chủ SMTP từ chối phân phối lần đầu tiên một máy khách không xác định trước đó kết nối, cho phép (các) lần tiếp theo; điều này giúp ngăn chặn một số phần trăm spam bots, đồng thời cho phép sử dụng hợp pháp - vì dự kiến ​​người gửi thư hợp pháp sẽ thử lại , đó là điều mà các đại lý chuyển thư bình thường sẽ làm.

Tuy nhiên, nếu mã của bạn chỉ kiểm tra trên máy chủ một lần , máy chủ có greylisting sẽ từ chối phân phối (vì máy khách của bạn đang kết nối lần đầu tiên); trừ khi bạn kiểm tra lại sau một thời gian ngắn, bạn có thể từ chối sai các địa chỉ e-mail hợp lệ.


(kinh nghiệm cá nhân: Tôi đã phải tranh luận qua lại với nhà cung cấp dịch vụ e-mail của mình rằng , tôi biết mình đang làm gì và vâng , tôi cần tắt danh sách xám - vì những lần kiểm tra này từ dịch vụ của bên thứ ba không thành công )
Piskvor rời tòa nhà vào

4

Một số vấn đề:

  1. Tôi chắc chắn rằng một số máy chủ SMTP sẽ cho bạn biết ngay lập tức nếu địa chỉ bạn cung cấp cho chúng không tồn tại, nhưng một số thì không phải là một biện pháp bảo mật. Họ sẽ chỉ chấp nhận bất kỳ địa chỉ nào bạn cung cấp cho họ và im lặng bỏ qua những địa chỉ không tồn tại.
  2. Như bài báo nói, nếu bạn làm điều này quá thường xuyên với một số máy chủ, chúng sẽ đưa bạn vào danh sách đen.
  3. Đối với một số máy chủ SMTP (như gmail), bạn cần sử dụng SSL để thực hiện bất kỳ điều gì. Điều này chỉ đúng khi sử dụng máy chủ SMTP của gmail để gửi email.

Về điểm thứ ba, điều này chỉ xảy ra nếu bạn muốn sử dụng nó như một rơle. Tôi không biết bất kỳ trình trao đổi thư nào yêu cầu SSL. Nếu có điều này, họ sẽ ngừng nhận email từ nhiều người dùng.
kmkaplan 19/02/09

Xin lỗi, là lỗi của tôi. Nếu bạn muốn gửi email bằng máy chủ SMTP của gmail, bạn phải sử dụng SSL.
Graeme Perrow

3

Mặc dù câu hỏi này hơi cũ nhưng mẹo dịch vụ này có thể giúp người dùng đang tìm kiếm giải pháp tương tự kiểm tra địa chỉ email ngoài xác thực cú pháp trước khi gửi.

Tôi đã sử dụng dịch vụ nguồn mở này để xác thực sâu hơn các email (kiểm tra các bản ghi mx trên miền địa chỉ e-mail, v.v.) cho một vài dự án có kết quả tốt. Nó cũng kiểm tra phù thủy lỗi chính tả phổ biến khá hữu ích. Demo tại đây .


Bạn khẳng định dịch vụ này là nguồn mở. Bạn có thể cung cấp liên kết đến nguồn không?
amaurymartiny

Tôi xin lỗi @amaurymartiny, tôi không thể. Tại thời điểm viết bài, dự án Mailgun là mã nguồn mở nếu tôi nhớ chính xác nhưng tôi không thể tìm thấy liên kết đến bất kỳ kho lưu trữ nào cung cấp nguồn sau lần thứ nhất.
Henkealg

2

"Bạn có thể cho biết liệu email khách hàng / người dùng nhập có đúng và tồn tại không?"

Thực ra đây là hai thứ riêng biệt. Nó có thể tồn tại nhưng có thể không đúng.

Đôi khi bạn phải lấy đầu vào của người dùng ở mệnh giá. Có nhiều cách để đánh bại hệ thống.


2
+1 Bạn không bao giờ có thể chắc chắn rằng nó là chính xác nếu không gửi email và thực sự nhận được phản hồi của con người cho nó, chẳng hạn như nhấp vào một liên kết.
Daniel Daranas

bạn có thể giữ một liên kết (đối với hình ảnh, v.v.) trong nội dung email và đếm từng lượt tải cho liên kết đó. không cần phải chờ đợi cho các nhấp chuột
Janaka R Rajapaksha

2

Tất cả những gì bạn có thể làm là tìm kiếm DNS và đảm bảo miền có trong địa chỉ email có bản ghi MX, ngoài ra không có cách nào đáng tin cậy để giải quyết vấn đề này.

Một số máy chủ có thể hoạt động với phương thức rcpt-to nơi bạn nói chuyện với máy chủ SMTP, nhưng nó phụ thuộc hoàn toàn vào cấu hình của máy chủ. Một vấn đề khác có thể là máy chủ quá tải có thể trả về mã 550 cho biết người dùng không xác định được, nhưng đây là lỗi tạm thời, có lỗi vĩnh viễn (tôi nghĩ là 451?) Có thể được trả lại. Điều này hoàn toàn phụ thuộc vào cấu hình của máy chủ.

Cá nhân tôi sẽ kiểm tra bản ghi DNS MX, sau đó gửi xác minh qua email nếu bản ghi MX tồn tại.


2
function EmailValidation($email)
{
    $email = htmlspecialchars(stripslashes(strip_tags($email))); //parse unnecessary characters to prevent exploits
    if (eregi('[a-z||0-9]@[a-z||0-9].[a-z]', $email)) {
        //checks to make sure the email address is in a valid format
        $domain = explode( "@", $email ); //get the domain name
        if (@fsockopen ($domain[1],80,$errno,$errstr,3)) {
            //if the connection can be established, the email address is probably valid
            echo "Domain Name is valid ";
            return true;
        } else {
            echo "Con not a email domian";
            return false; //if a connection cannot be established return false
        }
        return false; //if email address is an invalid format return false
    }
}

1
cổng 80 không có ý nghĩa
jrosell

5
Tôi nghĩ đó chỉ là kiểm tra tên miền tồn tại chứ không phải kiểm tra chính email.
The Angry Saxon

Điều này có thể hữu ích hơn:getmxrr
jchook

1

Giả sử đó là địa chỉ của người dùng , một số máy chủ thư cho phép lệnh SMTP VRFY thực sự xác minh địa chỉ email dựa trên các hộp thư của nó. Hầu hết các trang web lớn sẽ không cung cấp cho bạn nhiều thông tin; phản hồi của gmail là "nếu bạn cố gửi nó qua thư, chúng tôi sẽ cố gắng gửi nó" hoặc một cái gì đó thông minh như vậy.


1

Tôi nghĩ rằng bạn không thể, có rất nhiều trường hợp mà ngay cả việc gửi e-mail cũng có thể bị lỗi. Ví dụ. máy chủ thư ở phía người dùng tạm thời ngừng hoạt động, hộp thư tồn tại nhưng bị đầy nên không thể gửi thư, v.v.

Đó có thể là lý do tại sao rất nhiều trang xác thực đăng ký sau khi người dùng xác nhận rằng họ đã nhận được e-mail xác nhận.


0

Tôi có thể xác nhận câu trả lời của Joseph và Drew để sử dụng RCTP TO: <address_to_check>. Tôi muốn thêm một số addenda nhỏ trên đầu các câu trả lời đó.

Nhà cung cấp nắm bắt tất cả

Một số nhà cung cấp thư thực hiện chính sách nhận tất cả, nghĩa là chính sách đó *@mydomain.comsẽ trả về giá trị dương cho RCTP TO:lệnh. Nhưng điều này không nhất thiết có nghĩa là hộp thư "tồn tại", như trong "thuộc về con người". Không có gì nhiều có thể được thực hiện ở đây, chỉ cần lưu ý.

IP Greylisting / Blacklist

Greylisting: Kết nối đầu tiên từ IP không xác định bị chặn. Giải pháp: thử lại ít nhất 2 lần.

Danh sách đen: nếu bạn gửi quá nhiều yêu cầu từ cùng một IP, IP này sẽ bị chặn. Giải pháp: sử dụng xoay vòng IP; Reacher sử dụng Tor.

Yêu cầu HTTP trên biểu mẫu đăng ký

Điều này rất cụ thể cho nhà cung cấp, nhưng đôi khi bạn có thể sử dụng các yêu cầu HTTP được tạo kỹ lưỡng và phân tích cú pháp phản hồi của các yêu cầu này để xem liệu tên người dùng đã được đăng ký hay chưa với nhà cung cấp này.

Đây là hàm liên quan từ một thư viện mã nguồn mở mà tôi đã viết để kiểm tra các *@yahoo.comđịa chỉ bằng cách sử dụng yêu cầu HTTP: check-if-email-being . Tôi biết mã của mình là Rust và chủ đề này được gắn thẻ PHP, nhưng các ý tưởng tương tự cũng được áp dụng.

Hộp thư đến đầy đủ

Đây có thể là một trường hợp phức tạp, nhưng khi người dùng có một hộp thư đến đầy, RCTP TO:sẽ trả lại 5.1.1 DSNthông báo lỗi cho biết nó đã đầy. Điều này có nghĩa là tài khoản thực sự tồn tại!

Tiết lộ

Tôi chạy Reacher , một API xác minh email theo thời gian thực. Mã của tôi được viết bằng Rust, và là mã nguồn mở 100%. Hãy kiểm tra nếu bạn muốn có một giải pháp mạnh mẽ hơn:

Github: https://github.com/amaurymartiny/check-if-email-exists

Với sự kết hợp của nhiều kỹ thuật khác nhau để vượt qua vòng lặp, tôi quản lý để xác minh khoảng 80% email mà khách hàng của tôi kiểm tra.


-8
<?php

   $email = "someone@exa mple.com";

   if(!filter_var($email, FILTER_VALIDATE_EMAIL))
      echo "E-mail is not valid";
   else
      echo "E-mail is valid";

?>

Người dùng đang yêu cầu giải pháp .Net không phải php.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.