我在Linux服务器上有一个PHP脚本,需要确定电子邮件地址是真实的还是假的。
我正在尝试使用telnet,从expect脚本启动,但它不工作。
PHP脚本用法如下:
$retVal = shell_exec( "./atelnet.sh mailserver.net fake@example.com" ) ;
如果有任何帮助,或者有更好的方法,我将不胜感激。
谢谢。
到目前为止我写的是:
#!/usr/bin/expect
#
# name: atelnet.sh
# usage from php:
# $retVal = shell_exec( "./atelnet.sh mailserver.net fake@example.com" ) ;
#
# if goes wrong, the script will timeout in 20 seconds
set timeout 20
# first argument assigned to the variable "server"
set server [lindex $argv 0]
# second argument assigned to the variable "emailaddress"
set emailaddress [lindex $argv 1]
# spawn telnet and connect to variable "server" on port 25
spawn telnet $server 25
# script expects "220 ..." telnet from server, telnet login ok response
# actual response looks like:
# "220 mx.server.com ESMTP ni10si2925797obc.73 - gsmtp"
# or
# "220-host.server.com ESMTP Fri, 22 Mar 2013 01:48:03 -0000"
expect "220"
# script sends initial handshake greeting
send "HELO"
# script expects "250 ..." telnet from server, at-your-service ok response
# actual response looks like:
# "250 mx.server.com at your service"
# or
# "250 host.server.com Hello host.server.com [111.222.333.444]"
expect "250"
# script sends from: email address (any address is fine)
send "mail from:<a@b.com>"
# script expects "250 ..." telnet from server, ok acknowledgement of from:email
# actual response looks like:
# "250 2.1.0 OK v16si1294229qct.125 - gsmtp"
# or
# "250 OK"
expect "250"
# script sends query to the email address being tested
# PHP string cat syntax doesn't work !!!
# HOW ???
send "rcpt to:<" . $emailaddress . ">"
# script expects one of these:
# fake: "550-5.1.1 The email account that you tried to reach does not exist."
# or
# true: "250 Accepted"
# log server's response to file. HOW ???
编辑:我在下面添加我的PHP套接字代码,这似乎不工作:
$smtp_server = fsockopen( $mx_hostname, 25, $errno, $errstr, 30 ) ;
$ret1 = fwrite( $smtp_server, "helo hi'r'n" ) ;
$ret2 = fwrite( $smtp_server, "mail from: <a@b.org>'r'n" ) ;
$ret3 = fwrite( $smtp_server, "rcpt to: <" . $unk_email_address. ">'r'n" ) ;
如果对这段代码有任何想法,也欢迎。
谢谢。
我可以看到预期的用法,但是我想说,实际连接并启动与接收邮件服务器的握手有点过度。特别是在仍然不能保证它意味着用户存在的情况下。
您应该在此阶段之前检查MX记录,参见getmxrr
假设您已经检查并验证了它是一个有效的电子邮件字符串,我认为将它与额外的MX查找结合起来就足够了。
如果你仍然想这样做,我会用PHP套接字来实现它,而不是telnet。甚至可以使用expect扩展名,因为您已经开始了该路径。
其他的想法可以是在你的网站上有Facebook和Google oauth登录,如果它与更高质量的用户注册有关
您可以使用PHP过滤器来验证电子邮件:
http://php.net/manual/en/filter.filters.validate.php$email_a = 'user@example.com';
if (filter_var($email_a, FILTER_VALIDATE_EMAIL)) {
echo "This (email_a) email address is considered valid.";
}
发明轮子是没有意义的。
检查示例:Zend_Validate_EmailAddress
你甚至可以验证主机名和mx记录
$validator = new Zend_Validate_EmailAddress(
array(
'allow' => Zend_Validate_Hostname::ALLOW_DNS,
'mx' => true
)
);
,通过验证现有的域名和电子邮件地址格式,我想说它应该足够了。