2011-08-27 192 views
5

我在本地筆記本電腦上使用iis7配置了php/mysql應用程序進行測試。我使用PHP郵件()在服務器上使用本地主機smtp服務發送電子郵件,並希望在本地進行復制以進行測試。 (它一直在服務器上很好地工作,所以我只是爲了測試目的而在本地複製)。在windows-7上設置smtp iis-7.5

使用technet文章:http://technet.microsoft.com/en-us/library/cc772058(WS.10).aspx但我仍然無法配置SMTP設置發電子郵件。

我已經回收服務器很多次,沒有任何效果。

我已經運行了netstat -an,並且沒有任何監聽端口25 - 是否還有其他事情我需要做以獲得偵聽端口25上的smtp服務?

我收到的錯誤:

PHP的警告:電子郵件()[function.mail]: 無法連接在本地主機"端口" 25,到郵件服務器 驗證" SMTP "和" SMTP_PORT "設置在 php.ini中或使用的ini_set()

的php.ini:

SMTP = localhost 
smtp_port = 25 
+0

除非您嘗試將電子郵件發送到地址'@ localhost',否則不需要運行本地SMTP服務器以使用'mail()'發送。當你嘗試發送電子郵件時,你會得到什麼錯誤? – DaveRandom

+0

我不想運行本地smtp服務器 - 我想在本地主機上偵聽並將郵件傳遞到遠程郵件服務器。 (我在IIS SMTP功能中配置) –

+0

基於該錯誤,'mail()'正在工作,但SMTP服務器拒絕它。我要做的第一件事是獲取[Wireshark](http://www.wireshark.org/),並查看正在交換的原始SMTP。但是,警告:您無法在Windows上的Wireshark上監聽127.0.0.1上的流量。在調試時,您必須通過遠程計算機進行反彈(除非您從無線NIC進入有線NIC,反之亦然)... – DaveRandom

回答

16

您可以使用類似smtp4dev(http://smtp4dev.codeplex.com/)而不是iis來進行測試。對我來說就像一個魅力。

+0

這是否意味着IIS中的SMTP功能不起作用? –

+0

它確實有效,但顯然不在Windows 7中。操作系統沒有內置的SMTP服務器 – Dima

+0

在Win7中工作得很好 – jvenema

2

Windows 7不提供SMTP服務。所以你必須使用第三方產品。這是一個衆所周知的問題,但不知道爲什麼你沒有通過在互聯網上搜索找到它。

+0

指向一個文件,指出iis 7.5 smtp功能不能在windows上運行7沒有smtp服務器? –

+0

你不應該配置你的應用程序,並讓它嘗試在本地查找SMTP服務器(就像你上面提到的那樣) 。如果你想讓它工作,你需要在本地運行一個SMTP服務器。這是常識,我認爲它不需要記錄在某個地方。 –

+0

什麼?知道IIS中的SMTP功能不提供SMTP功能的常識?如何知道這可能是常識? –

1

那麼我同意OP。 W7(即使是旗艦版)在沒有SMTP服務器的情況下運行(我確信我們已經在Vista 64 Ultimate,甚至XP上運行了它)並不是很明顯,所以您將不得不識別要使用的服務器,無論是本地的還是遠程。

如果服務器不使用授權,那麼這應該不必亂用IIS7或IIS7快遞周圍的工作:如果服務器使用明文授權(不TLS/SSL)

$smtpserver = 'host.domain.tld'; 
$port = 25; 
$from = '[email protected]'; 
$replyto = $from; 
$headers = 'From: ' . $from . "\r\n" . 'Reply-To: ' . $replyto . "\r\n" . 
    'X-Mailer: PHP/' . phpversion(); 
$to = '[email protected]'; 
$subject = 'Test Message'; 
ini_set('SMTP', $smtpserver); 
ini_set('smtp_port', $port); 
$message = wordwrap("Hello World!", 70); 
$success = mail($to, $subject, $message, $headers); 

,然後加入憑證可以正常工作,這取決於你的PHP版本:

ini_set('username', 'yourusername'); 
ini_set('password', 'yourpwd'); 

如果服務器強制使用TLS/SSL的與憑據連接,例如Gmail的話,那麼在Sourceforge的xpm4包是一個簡單的解決方案。有兩種方法,你可以與Gmail一起使用它(這些都是直出的設置在封裝的例子):

// manage errors 
error_reporting(E_ALL); // php errors 
define('DISPLAY_XPM4_ERRORS', true); // display XPM4 errors 
// path to 'MAIL.php' file from XPM4 package 
require_once '../MAIL.php'; 
// initialize MAIL class 
$m = new MAIL; 
// set from address 
$m->From('[email protected]'); 
// add to address 
$m->AddTo('[email protected]'); 
// set subject 
$m->Subject('Hello World!'); 
// set HTML message 
$m->Html('<b>HTML</b> <u>message</u>.'); 
// connect to MTA server 'smtp.gmail.com' port '465' via SSL ('tls' encryption) 
// with authentication: '[email protected]'/'password' 
// set the connection timeout to 10 seconds, the name of your host 'localhost' 
// and the authentication method to 'plain' 
// make sure you have OpenSSL module (extension) enable on your php configuration 
$c = $m->Connect('smtp.gmail.com', 465, '[email protected]', 'password', 'tls', 10, 
      'localhost', null, 'plain') 
     or die(print_r($m->Result)); 
// send mail relay using the '$c' resource connection 
echo $m->Send($c) ? 'Mail sent !' : 'Error !'; 
// disconnect from server 
$m->Disconnect(); 

IIS7的快遞(這是我使用的是什麼)的FastCGI PHP模塊與OpenSSL的擴展支持安裝啓用。以上允許您在郵件內容中使用HTML標籤。下面使用xpm4封裝的第二方式被示出,只顯示文本的消息(再次,例如是從包來源):

// manage errors 
error_reporting(E_ALL); // php errors 
define('DISPLAY_XPM4_ERRORS', true); // display XPM4 errors 
// path to 'SMTP.php' file from XPM4 package 
require_once '../SMTP.php'; 
$f = '[email protected]'; // from (Gmail mail address) 
$t = '[email protected]'; // to mail address 
$p = 'password'; // Gmail password 
// standard mail message RFC2822 
$m = 'From: '.$f."\r\n". 
    'To: '.$t."\r\n". 
    'Subject: test'."\r\n". 
    'Content-Type: text/plain'."\r\n\r\n". 
    'Text message.'; 
// connect to MTA server (relay) 'smtp.gmail.com' via SSL (TLS encryption) with 
// authentication using port '465' and timeout '10' secounds 
// make sure you have OpenSSL module (extension) enable on your php configuration 
$c = SMTP::connect('smtp.gmail.com', 465, $f, $p, 'tls', 10) or die(print_r($_RESULT)); 
// send mail relay 
$s = SMTP::send($c, array($t), $m, $f); 
// print result 
if ($s) echo 'Sent !'; 
else print_r($_RESULT); 
// disconnect 
SMTP::disconnect($c); 

兩者與GMail的上述工作,因爲這後之日,使用IIS7而不必做任何額外的配置。