我需要使用PEAR邮件和经过身份验证的广告用户通过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]大小37748736流水线DSN增强状态代码STARTTLS AUTH GSSAPI NTLM 8BITMIME二进制MIME分块)]
同时,这种类似的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,现在有一个不同的错误:
调试:Recv:220邮件。我的域名。com Microsoft ESMTP邮件服务于2017年8月3日星期四15:33:14 0200准备就绪
调试:发送:EHLO localhost
调试:恢复:250-mail.mydomain.com你好
调试: Recv: 250-SIZE 37748736
调试:回收:250-管道
调试: Recv: 250-DSN
调试:Recv:250-EnhancedStatus代码
调试: Recv: 250-启动
调试: Recv: 250-AUTH登录
调试:Recv:250-8BITMIME
调试:Recv:250-BINARYMIME
调试: Recv: 250组块
调试:发送:AUTH登录
调试: Recv: 334 VXNlcm5hbWU6
调试:发送:cGxcUHJlcGF5LlBsYXRmb3Jt
调试:Recv:334 UGFzc3dvcmQ6
调试:发送:OTAjMDNiUjFaaGM2SjRU
调试:Recv:235 2.7。0身份验证成功
调试:发送:邮件来源:
调试:Recv:250 2.1。0发件人确定
调试:发送:RSET
调试: Recv: 250 2.0.0重置
调试:发送:退出
为什么PEAR mail会发送RSET,在收到“发件人确认”时关闭连接?
看起来你的MSExchange 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根证书在那里,但是在服务器上(Linux?)运行PHP代码时,根证书不存在。这里有一个链接,您可以使用它来排除故障。
您还可能希望尝试以下操作:
$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"
));
正如这里提到的。