Как отправить электронную почту, используя PHP PEAR mail и Exchange Server 2016

Мне нужно отправить 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, который закрывает соединение, когда получает сообщение «Отправитель в порядке»?

0

Решение

Похоже, что ваш 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"));

Как уже упоминалось Вот.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]