Мне нужно отправить SMTP по электронной почте через Exchange Server 2016 в PHP, используя почту PEAR и аутентифицированного пользователя AD. Я нашел пример в Интернете:
<html><body>
<?php
include('Mail.php');
$body = "Hi,\n\nHow are you?";
$headers = array (
'From' => "[email protected]",
'To' => "[email protected]",
'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 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: "[email protected]",
to: "[email protected]",
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 настроен правильно, но почта PEAR не может пройти проверку подлинности.
Как мне настроить почту PEAR и / или Exchange, чтобы это могло работать? Анонимная отправка электронной почты SMTP не вариант в этой среде.
Обновление: после комментария BastianW мне удалось включить AUTH LOGIN, и теперь есть другая ошибка:
ОТЛАДКА: Recv: 220 mail.mydomain.com Microsoft ESMTP MAIL Служба готова в четверг, 3 августа 2017 г. 15:33:14 +0200
ОТЛАДКА: Отправить: EHLO localhost
ОТЛАДКА: Recv: 250-mail.mydomain.com Привет
ОТЛАДКА: Recv: 250-РАЗМЕР 37748736
ОТЛАДКА: Recv: 250-ТРУБОПРОВОД
ОТЛАДКА: Recv: 250-DSN
ОТЛАДКА: Recv: 250-ENHANCEDSTATUSCODES
ОТЛАДКА: Recv: 250-STARTTLS
DEBUG: Recv: 250-AUTH LOGIN
ОТЛАДКА: Recv: 250-8BITMIME
DEBUG: Recv: 250 BINARYMIME
ОТЛАДКА: Recv: 250 CHUNKING
ОТЛАДКА: Отправить: AUTH LOGIN
ОТЛАДКА: Recv: 334 VXNlcm5hbWU6
ОТЛАДКА: Отправить: cGxcUHJlcGF5LlBsYXRmb3Jt
ОТЛАДКА: Recv: 334 UGFzc3dvcmQ6
ОТЛАДКА: Отправить: OTAjMDNiUjFaaGM2SjRU
ОТЛАДКА: Recv: 235 2.7.0 Аутентификация успешна
ОТЛАДКА: Отправить: ПОЧТА ОТ:
ОТЛАДКА: Recv: 250 2.1.0 Отправитель в порядке
ОТЛАДКА: Отправить: RSET
DEBUG: Recv: 250 2.0.0 Сброс
ОТЛАДКА: Отправить: ВЫЙТИ
Почему 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, может заключаться в том, что ssl-сертификат, работающий на вашем сервере MS Exchange, не является доверенным. Я думаю, что когда вы запускаете код C #, он выполняется на ПК, присоединенном к домену активной директории, и корневой сертификат SSL, используемый SMTP-портом с сервера Microsoft Exchange, есть, но на сервере (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"));
Как уже упоминалось Вот.
Других решений пока нет …