SMTP 応答コードをインタラクティブに検証できる正規表現を作成しています。SMTP ダイアログが完了すると、次の正規表現が渡されます (読みやすくするためにいくつかの括弧が追加されています)。
^(220)(250){3,}(354)(250)(221)$
または(アウト)認証あり:
^(220)(250)((334){2}(235))?(250){2,}(354)(250)(221)$
上記の正規表現を書き直して、ダイアログが期待どおりに進んでいるかどうかをインタラクティブに確認できるようにしようとしています。そうでない場合は、丁寧にQUIT
コマンドを送信して接続を閉じ、帯域幅と時間を節約しますが、最適な正規表現を書くのに苦労しています. これまでのところ、私は思いつくことができました:
^(220(250(334(235(250(354(250(221)?)?)?){0,})?){0,2})?)?$
認証された接続のみを照合するだけでなく、いくつかのバグがあります...たとえば、次のように一致します。
220250334235250354250221
220250334334235250354250221
次の変更も試しました。
^(220(250)?)?((334(235)?){2})?(250(354(250(221)?)?)?){0,}$
これは認証されていない応答を受け入れますが、一致に失敗し220250334
、誤って一致します (応答コードの前に220250334334235250354250221
少なくとも 2 つ必要です)。250
354
誰かがこれで私を助けることができますか? 前もって感謝します。
私がやろうとしていることの例:
$smtp = fsockopen('mail.example.com', 25);
$result = null;
$commands = array('HELO', 'AUTH LOGIN', 'user', 'pass', 'MAIL FROM', 'RCPT TO', 'RCPT TO', 'DATA', "\r\n.", 'QUIT');
foreach ($commands as $command)
{
$result .= substr(fgets($smtp), 0, 3);
if (preg_match('~^(220(250)?)?((334){1,2}(235)?)?(250(354(250(221)?)?)?){0,}$~S', $result) > 0)
{
fwrite($smtp, $command . "\r\n");
}
else
{
fwrite($smtp, "QUIT\r\n");
fclose($smtp);
break;
}
}
これは、次の手続き型コードの代わりとして機能する必要があります。
$smtp = fsockopen('mail.example.com', 25);
$result = substr(fgets($smtp), 0, 3); // 220
if ($result == '220')
{
fwrite($smtp, 'HELO' . "\r\n");
$result = substr(fgets($smtp), 0, 3); // 220
if ($result == '250')
{
fwrite($smtp, 'AUTH LOGIN' . "\r\n");
$result = substr(fgets($smtp), 0, 3); // 334
if ($result == '334')
{
fwrite($smtp, 'user' . "\r\n");
$result = substr(fgets($smtp), 0, 3); // 334
if ($result == '334')
{
fwrite($smtp, 'pass' . "\r\n");
$result = substr(fgets($smtp), 0, 3); // 235
if ($result == '235')
{
fwrite($smtp, 'MAIL FROM' . "\r\n");
$result = substr(fgets($smtp), 0, 3); // 250
if ($result == '250')
{
foreach ($to as $mail)
{
fwrite($smtp, 'RCPT TO' . "\r\n");
$result = substr(fgets($smtp), 0, 3); // 250
if ($result != '250')
{
fwrite($smtp, 'QUIT' . "\r\n");
$result = substr(fgets($smtp), 0, 3); // 221
fclose($smtp);
break;
}
}
if ($result == '250')
{
fwrite($smtp, 'DATA' . "\r\n");
$result = substr(fgets($smtp), 0, 3); // 354
if ($result == '354')
{
fwrite($smtp, "\r\n.\r\n");
$result = substr(fgets($smtp), 0, 3); // 250
if ($result == '250')
{
fwrite($smtp, 'QUIT' . "\r\n");
$result = substr(fgets($smtp), 0, 3); // 221
fclose($smtp);
if ($result == '221')
{
echo 'SUCESS!';
}
}
else
{
fwrite($smtp, 'QUIT' . "\r\n");
$result = substr(fgets($smtp), 0, 3); // 221
fclose($smtp);
}
}
else
{
fwrite($smtp, 'QUIT' . "\r\n");
$result = substr(fgets($smtp), 0, 3); // 221
fclose($smtp);
}
}
}
else
{
fwrite($smtp, 'QUIT' . "\r\n");
$result = substr(fgets($smtp), 0, 3); // 221
fclose($smtp);
}
}
else
{
fwrite($smtp, 'QUIT' . "\r\n");
$result = substr(fgets($smtp), 0, 3); // 221
fclose($smtp);
}
}
else
{
fwrite($smtp, 'QUIT' . "\r\n");
$result = substr(fgets($smtp), 0, 3); // 221
fclose($smtp);
}
}
else
{
fwrite($smtp, 'QUIT' . "\r\n");
$result = substr(fgets($smtp), 0, 3); // 221
fclose($smtp);
}
}
else
{
fwrite($smtp, 'QUIT' . "\r\n");
$result = substr(fgets($smtp), 0, 3); // 221
fclose($smtp);
}
}
else
{
fwrite($smtp, 'QUIT' . "\r\n");
$result = substr(fgets($smtp), 0, 3); // 221
fclose($smtp);
}