Я пытаюсь сделать проверку почты, используя telnet и php. Весь процесс слова нормально в терминале, но когда я использую php shell_exec()
, он работает только до команды подключения Telnet. После подключения telnet остальные команды, специфичные для telnet, больше не работают.
Есть ли какой-то другой способ, которым мы должны выполнить telnet, используя php?
ОБНОВИТЬ: Я пытаюсь повторить этот руководство.
Вот мой код
public function mailtest(Request $request){
//Taking input email
$email = $request->input("email");
$divide = explode("@", $email);
//Find out the Domain
$server = $divide[1];
$response = shell_exec("nslookup -q=mx $server");
//Response of the nslookup
print_r($response);
$mailServerList = explode(PHP_EOL, $response);
$line = $mailServerList[4];
$serverArr = preg_split('/\s+/', $line);
$n = sizeof($serverArr);
$mailServer = $serverArr[$n-1];
//Printing out the mail server out of the nslookup response
print_r($mailServer);
//Executing Telnet command
$telnet = shell_exec("telnet $mailServer 25");
print_r("telnet response ".$telnet);
//Telnet Helo
$helo = shell_exec("Helo testing.com");
print_r("Helo response ".$helo);
//Telnet mail from
$from = shell_exec('mail from: [email protected]');
print_r("MAil from response ".$from);
//Telnet RCPT to
$finalResponse = shell_exec("rcpt to: $email");
print_r("Mail to response ".$finalResponse);
}
И вот ответ
Server: 10.0.80.11
Address: 10.0.80.11#53
Non-authoritative answer:
gmail.com mail exchanger = 5 gmail-smtp-in.l.google.com.
gmail.com mail exchanger = 10 alt1.gmail-smtp-in.l.google.com.
gmail.com mail exchanger = 40 alt4.gmail-smtp-in.l.google.com.
gmail.com mail exchanger = 30 alt3.gmail-smtp-in.l.google.com.
gmail.com mail exchanger = 20 alt2.gmail-smtp-in.l.google.com.
Authoritative answers can be found from:
gmail-smtp-in.l.google.com internet address = 173.194.64.27
gmail-smtp-in.l.google.com has AAAA address 2607:f8b0:4003:c02::1a
alt1.gmail-smtp-in.l.google.com internet address = 173.194.219.27
alt1.gmail-smtp-in.l.google.com has AAAA address 2607:f8b0:4002:c03::1b
alt4.gmail-smtp-in.l.google.com internet address = 64.233.190.26
alt4.gmail-smtp-in.l.google.com has AAAA address 2800:3f0:4003:c01::1b
alt3.gmail-smtp-in.l.google.com internet address = 74.125.141.26
alt3.gmail-smtp-in.l.google.com has AAAA address 2607:f8b0:400c:c06::1a
alt2.gmail-smtp-in.l.google.com internet address = 173.194.205.27
alt2.gmail-smtp-in.l.google.com has AAAA address 2607:f8b0:400d:c02::1b
gmail-smtp-in.l.google.com.telnet response Trying 2607:f8b0:4003:c02::1a...
Connected to gmail-smtp-in.l.google.com.
Escape character is '^]'.
Helo response
MAil from response No message, no subject; hope that's ok
Mail to response
shell_exec не подходит для этого (см. объяснение Ульриха).
fsockopen
должен сделать свое дело.
$fp = @fsockopen('yourMailServer.com', 9001);
if ($fp) {
fwrite($fp, "username\n");
fwrite($fp, "password\n");
while ($line = fread($fp, 2048)) {
// do things with $line
}
} else {
//return error
}
Взяв некоторую ссылку из ответа @ Lavi, я решил эту ситуацию. fputs
сделал трюк, а не fwrite
$connect = @fsockopen($mailServer, 25);
if($connect){
fputs ($connect , "HELO $mailServer\r\n");
$out = fgets ($connect, 1024);
$details .= $out."\n";
fputs ($connect , "MAIL FROM: <$fromemail>\r\n");
//$from = fgets ($connect, 1024);
fputs ($connect , "RCPT TO: <$toemail>\r\n");
//$to = fgets ($connect, 1024);
fputs ($connect , "QUIT");
fclose($connect);
}
shell_exec()
начинает новый процесс. Сначала запускается оболочка, которая затем выполняет данную строку в виде команд. Вы не можете использовать несколько shell_exec()
Команды для взаимодействия с одной и той же оболочкой, например, удаленное управление терминалом.
Что бы я сделал в вашем случае, это попытаться построить на существующем коде. Например, есть куча существующих PHP SMTP библиотеки. Я почти уверен, что по крайней мере один из них сможет делать то, что вы хотите, или, по крайней мере, покажет вам, как вы можете реализовать недостающие функции.
Если вы действительно настаиваете на том, чтобы свернуть свои собственные вещи, проверьте существующий ответ, например, например. взаимодействуя с программой командной строки или PHP expect
модуль. Если бы это не было абсолютно необходимо, я бы избегал этого, потому что это неэффективно. Кроме того, веб-серверы часто настроены на запрет запуска новых процессов по соображениям безопасности, поэтому, если ваш код работает, когда вы запускаете его из командной строки, но не внутри веб-сервера, помните об этом различии.