PHPでPOP3メール受信 | 広島で働くアフロなSE・PGの覚え書。

PHPでPOP3メール受信

とあるPJで必要になったPOP3プロトコルでのメール受信。

よくありそうなHPからフォーム入力した値がSMTPでメール送信されて

それをPHPからPOP3で取得するというモノ。


如何せんPHPでの開発資産が少ない私としては手元に有用なネタがないにひひ

早速ネットで調べてみると

-------------------------------------------------------------------------------

・IMAP関数(http://jp2.php.net/manual/ja/ref.imap.php

・PEAR::Net_POP3関数(http://www.go-pear.org/manual/ja/package.networking.net-pop3.php

・fsockopen関数

-------------------------------------------------------------------------------

上記3手法がヒット。



//---------------------------------------------------------------------------
// imap関数利用
//---------------------------------------------------------------------------
// POP3サーバ接続
$mbox = @imap_open("{hogehoge.jp:110/pop3/notls}INBOX", "test@hogehoge.jp ", "hoge");

// メール取得
if ($mbox == false) {
echo 'メール取得に失敗しました。(POP3サーバへの接続に失敗) ';
print_r(imap_errors());
} else {
// 新着メッセージを取得
// $mboxes = imap_check($mbox);
// $mail_cnt = $mboxes->Nmsgs;
$mboxes = imap_mailboxmsginfo($mbox);
$mail_cnt = $mboxes->Unread;

if ($mail_cnt > 0) {
for ($i = 1; $i <= $mail_cnt; $i++) {
// ヘッダ・ボディを格納
$head = imap_header($mbox, $i);
$body = imap_body($mbox, $i, FT_INTERNAL);

// 本文を改行でセパレートし、配列へ格納
$bodyMessages = split("\n", mb_convert_encoding($body, "EUC-JP", "JIS"));

foreach ($bodyMessages as $key => $value) {
if ($value != '' && (substr($value, 0, 8) == '【申請】')) {
echo '['.substr($value, 8).']';
// 既読フラグセット
if (imap_setflag_full($mbox, $i, "\\Seen \\Flagged \\Deleted ")) {
// 成功
} else {
// 失敗
echo '既読フラグセットに失敗 ';
print_r(imap_errors());
break 2;
}
break 1;
}
}
}
} else {
echo '新着メッセージはありません ';
}

// 削除用にマークされたすべてのメッセージを削除する
imap_expunge($box);

// POP3サーバ切断
imap_close($mbox);
}

→メールを読む事は出来るのだが、既読フラグや削除フラグが設定出来ない。。。

 POP3接続ではなくIMAP接続だと上手く行くのだろうか。。。

 後、PHPのインストール環境等によっては使用出来ないらしい。



//---------------------------------------------------------------------------
// PEAR::Net_POP3関数利用
//---------------------------------------------------------------------------
require_once('Net/POP3.php');
mb_language("ja");
mb_internal_encoding("EUC-JP");

$pop3 = new Net_POP3();

$ret = $pop3->connect("hogehoge.jp", 110);
if ($ret) {
echo '接続OK ';

$ret = $pop3->login("test@hogehoge.jp ", "hoge", false);
if ($ret) {
echo 'ログインOK ';

$ret = $pop3->numMsg();
echo 'メッセージ件数:'.$ret.'件 ';

$ret = $pop3->getListing();
$i = 1;
if ($ret !== false) {
foreach ($ret as $key => $value) {
$body = $pop3->getBody($i);
echo '['.mb_convert_encoding($body, "EUC-JP", "JIS").'] ';
$pop3->deleteMsg($i);
$i++;
}
}
} else {
echo 'ログインNG ';
}
} else {
echo '接続NG ';
}
$pop3->disconnect();

→「pear install Net_POP3」でインストール。

 これも上手く削除出来ない。う~ん時間がないのでとりあえず次っ!



//---------------------------------------------------------------------------
// SOCK関数利用
//---------------------------------------------------------------------------

// ソケットオープン
$socket = fsockopen('hogehoge.jp', 110, $error_no, $error_message, 10);
if ($socket !== false) {
// 接続に成功
$buffer = fgets($socket, 512);
if (substr($buffer, 0, 3) != '+OK') {
// ソケットクローズ
fputs($socket, "QUIT \r\n");
fclose($socket);
} else {
// USERコマンド発行
fputs($socket, "USER test@hogehoge.jp\r\n ");
$buffer = fgets($socket, 512);
if (substr($buffer, 0, 3) != '+OK') {
// ソケットクローズ
fputs($socket, "QUIT \r\n");
fclose($socket);
} else {
// PASSコマンド発行
fputs($socket, "PASS hoge\r\n");
$buffer = fgets($socket, 512);
if (substr($buffer, 0, 3) != '+OK') {
// ソケットクローズ
fputs($socket, "QUIT \r\n");
fclose($socket);
} else {
// STATコマンド発行
fputs($socket, "STAT"."\r\n");
$buffer = fgets($socket, 512);
if (substr($buffer, 0, 3) != '+OK') {
// ソケットクローズ
fputs($socket, "QUIT \r\n");
fclose($socket);
} else {
// 戻り値より、メール件数・サイズを取得
$data = $buffer;
sscanf($data, '+OK %d %d', $num, $size);
// RETRコマンド発行
$m_data = array();
for ($i=1; $i<=$num; $i++) {
$line = fputs($socket, "RETR ".$i." \r\n");
while (!ereg("^\.\r\n", $line)) {
$line = fgets($socket, 512);
$m_data[$i-1] .= $line;
}
// 取得したら削除する
fputs($socket, "DELE ".$i." \r\n");
if (substr($buffer, 0, 3) != '+OK') {
// ソケットクローズ
fputs($socket, "QUIT \r\n");
fclose($socket);
} else {
$data = $buffer;
}
}
// ソケットクローズ
fputs($socket, "QUIT \r\n");
fclose($socket);
}
}
}
}
} else {
// 接続に失敗
}

//print_r($m_data);
foreach ($m_data as $key => $value) {
$test = split("\n", mb_convert_encoding($value, "EUC-JP", "JIS"));
print_r($test);
}
echo 'メール件数['.$num.']件、サイズ['.$size.']byte';

→1番原始的な方法。(のように思われる)



う~ん、どれを採用しようか。。。