2017-04-14 130 views
1

我有一个DNS问题运行PHPMailer访问smtp.office365.com在一个新的cPanel共享主机计划register365.com。php PHPMailer共享主机覆盖默认DNS服务器

我的代码已经在同一提供程序的旧共享主机计划上工作了多年。它可以在测试的Windows IIS系统和另一个提供商的共享托管计划中正常工作。所以这个问题是唯一的register365.com

我在300秒后出现连接错误: 连接失败。错误#2:stream_socket_client():php_network_getaddresses:getaddrinfo失败:名称解析中的临时失败

PHPMailer中的标准疑难解答信息导致我怀疑DNS。所以我联系了提供商register365.com,并告诉我:

感谢您与我们联系有关DNS。

首先,我们的域名服务器是非递归的,所以他们只会返回托管在他们的域名的结果,所以如果您尝试在我们的域名服务器上查询smtp.office365.com,这将无法正常工作,因为它不与我们托管。所以如果你的phpmail脚本查询我们的服务器来找到这个地址,它不会工作,并会带回你看到的错误。

您将需要设置您的PHP脚本来查询一般的DNS,例如Google,这将解决问题。

不幸的是,在这种情况下我们无能为力来解决这个问题。

首先,他们的反应是否有意义? 如果有,我该怎么办? 因此,我希望能够强制PHPMailer在尝试解析smtp.office365.com进行初始连接时使用Google的8.8.8.8 DNS服务器,或者以某种方式强制PHP本身更改其默认DNS服务器。我不想将IP地址硬编码到$ mail-> Host字段中,因为Microsoft可能会随着时间的推移更改它们。

我在寻找关于如何继续的建议。 (你可能会说“使用不同的托管服务提供商”,但对于各种金融我不能!)

<!DOCTYPE html> 
<html> 
<html lang="en"> 
<meta charset="utf-8" /> 
<title>Test Office365 in Microsoft from Register365.com</title> 
<link rel="stylesheet" href="/styles/trekkersfluid.css" type ="text/css" /> 
</head> 

<body class="blank"> 
<?php 
    error_reporting(E_ALL); 
    ini_set('display_errors', 1); 
    require('../PHPMailer/PHPMailerAutoload.php'); 
    $mail = new PHPMailer; 
    $mail->LE = "\r\n"; 
    $mail->CharSet = 'UTF-8'; 
    $mail->SMTPDebug = 4;         
    $mail->Debugoutput = 'html'; 
    $mail->isSMTP(); 
    $mail->Host = "smtp.office365.com";       // Specify main Office 365 SMTP server 
    $mail->SMTPAuth = true;         // Enable SMTP authentication 
    $mail->Username = '[email protected]';   // SMTP username 
    $mail->Password = 'mypassword';       // SMTP password 
    $mail->SMTPSecure = 'tls';        // Enable TLS encryption, `ssl` also accepted 
    $mail->Port = 587;          // TCP port to connect to. TLS = 587 SSL = 465 


    //Set the FROM address 
    $FromName = "Joe Murray"; 
    $mail->setFrom("[email protected]"); 

    $mail->addReplyTo("[email protected]", "Rubbish Name"); 
    $mail->addAddress("[email protected]", "Joseph Murray"); 

    $mail->WordWrap = 70;         // Set word wrap to 70 characters 

    $mail->isHTML(true);         // Set email format to HTML 

    $mail->Subject = "Testing Microsoft Exchange Online Service"; 
    $mail->Body = "This is a test"; 

    if(!$mail->send()) { 
     echo '<p class="error_msg">Message could not be sent.</p>'; 
     echo '<p class="error_msg">Mailer Error: ' . $mail->ErrorInfo."</p>"; 
     exit(); 
    } else { 
     echo '<p class="green">'."Email sent</p>"; 

    } 

    ?> 

回答

1

要验证供应商的声明,你可以尝试解决比smtp.office365.com其他名称,例如google.com。然后,您将确定您的提供商的DNS服务器是否确实是非递归的。不过,我必须说,听起来很奇怪,运行虚拟主机的物理机或虚拟机没有配置为使用实际上是有用的的DNS服务器。


作为一种解决办法,我建议使用谷歌的公共DNS-过HTTP API来查询他们的DNS服务器(8.8.8.8 8.8.4.4和):

https://dns.google.com/resolve?name=smtp.office365.com

但讽刺的是,你在这里面临同样的问题,那就是你无法解决dns.google.com


唯一的其他解决方案,我可以在此刻看到的是直接查询公共DNS服务器(如8.8.8.8)通过TCP或UDP。

如果您的主机提供对外壳的访问,您可以使用类似nslookup的工具(详情请参阅this SU question)。

如果您无权访问shell,this SO question可能证明是有用的,以便用PHP解析名称。