SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 社員募集 ...

【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が有効であること。

関連するメモ

コメント