SMTP Telnet 和 PHP 没有从 HELO 得到任何响应
Posted
技术标签:
【中文标题】SMTP Telnet 和 PHP 没有从 HELO 得到任何响应【英文标题】:SMTP Telnet and PHP not getting any response from HELO 【发布时间】: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 可能更好),但不要盲目猜测。
【参考方案1】:
您犯了一个简单的错字(PHP 变量名区分大小写)。
比较一下:
$newline = "\n\r";
...用这个:
fputs($connect, "HELO" . $newLine);
使用$newline
,而不是$newLine
。然后就可以了。
此外,正如 Casper 已经指出的那样,您的 CRLF 顺序错误;使用\r\n
,而不是相反。
【讨论】:
以上是关于SMTP Telnet 和 PHP 没有从 HELO 得到任何响应的主要内容,如果未能解决你的问题,请参考以下文章
php+mysql模拟队列发送邮件,能不能见网友就靠这封邮件了