好吧,我正在尝试使用我的主机(hosting2go)中的smtp服务器发送电子邮件,根据他们的常见问题之一,我必须首先使用pop3进行身份验证,它必须在我尝试连接之前检索邮件smtp服务器,这就是我所做的(我认为),但遗憾的是它仍然因为某种原因断开了我与smtp服务器的连接,甚至更加混乱(如果我得到了这个权利)它告诉我客户端请求关闭连接。
这是我的php代码:
echo 'running';
require '../PHPMailerAutoload.php';
$pop3mail = imap_open('{XXXX.hosting2go.nl:110/pop3}', 'noreply@wtvruinerwoldnieuw.nl', 'XXX');
// grab a list of all the mail headers
$headers = imap_headers($pop3mail);
// grab a header object for the last message in the mailbox
$last = imap_num_msg($pop3mail);
$header = imap_header($pop3mail, $last);
// grab the body for the same message
echo $body = imap_body($pop3mail, $last);
$mail = new PHPMailer;
$mail->SMTPDebug = 3;
$mail->Debugoutput = 'html'; // Enable verbose debug output
$mail->isSMTP(); // Set mailer to use SMTP
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->SMTPSecure = 'tls'; // zet SMTP naar ssl
$mail->Host = 'XXX.hosting2go.nl'; // Specify main and backup SMTP servers
$mail->Port = 25; // TCP port to connect to
$mail->Username = "noreply@wtvruinerwoldnieuw.nl"; // SMTP username
$mail->Password = 'XXXX'; // SMTP password
$mail->From = 'noreply@wtvruinerwoldnieuw.nl';
$mail->FromName = 'Werktuigenvereniging Ruinerwold';
$mail->AddAddress("e.zenderink@gmail.com");
//$mail->isHTML(true); // Set email format to HTML
$mail->Subject = "testing";
$mail->Body = "testing";
//send the message, check for errors
if (!$mail->send()) {
echo "Mailer Error: " . $mail->ErrorInfo;
} else {
echo "Message sent!";
}
imap_close($pop3mail);
这是我得到的回应:
runningConnection: opening to xxx.hosting2go.nl:25, t=300, opt=array ()
Connection: opened
SERVER -> CLIENT: 220 xxx.hosting2go.nl ESMTP
CLIENT -> SERVER: EHLO wtvruinerwoldnieuw.nl
SERVER -> CLIENT: 250-xxx.hosting2go.nl250-STARTTLS250-PIPELINING250 8BITMIME
CLIENT -> SERVER: STARTTLS
SERVER -> CLIENT: 220 ready for tls
CLIENT -> SERVER: QUIT
Connection: closed
SMTP connect() failed.
Mailer Error: SMTP connect() failed.
那个客户 - >服务器:退出让我感到困惑,但我可能无法正确理解。 奇怪的是(或者是吗?)在php中构建的默认mail()函数工作得很好。但我不想使用该功能,因为它将用于简报等(不是最重要的部分)。那个功能与我在这里所做的不同是什么?
更新
是的,我正在调查我从PHPMailer和服务器获得的响应,并发现有关STARTTLS的文档并发现了这一点:
If the SMTP client decides that the level of authentication or
privacy is not high enough for it to continue, it SHOULD issue an
SMTP QUIT command immediately after the TLS negotiation is complete.
来源:https://www.ietf.org/rfc/rfc2487.txt
但它现在是服务器或客户端问题。我也尝试使用localhost(因为我尝试使用的smtp服务器位于托管我的网站的同一台服务器上)(127.0.0.1),结果相同。
更新2#(找到一个解决方案,但很奇怪): https://stackoverflow.com/a/12410579/4564466
评论:
$mail->isSMTP();
工作了,我不知道为什么,对该解决方案的回答没有告诉我为什么它有效。我不确定它是否是正确的方法,或者我现在正在做一些人们应该做的事情......
回应如下:
runningServer -> Client: +OK Hello there. Server -> Client: +OK Password required. Server -> Client: +OK logged in. Message sent!
我收到的邮件非常好。
感谢您的帮助。
P.S。我不介意你是否试图指出我的方向,而不是为我打字,如果你指出我的方向,我实际上会更喜欢它,因为我想知道它是如何工作的以及为什么这样做不行。
答案 0 :(得分:1)
您所描述的内容称为POP-before-SMTP。我已经20多年没见过任何人使用它了!
不要打扰自己的代码 - PHPMailer内置了对它的支持。查看this code example。
那就是说,我建议找一个比石器时代少一点的ISP。
答案 1 :(得分:0)
您的服务器正在尝试使用STARTTLS将您置于TLS模式。您必须配置PHPMailer才能启用此模式。我认为你需要的是:
$mail->SMTPSecure = 'tls';