da funktionierts, und da funktionierts nich (pop3)
SorgenkindMech
- php
hi ihr lieben
also ich bin mal wieder am verzweifeln ... und ich hoffe hier weiß jemand rat:
ich habe hier n script, was pop3-mailserver abfragen soll
funktioniert ja soweit ganz gut, zumindest auf dem einen rechner, und auf dem anderen nich ;(
also mein rechner (funktioniert):
winxp pro alle updates
IIs + php 5.2.0 isapi
anderer rechner:
winxp pro alle updates
iis + php 5.2.0 isapi
die php-konfiguration ist unterschiedlich, allerdings meiner meinung nach nichts, was diesen fehler verursachen würde
folgendes script snippet:
diese funktion holt halt die antworten vom server:
function f_get($stream,$b, $einzeilig=0,$endebei="")
{
global $getzeit;
$time_start = microtime(1);
$ok=1;
global $gettet;
$tmp2="";
$gestartet=0;
while($ok)
{
$tmp=fgets($stream);
if(!isset($gettet[$b])) $gettet[$b]="";
$gettet[$b].="\r\n".$tmp;
if($endebei!="" && trim($tmp)==$endebei)
{
$ok=0;
break;
}
if($gestartet) $tmp2.="\r\n";
$tmp2.=rtrim($tmp);
if(trim($tmp)=="" && $endebei=="") $ok=0;
if($einzeilig) $ok=0;
$gestartet=1;
}
// $tmp=fgets($stream,3);
// var_dump($tmp);
// echo $tmp2."<hr> ";
$time_end = microtime(1);
$getzeit[] = $time_end - $time_start;
return $tmp2;
}
folgende funktion ist für verbindung und login:
function pop3_open($adresse, $benutzer, $pass)
{
$port=explode(":",$adresse);
$port=$port[count($port)-1];
$stream=fsockopen($adresse,$port,$errno,$errstr,6);
$a=f_get($stream,"pop3",1);
if(!strtoupper(substr(ltrim($a),0,3))==="+OK") { fputs($stream,"QUIT\r\n"); return false; }
var_dump($a);
fputs($stream,"USER ".$benutzer."\n");
echo "<br />USER ".$benutzer."\n";
$a=f_get($stream,"pop3",1);
if(!strtoupper(substr(ltrim($a),0,3))==="+OK") { fputs($stream,"QUIT\r\n"); return false; }
var_dump($a);
fputs($stream,"PASS ".$pass."\n");
echo "<br />PASS ".$pass."\n";
$a="";
$a=f_get($stream,"pop3",1);
if(!strtoupper(substr(ltrim($a),0,3))==="+OK") { fputs($stream,"QUIT\r\n"); return false; }
var_dump($a);
return $stream;
}
so, hier mal die testausgaben, wenn ich das ganze auf meinem rechner ausführe:
string(56) "+OK Hello there. 2129.1197579492@localhost.localdomain"
USER bla
string(22) "+OK Password required."
PASS bla
string(14) "+OK logged in."
list
string(14) "+OK 46 1577357"
und nun vom anderen rechner:
string(56) "+OK Hello there. 2128.1197579460@localhost.localdomain"
USER bla
string(0) ""
PASS bla
string(0) ""
list
string(25) "-ERR due to authorization"
es scheint mir fast so, als ob die zeilenenden, gesendet von rechner 2, dort nicht akzeptiet werden ... wie kann das sein?
ich mein der scheint j auch rechner 2 nach USER bla noch auf was zu warten, da er garnich nachm passwort fragt ... (mal ganz davon abgesehen, dass meine prüfung auf "+OK" anscheind nirgens funktioniert, sie ist immer true o.O - ach son quark, den fehler hab ich grad gesehen ... warum setz ich das ! denn vorne hin ... tze ...)
naja wie dem auch sei, der andere fehler bleibt ja bestehen .. hat jemand ne idee?
wär wirklich klasse *hoff*
bis dann
na toll
ich habs rausgefunden
meine anfragen endeten mit \n, was auf meinem rechner funktionierte (gleicher mailserver)
und auf dem anderen funktionierts nur wenn ich \r\n am schluss sende ... ist das logisch?
naja, nur für den fall, dass jemand mal n ähnliches prob hat ...
bis dann
Moin Moin!
meine anfragen endeten mit \n, was auf meinem rechner funktionierte (gleicher mailserver)
und auf dem anderen funktionierts nur wenn ich \r\n am schluss sende ... ist das logisch?
Ja. Die Mail-RFCs fordern (wie auch viele andere RFCs für textbasierende Netzwerkprotokolle) CR+LF am Zeilenende, dass Mailserver ein nacktes LF akzeptieren, ist reine Großzügigkeit.
Möglich wäre auch, dass Du unter Windows arbeitest und irgendwo die C-Library im Textmode arbeitet, wodurch das Equivalent von printf("\n") CR+LF liefert.
Alexander
Moin Moin!
meine anfragen endeten mit \n, was auf meinem rechner funktionierte (gleicher mailserver)
und auf dem anderen funktionierts nur wenn ich \r\n am schluss sende ... ist das logisch?Ja. Die Mail-RFCs fordern (wie auch viele andere RFCs für textbasierende Netzwerkprotokolle) CR+LF am Zeilenende, dass Mailserver ein nacktes LF akzeptieren, ist reine Großzügigkeit.
Möglich wäre auch, dass Du unter Windows arbeitest und irgendwo die C-Library im Textmode arbeitet, wodurch das Equivalent von printf("\n") CR+LF liefert.
Alexander
hoi
ja najaaa
interessant finde ich aber, dass es auf dem einen rechner funktioniert und auf dem anderen nicht ...
wi gesagt, beide win xp pro, bei beiden läuft die selbe php-version unter IIS als isapi-modul ... von daher finde ich das äußerst merkwürdig ...
achja und natürlich war es bei beiden der selbe mailserver der angesprochen wurde ;)