2017-08-03 198 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> 

當我運行此我得到以下錯誤:

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

同時此類似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 Server已正確配置,但PEAR郵件無法進行身份驗證。

我應該如何配置PEAR郵件和/或Exchange以使其可以工作?匿名SMTP電子郵件發送不是此環境中的選項。

更新:BastianW的評論後,我成功地使AUTH LOGIN,現在有一個不同的錯誤:

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郵件發送RSET其關閉時,它得到了「發件人OK」的連接?

回答

0

它看起來像在上面您的回覆看到你的MS Exchange服務器的配置不正確:

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「,然後將提供簡單的」Auth登錄「,而無需在此處執行startTLS。

爲什麼C#代碼工作但不是PHP的原因可能是您的MS Exchange服務器上運行的SSL證書不可信。我想當你運行C#代碼時,它會在一臺加入到活動目錄域的PC上完成,並且來自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

+0

感謝您的提示。我成功地啓用了「Auth Login」,現在我更進一步了(請參閱更新後的問題)。 SSL證書是可信任的,由官方CA(不是Windows域名)。 – Vladimir