【问题标题】:Unable to get PhpMailer working with Office 365无法让 PhpMailer 与 Office 365 一起使用
【发布时间】:2017-02-01 22:15:03
【问题描述】:

我希望你今天一切顺利。

我正在一个现有的 PHP 站点上做一些工作(应该注意,我远非 PHP 专家),它的 Web 表单目前无法正常工作。此表单仅接受用户输入,将其转换为电子邮件并将该电子邮件发送到用户的办公室帐户。当他们切换到 Office 365 作为他们的电子邮件提供商时,它停止工作。该表单使用 PhpMailer 库来处理发送,因此我对其进行了修改以使用 Office 365 设置here。当它发送时,我收到以下错误:

2017-02-01 21:50:17 Connection: opening to smtp.office365.com:2525, 
timeout=10, options=array ( ) 2017-02-01 21:50:28   Connection: Failed to 
connect to server. Error number 2. "Error notice: stream_socket_client() 
[function.stream-socket-client]: unable to connect to smtp.office365.com:587
(Connection timed out) 2017-02-01 21:50:28  SMTP ERROR: Failed to connect to 
server: Connection timed out (110)
Message delivery failed...RFI1

由于它的设置方式,它直接输出到网页。这是我一直在输入的 PhpMailer 设置:

$mail = new PHPMailer(true);
$mail-> IsSMTP();
$mail->Host       = "smtp.office365.com";
$mail->SMTPAuth   = true;
$mail->Username   = 'username';
$mail->Password   = 'pass';
$mail->SMTPSecure = 'ssl';
$mail->Port       = 587;
$mail->SMTPDebug  = 2;

$mail->From       = $from;
$mail->Mailer     = "smtp";
$mail->FromName   = 'Generic message';

我浏览了整个网络,看看我在这里可能做错了什么。托管该站点的 ISP 表示他们没有阻止任何内容,而 Microsoft 表示我没有正确配置 SSL。现在承认,我不是这个系统的专家,我没有直接访问服务器的权限,而且站点本身构建得很奇怪,我无法让它在本地服务器上正常运行。尽管如此,我还是很难想到连接超时可能是由 SSL 问题引起的。有没有人知道还有什么可能导致这个问题?

编辑:正如所指出的,错误消息中的端口与代码中的端口不匹配。我根据阅读的内容尝试了几个端口,并在不同的时间从每个端口中获取了文本。

【问题讨论】:

  • 2525端口奇怪,好像没有使用你设置的端口
  • 是的,那是我的错。我剪切并粘贴了之前的代码,然后尝试使用不同的端口号确定,并从该运行中获取错误。
  • 从你的服务器运行 telnet smtp.office365.com 587 看看你是否获得了连接
  • 没有对服务器的 ssh 访问权限。有点半盲。
  • 你有什么运气吗?

标签: php office365 phpmailer


【解决方案1】:

不要只是编造价值观并希望它能奏效。 Office365 配置是沼泽标准,除了 Host 值之外与 gmail 相同,因此您的代码基于 PHPMailer 提供的 the gmail example

至于您在这里遇到的具体问题,我怀疑SMTPSecure = 'ssl' 不适用于Port = 587;对于端口 587(显式 TLS),您需要 SMTPSecure = 'tls'

【讨论】:

  • 感谢您的输入,我一直在使用您链接的示例。我也尝试了这两种协议,但仍然没有运气。
  • 在这种情况下,我猜您的 ISP 正在阻止出站 SMTP。这很常见。您可以在故障排除指南中进行一些测试来检查。
【解决方案2】:

除了前面提到的设置tls而不是ssl作为加密层之外,$mail->From需要明确指定,它应该与$mail->Username属性相同。

这是一个修改的例子:

$mail = new PHPMailer(true);
$mail-> IsSMTP();
$mail->Host       = "smtp.office365.com";
$mail->SMTPAuth   = true;
$mail->Username   = "jondoe@contoso.onmicrosoft.com";
$mail->Password   = 'P@ssw0rd';
$mail->SMTPSecure = 'tls'; //TLS
$mail->Port       = 587;

$mail->From       = $mail->Username;  //mandatory and identical to Username property 

$mail->Subject = "Hello message";
$mail->Body = "Body goes here...";
$mail->addAddress('janedoe@contoso.onmicrosoft.com');


if(!$mail->send()) {
    echo 'Message could not be sent.';
    echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
    echo 'Message has been sent';
}

【讨论】:

  • 感谢您的建议,但仍然没有运气。我仍然收到相同的“连接超时”错误。
猜你喜欢
  • 1970-01-01
  • 2017-04-07
  • 1970-01-01
  • 2015-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-29
  • 1970-01-01
相关资源
最近更新 更多