e-mail ophalen van pop3 server
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)
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
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;
}
}
?>
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
Je beperkt het lezen met het getal in 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
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.
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 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.
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
Code (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
30
31
32
33
34
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;
}
?>
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;
}
?>
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