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

Posted

技术标签:

【中文标题】如何使用 PHP PEAR 邮件和 Exchange Server 2016 发送电子邮件【英文标题】:How to send email using PHP PEAR mail and Exchange Server 2016 【发布时间】:2018-01-10 16:07:23 【问题描述】:

我需要使用 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 Hello [192.168.30.254] SIZE 37748736 PIPELINING DSN ENHANCEDSTATUSCODES 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 MAIL 服务于 2017 年 8 月 3 日星期四 15:33:14 +0200 准备就绪

调试:发送:EHLO localhost

 

调试:接收:250-mail.mydomain.com 你好

调试:接收:250-SIZE 37748736

调试:接收:250-流水线

调试:接收:250-DSN

调试:接收:250-ENHANCEDSTATUSCODES

调试:接收:250-STARTTLS

调试:接收:250-AUTH 登录

调试:接收:250-8BITMIME

调试:接收:250-BINARYMIME

调试:接收:250 块

调试:发送:AUTH LOGIN

 

调试:接收:334 VXNlcm5hbWU6

调试:发送:cGxcUHJlcGF5LlBsYXRmb3Jt

 

调试:接收:334 UGFzc3dvcmQ6

调试:发送:OTAjMDNiUjFaaGM2SjRU

 

DEBUG: Recv: 235 2.7.0 认证成功

调试:发送:MAIL FROM:

 

调试:接收:250 2.1.0 发件人正常

调试:发送:RSET

 

调试:接收:250 2.0.0 重置

调试:发送:QUIT

为什么 PEAR 邮件在收到“Sender OK”时会发送关闭连接的 RSET?

【问题讨论】:

【参考方案1】:

您的 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 证书不受信任。我认为当您在加入活动目录域的 PC 上运行 C# 代码时,Microsoft Exchange 服务器的 SMTP 端口使用的 SSL 根证书就在那里,但是在运行 PHP 代码的服务器(Linux?)上,根证书不存在。这是一个link,您可以使用它来解决这个问题。

您可能还想尝试以下方法:

$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"
));

正如提到的here。

【讨论】:

感谢您的提示。我成功启用了“Auth Login”,现在我更进一步(请参阅更新的问题)。 SSL 证书是受信任的证书,由官方 CA(不是 windows 域证书)。

以上是关于如何使用 PHP PEAR 邮件和 Exchange Server 2016 发送电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Pear 邮件发送数字签名电子邮件

使用 PHP PEAR MAIL 发送多个 CC 和 BCC

使用 PEAR 邮件发送测试消息时出现错误消息

PHP PEAR send_mail 无法使用名称和电子邮件设置发件人

PHP 使用PEAR通过POP3检索电子邮件

这个使用 Pear Mail 发送邮件的 PHP 脚本有啥问题?