2011-08-27 34 views
5

Skonfigurowałem aplikację php/mysql na moim lokalnym laptopie przy użyciu iis7 do testowania. Używam php mail() do wysyłania wiadomości e-mail za pomocą usługi localhost smtp na serwerze i chcę replikować lokalnie do testowania. (przez długi czas działało dobrze na serwerze, więc chcę tylko replikować lokalnie w celach testowych.)Konfigurowanie smtp na windows-7 iis-7.5

Korzystanie z artykułu w serwisie technet: http://technet.microsoft.com/en-us/library/cc772058(WS.10).aspx Udało mi się skonfigurować ustawienia SMTP, ale nadal nie mogę wysłać email.

Powtórzyłem serwer kilka razy bez żadnego efektu.

Uruchomiłem netstat -an i nie ma niczego nasłuchiwania na port25 - czy jest coś jeszcze, co muszę zrobić, aby usługa smtp nasłuchiwała na porcie25?

Błąd Otrzymuję:

PHP Warning: list() [function.mail]: Nie udało się podłączyć do serwera pocztowego na " localhost " portu 25, zweryfikować " SMTP " i " smtp_port " ustawienie w php.ini, lub ini_set()

php.ini:

SMTP = localhost 
smtp_port = 25 
+0

Nie musisz uruchamiać lokalnego serwera SMTP, aby wysyłać przy użyciu 'mail()', chyba że próbujesz wysyłać wiadomości e-mail na adres '@ localhost'. Jaki błąd pojawia się, gdy próbujesz wysłać wiadomość e-mail? – DaveRandom

+0

Nie próbuję uruchomić lokalnego serwera SMTP - chcę słuchać na localhost i przekazywać pocztę do zdalnego serwera pocztowego. (które skonfigurowałem w funkcji IIS SMTP) –

+0

na podstawie tego błędu działa funkcja 'mail()', ale serwer SMTP go odrzuca. Pierwszą rzeczą, jaką mógłbym zrobić, jest pobranie [Wireshark] (http://www.wireshark.org/) i przyjrzenie się surowym SMTP, które jest wymieniane. Jednak zastrzeżenie: nie można słuchać ruchu na 127.0.0.1 w Wireshark w systemie Windows. Podczas debugowania będziesz musiał przechodzić przez zdalny komputer (chyba że wyjdziesz z bezprzewodowej karty sieciowej i do przewodowej karty sieciowej lub odwrotnie ... – DaveRandom

Odpowiedz

16

Zamiast testu iis można użyć czegoś podobnego do smtp4dev (http://smtp4dev.codeplex.com/). Działa jak urok dla mnie.

+0

Czy to oznacza, że ​​funkcja SMTP w IIS nie działa? –

+0

To działa, ale najwyraźniej nie w Windows 7. To system operacyjny przychodzi bez wbudowanego serwera SMTP – Dima

+0

Sprawdziło się dla mnie w Win7 – jvenema

2

Windows 7 nie wysyła usługi SMTP. Więc musisz użyć produktu innej firmy. Jest to dobrze znany problem, ale nie wiadomo, dlaczego go nie znalazłeś, szukając w Internecie.

+0

skieruj mnie do dokumentu, który stwierdza, że ​​funkcja 7.5 7.5 smtp nie działa w systemie Windows 7 bez serwera SMTP? –

+0

Nie powinieneś konfigurować swojej aplikacji i pozwolić jej spróbować lokalnie znaleźć serwer SMTP (jak wspomniano powyżej) . Jeśli chcesz, aby to działało, musisz mieć serwer SMTP działający lokalnie. Jest to zdrowy rozsądek i nie sądzę, że musi gdzieś zostać udokumentowany. –

+0

Co? zdrowy rozsądek wiedzieć, że funkcja SMTP w IIS nie zapewnia funkcjonalności SMTP? Jak to możliwe, aby wiedzieć, że ????? –

1

Cóż, zgadzam się z PO. Nie jest od razu oczywiste, że W7 (nawet Ultimate) jest dostarczany bez serwera SMTP (jestem prawie pewien, że mieliśmy go na Vista 64 Ultimate, a może nawet XP), więc będziesz musiał zidentyfikować serwer do użycia, czy to lokalny, czy też zdalny.

Jeśli serwer nie korzysta z zezwolenia, to powinno działać bez konieczności poeksperymentować z IIS7 lub IIS7 Express:

$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); 

Jeśli serwer używa upoważnienia zwykłego tekstu (nie TLS/SSL), następnie dodanie poświadczenia mogą działać, w zależności od wersji PHP:

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

Jeśli serwer wymusza stosowanie protokołu TLS/SSL do łączenia z poświadczeniami, jak GMail robi, wtedy pakiet xpm4 Sourceforge jest proste rozwiązanie. Istnieją dwa sposoby, można go używać z GMail (są prosto z przykładów dostarczonych z opakowaniem):

// 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 ekspresowe (czego używałem) moduł FastCGI PHP instaluje z obsługą OpenSSL Extension włączony. Powyższe umożliwia korzystanie ze znaczników HTML w treści wiadomości.Drugim sposobem przy użyciu pakietu xpm4 przedstawiono poniżej, dla wiadomości tekstowych tylko (znowu przykładem jest ze źródła pakietu):

// 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); 

oba powyższe pracy z Gmailem, licząc od dnia tego wpisu, przy użyciu IIS7 i bez konieczności dodatkowej konfiguracji.