[PHP]fsockopen/fputs probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • xantos
  • Registratie: Juni 1999
  • Niet online
Ik probeer door middel van onderstaande code een mail te versturen:

$handle = fsockopen($smtpserver, $port);
fputs($handle, "HELO domein.nl\r\n");
fputs($handle, 'MAIL FROM: info@test.nl\r\n');
fputs($handle, 'RCPT TO: test@test.nl\r\n');
fputs($handle, 'DATA\r\n');
fputs($handle, 'test mailtje\r\n.\r\n');
fputs($handle, 'QUIT\r\n');
fclose($handle);

Het probleem is dus dat bijvoorbeeld: fputs($handle, "HELO domein.nl\r\n");
niet wordt uitgevoerd. Als ik na dit commando fgets($handle,256) opvraag dan zie ik nog steeds
220 mail.test.nl Microsoft ESMTP MAIL Service, Version: 5.0.2195.6713 ready at Mon, 27 Oct 2003 16:39:31 +0100 staan. Alsof er net een connectie is gemaakt. Mijn HELO commando wordt dus gewoon genegeerd. Althans daar lijkt het op.

Voer ik deze commando's gewoon uit d.m.v. een telnet sessie dan werkt het zonder problemen. De mailserver waarop ik dit test is een exchange server die verder prima werkt. Ik heb search gebruikt en alle relevante posts doorgelezen.

Het lijkt dus wel dat de fputs commando's niks doen omdat de mailserver niks anders laat zien als bovenvermelde regel. Eigenlijk zou ik na de HELO een status code 250 moeten zien, als teken dat de HELO succesvol is.

Weet iemand misschien wat hier de oorzaak van kan zijn?

Acties:
  • 0 Henk 'm!

  • Jurgle
  • Registratie: Februari 2003
  • Laatst online: 24-06 00:27

Jurgle

100% Compatible

Mocht de code een directe copy paste zijn uit de originele code dan zou ik niet weten wat er mis is. Anders heb ik misschien wel een idee:

Wat in ieder geval fout gaat bij bovenstaande code is dat je bij alle fputs() commando's (behalve HELO) single quotes gebruikt. Dan worden \r en \n niet geparsed naar een harde return. Kijk eens in je originele code of je die wel overal gebruikt.

Een commando naar een SMTP server wordt nl afgesloten met \r\n tekens (is per server/os trouwens weer anders, sommigen nemen genoegen met alleen \n or \r maar \r\n is wel het veiligst). Zolang je dus geen \r\n geeft, blijft de SMTP server wachten op meer input. Dus je moet met alle fputs double quotes gebruiken: "

Probeer maar eens "test\r\ntest" en 'test\r\ntest' te echo-en

My opinions may have changed but not the fact that I am right ― Ashleigh Brilliant


Acties:
  • 0 Henk 'm!

  • xantos
  • Registratie: Juni 1999
  • Niet online
Mijn code is inderdaad copy paste. Ik heb de single quotes vervangen door dubbele. Maar helaas zonder resultaat. :'(

Het HELO commando wordt gewoon volkomen genegeerd! Wat kan er verder nog mis zijn??

Acties:
  • 0 Henk 'm!

  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Het bericht wat jij nu ziet is een welkomstbericht van de server. Dit krijg je dus te zien zodra je connect. Na de HELO krijg je een tweede bericht, de acknowledgement van de HELO. Als je dus ook voor het commando een fgets() doet, of twee keer erna, dan zul je als het goed is wel de ack te zien krijgen.
Dus bijvoorbeeld
code:
1
2
3
220 smtp.domein.nl ESMTP sendmail 8.12.10/2.03 ready at Tue, 28 Oct 2003 08:56:36 +0100 (MET)
HELO domein.nl
250 smtp.domein.nl Hello, pleased to meet you

(sorry voor verkloten layout...)

[ Voor 32% gewijzigd door SWfreak op 28-10-2003 08:58 ]


Acties:
  • 0 Henk 'm!

  • Kwai_gon_jinn
  • Registratie: Januari 2001
  • Niet online

Kwai_gon_jinn

[-geen icon-]

Jurgle schreef op 28 October 2003 @ 01:17:
Mocht de code een directe copy paste zijn uit de originele code dan zou ik niet weten wat er mis is. Anders heb ik misschien wel een idee:

Wat in ieder geval fout gaat bij bovenstaande code is dat je bij alle fputs() commando's (behalve HELO) single quotes gebruikt. Dan worden \r en \n niet geparsed naar een harde return. Kijk eens in je originele code of je die wel overal gebruikt.

Een commando naar een SMTP server wordt nl afgesloten met \r\n tekens (is per server/os trouwens weer anders, sommigen nemen genoegen met alleen \n or \r maar \r\n is wel het veiligst). Zolang je dus geen \r\n geeft, blijft de SMTP server wachten op meer input. Dus je moet met alle fputs double quotes gebruiken: "

Probeer maar eens "test\r\ntest" en 'test\r\ntest' te echo-en
volgens het mail protocol (SMTP) moet je netjes \r\n gebruiken.

fgets($handle, 256); <-- zal wel werken.. maar zoals je zei. .hij laat alleen zien dat hij net een verbinding tot stand heeft gebracht. Echter heb je maar 1 regel opgehaald ipv alle regels..
plaats eens na of voor de fputs($handle, 'QUIT'); en je zult zien waar eventueel fout zit bij het inloggen of versturen van jou test mailtje.

