【发布时间】:2013-01-01 17:19:37
【问题描述】:
好的,我第一次尝试使用 php 进行套接字编程,这是我一直想做的事情,但由于我们在工作中完成的应用程序上的退回电子邮件跟踪确实加快了速度不行,所以现在我必须检查整个电子邮件地址以确保它们有效。
我已经学会了如何通过命令行使用 telnet 来验证电子邮件地址并发送电子邮件地址,我对此没有任何问题。我跌倒的地方是我去使用“HELO”命令与服务器通信的时候。
但我可能在这里完全错误的区域,因为我什至不知道这是否已建立 telnet 连接,但最后的 var dump 表明正在建立连接。
除了“n6si3992361paw.22”之外,当我使用命令行进行 telnet 连接时,连接响应是相同的,但我想这是每个连接的某种唯一标识符。
<?php
$target = "aspmx.l.google.com";
$port = 25;
$errno = "";
$errstr = "";
$timeout = 9;
$newline = "\n\r";
$logArray = array();
$connect = fsockopen($target, $port, $errno, $errstr, $timeout);
$smtpResponse = fgets($connect, 4096);
if(empty($connect)) {
$logArray["error"][] = "Failed to connect: $smtpResponse";
var_dump($logArray);
exit;
} else {
$logArray['connection'][] = "Connected to: $smtpResponse";
}
fputs($connect, "HELO" . $newLine);
$smtpResponse = fgets($connect, 4096);
$logArray['connection'][] = "$smtpResponse";
var_dump($logArray);
$logArray 的结果:
array(1) { ["connection"]=> array(2) { [0]=> string(57) "Connected to: 220 mx.google.com ESMTP n6si3992361paw.22 " [1]=> string(0) "" } }
【问题讨论】:
-
SMTP 规范说行必须以 CRLF 结尾,而不是 LFCR。先尝试修复它。
-
没有仍然得到相同的响应。一段时间后超时。 $smtpResponse 是一个空字符串。我将尝试从不同的服务器,看看情况如何。
-
FWIW 正确的语法是
HELO example.com,您显然会将example.com替换为您要连接的主机的名称。不需要说真话,所以你会看到很多HELO windows7或HELO localhost,但有些网站将它们视为垃圾邮件指标。另外,如果可以的话,您肯定想使用EHLO。 -
fgets($connect, 4096)是怎么回事?如果您必须有一个数字,请使用 SMTP 规范之外的数字(1000 或 1024 可能更好),但不要盲目猜测。