3

電子メール アドレスが本物か偽物かを判断する必要がある PHP スクリプトが Linux サーバー上にあります。

これには、expect スクリプトから起動された telnet を使用しようとしていますが、機能していません。

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" ) ;

このコードに関するアイデアも歓迎します。

ありがとうございました。

4

3 に答える 3

1

意図した使用方法はわかりますが、実際に受信者のメール サーバーに接続してハンドシェイクを開始するのは少しやり過ぎだと思います。特に、ユーザーが存在することを意味するという保証がまだないためです。

この段階の前に、MX レコードを確認する必要があります。getmxrr
を参照してください 。有効な電子メール文字列として確認済みであると仮定すると、追加の MX ルックアップと組み合わせれば十分です。

それでもやりたい場合は、telnet の代わりに PHP ソケットを使用して実装します。すでにそのパスを開始しているので、 expect 拡張機能を使用することさえあるかもしれません。

より質の高いユーザー サインアップに関連する場合は、Facebook と Google の oauth ログインをウェブサイトに持たせることも考えられます。

于 2013-03-22T23:59:24.220 に答える
0

車輪を発明しようとしても意味がありません。

例を確認してください: Zend_Validate_EmailAddress

ホスト名と mx レコードを検証することもできます

$validator = new Zend_Validate_EmailAddress(
    array(
        'allow' => Zend_Validate_Hostname::ALLOW_DNS,
        'mx'    => true
    )
);

そして、既存のドメインと電子メール アドレスの形式を検証することで、それで十分だと言えます。

于 2013-03-22T23:55:50.163 に答える
0

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.";
}
于 2013-03-23T00:00:25.180 に答える