Confucius said: "In ancient time, learning was for self. Nowadays learning is for others."


Acties:
  • 0 Henk 'm!

Verwijderd

ik heb hetzelfde problemen ook eens gehad. Ik gebruik nu onderstaande code om mail te versturen naar een local smtp server.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?
    $sp = fsockopen($smtp,$port, $errno, $errstr, 45);
    
    $cmd = "HELO ".$smtp."\r\n";
    fputs($sp,$cmd,strlen($cmd));
    
    $wait = true; $ret = "";
    while ($wait) {
        $ret = fgets($sp, 1024);
        if (preg_match("/^(250)/i", $ret)) {
            $wait = false;
        }
    }
    
    fputs($sp,$file[0],strlen($file[0])); // MAIL FROM:
    
    $wait = true; $ret = "";
    while ($wait) {
        $ret = fgets($sp, 1024);
        echo $ret."\n";
    
        if (preg_match("/(250)/i", $ret)) {
            $wait = false;
        }
    
    }

    // nog meer code voor RCPT regels
?>


script gaat 1 voor 1 alle bestanden in een directory af, in die bestanden staan alle mail commands inclusief bericht. Het enige wat het script doet, is regel voor regel versturen naar de smtp server.

Wat je ook nog zou kunnen doen, is een telnet verbinding openen naar die smtp server (telnet adres 25), als dat kan. En dan zelf 1 voor 1 je mail commands geven. Je kan dan zien wat voor data je van de smtp server krijgt.

Acties:
  • 0 Henk 'm!

  • xantos
  • Registratie: Juni 1999
  • Niet online
Het werkt nu eindelijk als ik na iedere regel een $res=fgets($handle,256); uitvoer.
fputs($handle, "HELO $mydomain\r\n");
$res=fgets($handle,256);
fputs($handle, "MAIL FROM: <info@schulinck.nl>\r\n");
$res=fgets($handle,256);
fputs($handle, "RCPT TO: <$email>\r\n");
$res=fgets($handle,256);
fputs($handle, "DATA\r\n");
$res=fgets($handle,256);
fputs($handle, "$message\r\n.\r\n");
$res=fgets($handle,256);
fputs($handle, "QUIT\r\n");
fclose($handle);

Waarom weet ik niet. :?

Acties:
  • 0 Henk 'm!

  • Kwai_gon_jinn
  • Registratie: Januari 2001
  • Niet online

Kwai_gon_jinn

[-geen icon-]

je kunt met die $res ook controleren of je een +OK reply van de server af krijgt. Zou nog netter wezen dan elke output op het beeldscherm te tonen :+

Confucius said: "In ancient time, learning was for self. Nowadays learning is for others."


Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
Kwai_gon_jinn schreef op 28 October 2003 @ 09:54:
je kunt met die $res ook controleren of je een +OK reply van de server af krijgt. Zou nog netter wezen dan elke output op het beeldscherm te tonen :+
Yep, zie http://cvs.sourceforge.ne....php?rev=1.17&view=markup

voor de functie errorCheck waar ook de betekenis van de mogelijke return codes staan.

Acties:
  • 0 Henk 'm!

  • BierPul
  • Registratie: Juni 2001
  • Laatst online: 12-09 14:07

BierPul

2 koffie graag

Ik ben hier ook mee bezig maar kan je niet de smtp van de ontvanger gebruiken dat lijkt me vele malen sneller :)

Bijvoorbeeld ik heb 10.000 mails voor planet.nl domeinen ik open een socket naar de mailserver voor planet.nl (via getmxrec()) en lever ineens alles mailtjes af :)

Volgens mij mag een smtp server namelijk altijd lokale mails afleveren.

Dan win je naar mijn inziens nog veel meer connecties die niet gesloten en geopend hoeven te worden :)

Ja man


Acties:
  • 0 Henk 'm!

  • Kwai_gon_jinn
  • Registratie: Januari 2001
  • Niet online

Kwai_gon_jinn

[-geen icon-]

BierPul schreef op 28 October 2003 @ 13:00:
Ik ben hier ook mee bezig maar kan je niet de smtp van de ontvanger gebruiken dat lijkt me vele malen sneller :)

Bijvoorbeeld ik heb 10.000 mails voor planet.nl domeinen ik open een socket naar de mailserver voor planet.nl (via getmxrec()) en lever ineens alles mailtjes af :)

Volgens mij mag een smtp server namelijk altijd lokale mails afleveren.

Dan win je naar mijn inziens nog veel meer connecties die niet gesloten en geopend hoeven te worden :)
Die oplossing werkt alleen als je massa mails verstuurd met hetzelfde domain name in het mail adres. Als je bijv 3000 planet.nl adressen hebt en resterende 7000 adressen allemaal verschillende adressen zouden wezen zou je dus 7001 connecties moeten maken om ze allemaal te kunnen versturen. Natuurlijk kun je er een check op maken. Maar waarom die snelheids winst willen behalen tenopzichte van minder geheugen in beslag nemen en 1 connectie maken (1 SMTP sessie is al snel genoeg ).

Confucius said: "In ancient time, learning was for self. Nowadays learning is for others."

Pagina: 1