2017-08-03 14 views
0

PEARメールと認証済みADユーザーを使用してPHPでExchange Server 2016経由でSMTP電子メールを送信する必要があります。私はオンラインの例を見つけました:PHP PEARメールとExchange Serverを使用して電子メールを送信する方法2016

<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> 

私はこれを実行すると、私は次のエラーを取得:この同様のC#アプリケーションが問題なく正常に動作します。同時に

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)]

を:

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 Serverは正しく構成されていますが、PEARメールは認証できません。

これは動作するようにPEARメールおよび/またはExchangeをどのように設定しますか?この環境では、匿名SMTP電子メール送信はオプションではありません。

更新:BastianWさんのコメントの後、私はAUTHのログインを可能にすることに成功し、現在は別のエラーがあります:

DEBUG: Recv: 220 mail.mydomain.com Microsoft ESMTP MAIL Service ready at Thu, 3 Aug 2017 15:33:14 +0200

DEBUG: Send: EHLO localhost

 

DEBUG: Recv: 250-mail.mydomain.com Hello

DEBUG: Recv: 250-SIZE 37748736

DEBUG: Recv: 250-PIPELINING

DEBUG: Recv: 250-DSN

DEBUG: Recv: 250-ENHANCEDSTATUSCODES

DEBUG: Recv: 250-STARTTLS

DEBUG: Recv: 250-AUTH LOGIN

DEBUG: Recv: 250-8BITMIME

DEBUG: Recv: 250-BINARYMIME

DEBUG: Recv: 250 CHUNKING

DEBUG: Send: AUTH LOGIN

 

DEBUG: Recv: 334 VXNlcm5hbWU6

DEBUG: Send: cGxcUHJlcGF5LlBsYXRmb3Jt

 

DEBUG: Recv: 334 UGFzc3dvcmQ6

DEBUG: Send: OTAjMDNiUjFaaGM2SjRU

 

DEBUG: Recv: 235 2.7.0 Authentication successful

DEBUG: Send: MAIL FROM:

 

DEBUG: Recv: 250 2.1.0 Sender OK

DEBUG: Send: RSET

 

DEBUG: Recv: 250 2.0.0 Resetting

DEBUG: Send: QUIT

なぜPEARのメールは、「送信者OK」を取得するときに接続を閉じ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のコードではない理由は、MS Exchangeサーバーで実行されているssl証明書が信頼できないためです。私はC#コードを実行すると、アクティブディレクトリドメインに参加したPC上で実行され、SSLルート証明書がMicrosoft Exchangeサーバーから使用されていることが考えられますが、サーバー(Linux?)ではPHPコードを実行しています証明書はそこにありません。ここではそれを解決するために使用できる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を述べた:

また、のようなものを試してみたいことがあります。

+0

ヒントをお寄せいただきありがとうございます。私は "認証ログイン"を有効にすることに成功し、今私はさらに進んでいます(更新された質問を参照)。 SSL証明書は、正式なCA(Windowsドメインの証明書ではない)によって信頼されたものです。 – Vladimir

関連する問題