繁体   English   中英

如何使用PHP PEAR邮件和Exchange Server 2016发送电子邮件

[英]How to send email using PHP PEAR mail and Exchange Server 2016

我需要使用PEAR邮件和经过身份验证的AD用户通过PHP在Exchange Server 2016上发送SMTP电子邮件。 我在网上找到了一个示例:

<html><body>
<?php
include('Mail.php');

$body = "Hi,\n\nHow are you?";

$headers = array (
    'From' => "sender@mydomain.com",
    'To' => "recipient@gmail.com",
    'Subject' => "Hi from MailTest3.php!"
);
$smtp = Mail::factory('smtp', array (
    'host' => "mail.mydomain.com",
    'port' => 587,
    'auth' => true,
    'username' => "activeDirectoryDomain\\sender",
    'password' => "password"
));

$mail = $smtp->send($to, $headers, $body);

if (PEAR::isError($mail)) {
    echo("<p>" . $mail->getMessage() . "</p>");
} else {
    echo("<p>Message successfully sent!</p>");
}

?>
</body></html>

运行此命令时,出现以下错误:

身份验证失败[SMTP:不支持身份验证方法(代码:250,响应:mail.mydomain.com,您好[192.168.30.254]大小:37748736管道DSN增强状态代码:STARTTLS AUTH GSSAPI NTLM 8BITMIME BINARYMIME CHUNKING)

同时,这个类似的C#应用​​程序可以正常工作,没有任何问题:

static void Main(string[] args)
{
    var body = "Hi,\n\nHow are you?";

    var msg = new MailMessage(
        from: "sender@mydomain.com",
        to: "recipient@gmail.com",
        subject: "Hi from MailTest3.cs!",
        body: body);

    var smtp = new SmtpClient(
        host: "mail.mydomain.com",
        port: 587);
    smtp.EnableSsl = true;
    smtp.UseDefaultCredentials = false;
    smtp.Credentials = new NetworkCredential(
        userName: "activeDirectoryDomain\\sender",
        password: "password");

    try
    {
        smtp.Send(msg);
        Console.WriteLine("Message successfully sent!");
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }
}

由于C#代码可以正常工作,因此已正确配置了Exchange Server,但PEAR邮件无法进行身份验证。

如何配置PEAR邮件和/或Exchange,使其可以正常工作? 在这种环境下,匿名SMTP电子邮件发送不是一个选项。

更新:在BastianW发表评论后,我成功启用了AUTH LOGIN,现在出现了另一个错误:

调试:修订:220 mail.mydomain.com Microsoft ESMTP邮件服务已准备在2017年8月3日星期四15:33:14 +0200

调试:发送:EHLO本地主机

调试:修订:250-mail.mydomain.com您好

调试:修订:250尺寸37748736

调试:修订:250-管道

调试:修订:250-DSN

调试:修订:250个增强的状态代码

调试:修订:250-STARTTLS

调试:修订:250次身份登录

调试:修订:250-8BITMIME

调试:修订:250-BINARYMIME

调试:修订:250压缩

调试:发送:授权登录

调试:修订:334 VXNlcm5hbWU6

调试:发送:cGxcUHJlcGF5LlBsYXRmb3Jt

调试:修订:334 UGFzc3dvcmQ6

调试:发送:OTAjMDNiUjFaaGM2SjRU

调试:修订:235 2.7.0身份验证成功

调试:发送:邮件发件人:

调试:修订:250 2.1.0发件人确定

调试:发送:RSET

调试:修订:250 2.0.0重置

调试:发送:QUIT

为什么PEAR邮件在收到“发件人正常”后会发送RSET来关闭连接?

看起来您的MS Exchange Server配置不正确,如上面的回复所示:

authentication failure [SMTP: No supported authentication methods (code: 250, response: mail.mydomain.com Hello [192.168.30.254] SIZE 37748736 PIPELINING DSN ENHANCEDSTATUSCODES STARTTLS AUTH GSSAPI NTLM 8BITMIME BINARYMIME CHUNKING)]

因此,您可能希望调整配置并删除“仅在启动TLS之后才提供基本身份验证”的复选标记,这将提供简单的“身份验证登录”,而无需在此处执行startTLS。

顺便说一句,为什么C#代码有效而PHP无效的原因可能是您的MS Exchange服务器上运行的ssl证书不受信任。 我认为,当您运行C#代码时,它是在连接到活动目录域的PC上完成的,并且存在Microsoft Exchange服务器的SMTP端口使用的SSL根证书,但是在运行PHP代码的服务器(Linux?)上,根证书不存在。 这是您可以用来解决此问题的链接

您可能还想尝试类似的方法:

$smtp = Mail::factory('smtp', array (
    'host' => "mail.mydomain.com",
    'port' => 587,
    'auth' => plain,
    'socket_options' => array('ssl' => array('verify_peer_name' => false)),
    'username' => "activeDirectoryDomain\\sender",
    'password' => "password"
));

正如这里提到的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM