e-mail ophalen van pop3 server

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Piet De Vries

Piet De Vries

25/10/2010 21:31:48
Quote Anchor link
Ziet iemand waarom onderstaand script soms halve mails leest?

Graag wil ik een functie die alle emails ophaalt van mijn mailserver en deze returned in een array. Hiervoor heb ik onderstaand script gemaakt.

Het probleem is dat dit script soms de mails maar voor de helft leest. print_r geeft dus voor sommige mails de hele mail weer en voor andere slechts de helft. De mail word altijd op hetzelfde punt afgebroken. Het verhogen van de sleep waarde heeft geen effect, net zoals het verwijderen / aanpassen van de explode().

Toelichting bij het script:

het aantal mails word bepaald aan de hand van het aantal regels dat het LIST commando geeft aan de pop server. Mijn server geeft altijd dezelfde hoeveelheid regels, voorbeeld:

+OK POP3
+OK USER
+OK Maildrop ready
list
+OK scan listing follows
1 22214
2 13631
.

Alle mails worden in 1 grote string gezet die later word opgedeeld en in een array geplaatst. De opdeling vind plaats bij de regel +OK, dit zegt de server nadat hij een email heeft toegestuurd.

De sleep / usleep zijn nodig om de mailserver tijd te gunnen voor response. Als ik dit weghaal zal de server alle commandos in een keer ontvangen, en een error terug geven.

functie:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
30
31
32
33
<?php
function getMail($host, $port, $user, $password, $deletemails) {
    $connection = fsockopen($host, $port, $errno, $errstr);
    usleep(500000);
    if(!$connection) {
        echo "Error: $errno - $errstr";
    }

    else {
        fputs($connection, "USER ".$user."\r\n");
        usleep(500000);
        fputs($connection, "PASS ".$password."\r\n");
        usleep(500000);
        fputs($connection, "LIST\r\n");
        usleep(500000);
        $serverOutput = fread($connection, 8000);
        $serverOutput = explode("\n", $serverOutput);
        $numberOfMails = count($serverOutput) - 5;
        for($i = 1; $i <= $numberOfMails ; $i++) {
            fputs($connection, "RETR $i\r\n");
            usleep(200000);
            $emails .= fread($connection, 999999);
            if($deletemails == true) {
                fputs($connection, "DELE $i\r\n");
                $serverOutput = fread($connection, 8000);
            }
        }

        fputs($connection, "QUIT\r\n");
        fclose($connection);
        $emails = explode("+OK", $emails);
        return $emails;
    }
}

?>
Gewijzigd op 25/10/2010 21:38:59 door Piet De Vries
 
PHP hulp

PHP hulp

26/12/2024 23:08:46
 
- SanThe -

- SanThe -

25/10/2010 22:16:47
Quote Anchor link
Je beperkt het lezen met het getal in fread().
 
Piet De Vries

Piet De Vries

25/10/2010 22:32:33
Quote Anchor link
De emails zijn kleiner dan het aantal bytes dat ik meegeef aan fread().

Voor de zekerheid heb ik de php handleiding erop nagezocht en hier staat dat fread stopt met lezen na 8192 bytes (!?). Dit komt ongeveer overeeen met het aantal characters dat ik ontvang.

Het is dus niet mogelijk meer dan 8kb te lezen van een socket connectie met fread(!)

Momenteel ben ik op zoek naar een alternatief, suggesties zijn van harte welkom!
Gewijzigd op 25/10/2010 22:52:49 door Piet De Vries
 
- SanThe -

- SanThe -

25/10/2010 22:51:17
Quote Anchor link
Piet De Vries op 25/10/2010 22:32:33:
hier staat dat fread stopt met lezen na 8192 bytes (!?). Dit komt ongeveer overeeen met het aantal characters dat ik ontvang.


Dan is er een redelijke kans dat er nog meer te lezen is. Misschien een loop maken en alles opslaan in een $var totdat je EOF bereikt.
 
Piet De Vries

Piet De Vries

25/10/2010 22:57:08
Quote Anchor link
Quote:
Dan is er een redelijke kans dat er nog meer te lezen is. Misschien een loop maken en alles opslaan in een $var totdat je EOF bereikt.


Na het ingeven van het commando
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
RETR $berichtnummer \r\n
word de hele email in een keer door de pop3 server toegestuurd. Tussentijds in stukken delen en in een variable opslaan kan jammer genoeg niet.
 
Aad B

Aad B

25/10/2010 22:58:01
Quote Anchor link
Ik heb geen ervaring met mail maar wellicht krijg je een EOF ??
while (!feof($connection)) {
$contents .= fread($handle, 8192);
}

Check ook deze voorbeelden/functies:
http://php.net/manual/en/book.imap.php
Gewijzigd op 25/10/2010 23:00:54 door Aad B
 
Piet De Vries

Piet De Vries

26/10/2010 14:45:28
Quote Anchor link
Het probleem is inmiddels opgelost. De functie socket_read kan wél meer dan 8192 bytes lezen. Om deze functie te gebruiken was het wel nodig de getMail() functie op veel plekken te veranderen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
30
31
32
33
34
<?php

function getMail($host, $port, $user, $password, $deletemails) {
    $connection = fsockopen($host, $port, $errno, $errstr);
    usleep(500000);
    if(!$connection) {
        echo "Error: $errno - $errstr";
    }

    else {
        $socket=socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
        $connection = socket_connect($socket, $host, $port);
        usleep(200000);
        socket_write($socket, "USER ".$user."\r\n", 1024);
        usleep(500000);
        socket_write($socket, "PASS ".$password."\r\n", 1024);
        usleep(500000);
        socket_write($socket, "LIST\r\n", 1024);
        usleep(500000);
                $serverOutput = socket_read($socket, 1024);
                $serverOutput = explode("\n", $serverOutput);
        $numberOfMails = count($serverOutput) - 6;
        for($i = 1; $i <= $numberOfMails ; $i++) {
            socket_write($socket, "RETR $i\r\n", 1024);
                        $emails .= socket_read($socket, 1000000);
                        usleep(100000);
                        }
            
        }

    $emails = explode("+OK", $emails);
        socket_write($socket, "QUIT \r\n", 1024);
        return $emails;
        
    }

?>
 
Chris Martinus

chris Martinus

18/04/2012 12:50:48
Quote Anchor link
Deze discussie is alweer een poosje geleden, maar toch heb ik het laatste script eens uitgeprobeerd.
Ondanks het verlengen van de usleeps en de socket_read, blijft het instabiel en krijg ik soms maar een gedeelte van de informatie uit de pop3server terug. Misschien is er een andere methode.
Wat ik zou willen is het volgende:

Mailen (tekst + foto) naar een website.

a) het uitlezen van de pop3 server
b) uit elkaar peuteren van de mailinformatie
c) relevante onderdelen (subject + bericht + attachment) opslaan in msql
d) plaatsen van de info op de website
e) omzetten van de attachmentinfo (foto) in het jpg formaat (geen idee hoe dit gaat)
f) het plaatsen van de foto op de website.

Graag advies over de verschillende onderdelen, waarvoor mijn dank.

Chris Martinus
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.