【php】POP3でメールを読む
問題
phpで、他のライブラリなどを使わないで、メールサーバーにあるメールをpopで読み出したい。
答え
fsockopen()関数を使う。
ごく普通の110番ポートのSSL無しのPOP3の場合。
<?php //設定 $a = array( 'host' => 'mail.example.com', 'user' => 'softel@example.com', 'pass' => '1234abcd', ); //110番ポートで接続する $fp = fsockopen('tcp://' . $a['host'] . ':110', 110, $err, $errno, 10); //認証 $r = fgets($fp, 1024); //+OK fputs($fp, 'USER ' . $a['user'] . "\r\n"); $r = fgets($fp, 1024); //+OK fputs($fp, 'PASS ' . $a['pass'] . "\r\n"); $r = fgets($fp, 1024); //+OK or +ERR //STAT 何件あるの? fputs($fp, "STAT\r\n"); $r = fgets($fp, 1024); sscanf($r, '+OK %d %d', $num, $size); //結果表示 var_dump($num, $size); //メールデータ取得(件数分 RETR) $data = array(); for ($i = 1; $i <= $num; ++$i) { //RETR n -n番目のメッセージ取得(ヘッダ含) fputs($fp, 'RETR ' . $i . "\r\n"); //+OK $r = fgets($fp, 512); //EOFの.まで読む $d = null; do { $line = fgets($fp, 512); $d .= $line; } while (!ereg("^\.\r\n", $line)); $data[$i] = $d; //DELE n n番目のメッセージ削除(読んだら削除したいとき) //fputs($fp, 'DELE ' . $i . "\r\n"); //fread($fp,1024); } //結果表示 var_dump($data); //さようなら fputs($fp, "QUIT\r\n"); fgets($fp, 1024);
補足
gmailの場合、SSLありで995番ポートを使うことになる。
$fp = fsockopen('ssl://' . $a['host'] . '', 995, $err, $errno, 10);
上を実行するときは、OpenSSLが有効であること。
コメント