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?
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?
Câu trả lời:
Đô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:
Bạn có thể kết nối với máy chủ và ra VRFY
lệ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
Bạn có thể phát hành một RCPT
và 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.
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
, fwrite
và fread
để 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");
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.
Không hẳn ..... Một số máy chủ có thể không kiểm tra "rcpt to:"
http://www.freesoft.org/CIE/RFC/1123/92.htm
Làm như vậy là rủi ro bảo mật .....
Nếu máy chủ làm vậy, bạn có thể viết một bot để khám phá mọi địa chỉ trên máy chủ ....
Đ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ệ.
Một số vấn đề:
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 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.
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.
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
}
}
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.
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.
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 đó.
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.com
sẽ 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 ý.
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.
Đ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.
Đâ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 DSN
thô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!
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.
<?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";
?>