On Fri, 2018-12-07 at 09:12 +0700, Yeni Setiawan wrote: Hi John,
I'm wondering why didn't you use IMAP functionality to access POP3 server? Despite its name, it can be used to access POP3 too.
It's pretty easy and straightforward.
I am trying to get e-mails one at a time from a pop3 mail server. I can open
the pop3 socket on port 110 using
fsockopen(tcp://127.0.0.1, 110, $errno, $errstr)
and I have no problem logging on to the mail account and issuing the LIST and
RETR commands.
BUT getting the actual email has me stumped. Using fgets() works OK IF I can
tell it how many lines to expect. If not, it runs off the end of the file and I
have to cancel the job manually. If I use the code in the fread() documentation
it does the same thing:
$message = "";
while (! feof($mail_sock))
{
$message .= fread($mail_sock, 8192);
}
hangs at the end of the email and I need to cancel manually. Putting an echo
command right after the fread() statement shows that the entire message arrives
correctly before it hangs.
I have tried checking for the ".\r\n" standard pop3 EOF indicator and breaking
out of the while loop when I find it but that is unstable, that combination
occurred during testing in a random email. Same thing happened using fgets()
before I started trying fread().
For completeness, stream_get_contents($mail_sock, 8192) also fails with the same
overrun problem and I can't see the actual data to set an EOF trap.
I thought maybe the problem would be that the socket was blocking so I framed
the fread() call as:
stream_set_blocking($mail_sock, false);
while (! feof($mail_sock))
{
$message .= fread($mail_sock, 8192);
echo "\n" . $message;
}
stream_set_blocking($mail_sock, true);
This results in a runaway read of the same email over and over and the programme
needs to be cancelled manually. Obviously, the feof() command is inactive in
this situation but I don't know why. (bug???)
However, if I remove the while loop and run it, I sometimes get the first line
of the email and sometimes nothing; that is, the fread() command doesn't wait
for the server to respond.
One workaround that I found was to set the socket timeout to a fairly short
value and most of the time this works. Unfortunately the server occasionally
doesn't respond within the short timeout and the e-mail is truncated. Longer
timeouts (like 30 seconds) create throughput problems for the application.
At a guess, I suspect that the pop3 server doesn't send any indication at the
end of each e-mail, just stops sending, but I can't prove that and I can't think
of a reliable way to deal with it.
Does anyone have any suggestions? I've been playing with this for quite a while
without any success. :-(
I finally got back to this and I wonder where you downloaded the c-client library and the PHP IMAP extensions from? The University of Washington download link responds with a 404 error when I try to access it, and while the PHP IMAP functions are documents in the PHP manual, they are not present in the version I have installed (PHP 7.2.9), probably because the c-client library isn't installed. I checked the Fedora repository and no luck there either.
Any suggestions?
Regards,
John ===============================================
|