Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: polaczenie socketowe do smtp nie dziala?
Forum PHP.pl > Forum > Gotowe rozwiązania
Alek
Witam

Wiem ze bylo juz sporo na temat seryjnego wysylania maili, w archiwum kopalem mocno i gleboko:). Przerobilem troche skrypt pochodny od tego z phpBB (byl wklejany kiedys tu).
Problemem jest to ze wysyla pieknie pierwszego maila z listy, ale niestety zadnego wiecej. Zrobilem wyrzucanie na ekran calego dialogu z serwem SMTP, stamtad widac, ze po pierwszym QUIT (odpowiedz 221) juz nic serwer nie odpowiada.
Co moze byc przyczyna?
Jesli nie da rady w ten sposob to moze w jakis inny? (probowalem funkcji mail(), oczywiscie napotkalem te powszechne trudnosci zwiazane z duza iloscia maili).
Parametry: plik 1.txt zawiera w kolejnych liniach kolejne maile, plik .php3 dostaje dane(tresc,temat) z formularza html, wysylam to kompa(win89,apache1.3,php4.0.5) w LANie. Admin serwera SMTP mowi ze moja podsiec nie ma zadnych blokad na tym serwerze SMTP.
Mysle ze dosyc wyczerpujace wyjasnienia, ponizej nieposluszny;) skrypt:

[php:1:5059185e43]<?php
function server_parse($socket) {
$server_response=fgets($socket,256);
$res=substr($server_response,0,3);
if($res>=400) die('Problem z wysyłaniem. '.$server_response);
print("$server_response<BR>");
}

$fp=fopen("1.txt","r");
$plik=fread($fp,filesize("1.txt"));
$adresaci=split("n",$plik);
fclose($fp);

$wyslano=0;
$smtp_host = 'mail.ic.net.pl';
$email = 'infopap@infopap.pl';

while($adresat=each($adresaci)) {
$socket=pfsockopen($smtp_host,25); if(!$socket) echo "Nie mogę się połączyć z SMTP";
server_parse($socket);
$adresat[value]=trim($adresat[value]);
fputs($socket, 'HELO '.$smtp_host."rn"); server_parse($socket);
fputs($socket, 'MAIL FROM: <'.$email.">rn"); server_parse($socket);
fputs($socket, 'RCPT TO: <'.$adresat[value].">rn"); server_parse($socket);
fputs($socket, 'DATA'."rn"); server_parse($socket);
$naglowek = "MIME-Version: 1.0rnContent-type: text/html; charset=iso-8859-2rn";
$naglowek .= "Subject: $tematrn";
$naglowek .= "To: $adresat[value] <$adresat[value]>rn";
fputs($socket, "$naglowekrnrn");
fputs($socket, "$trescrn");
fputs($socket, ".rn"); server_parse($socket);
fputs($socket, "QUITrn"); server_parse($socket);
$wyslano++;
fclose($socket);
}
print("Wyslano $wyslano maili");
?>[/php:1:5059185e43]
lisu
Moze nie dawaj komendy QUIT tylko wysylaj jednym socketem. Przed chwila sprawdzilem telnetem i dziala.
Alek
wielkie dzieki, dziala biggrin.gif
a tak jeszcze z ciekawoscie sie spytam: dlaczego nie moglem tego wyslac otwierajac i zamykajac socket za kazdym wysylanym mailem?

pozdrawiam
Alek
evo
dlaczego nie wyslesz wszystkich mailow z naglowkiem BCC?
wysylasz raz,nie meczysz serwera HTTP a wszystkim zajmie sie serwer SMTP
foe
a moglby ktos napisac jak trzeba by zmienic skrypt by uzyc smtp ktore trzeba uwierzytelniac haslem? dzieki z gory
adwol
Cytat
a moglby ktos napisac jak trzeba by zmienic skrypt by uzyc smtp ktore trzeba uwierzytelniac haslem? dzieki z gory

Zamień:
[php:1:b48ad0cd8b]<?php
fputs($socket, 'HELO '.$smtp_host."rn");
server_parse($socket);
?>[/php:1:b48ad0cd8b]
na
[php:1:b48ad0cd8b]<?php
fputs($socket, 'EHLO '.$smtp_host."rn");
server_parse($socket);
fputs($socket, 'AUTH PLAIN ' . base64_encode("$user$password") . "rn");
server_parse($socket);
?>[/php:1:b48ad0cd8b]
oraz popraw funkcje server_parse tak by przyjmowała wielolinijkowe odpowiedzi od serwera.
W przypadku takich odpowiedzi wszystkie linie za wyjątkiem ostatniej są postaci:
Kod
xyz-tekst

a ostatnia
Kod
xyz tekst

gdzie xyz to 3-cyfrowy kod odpowiedzi.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.