30 April 2009

(PHP) Pear Net_IMAPでメール受信

PHPでPear Net_IMAPライブラリを用いてIMAPサーバ上のメールを読み出すプログラム。必要な関数部分のみ、抜粋して記載する。なお、Net_IMAPの日本語化が必要な場合は、こちらの記事のパッチを適用する必要がある。

共通設定

// 言語と文字コードの設定 mb_language('Japanese'); mb_internal_encoding('UTF-8'); mb_http_output('SJIS'); // PearのNet_IMAPを利用する require_once('Net/IMAP.php'); require_once('Net/IMAPProtocol.php'); // 日本語対応パッチ済み

メールボックス一覧を表示する関数

function viewgmail_mboxlist() { // IMAPサーバに接続する $imap = new Net_IMAP('ssl://imap.example.com', 993); if(PEAR::isError($imap->login('ユーザ名', 'パスワード'))) { print("IMAPサーバへの接続に失敗\n"); return; } // メールボックス一覧の取得 $arrMbox = $imap->getMailboxes(); if(PEAR::isError($arrMbox)) { $imap->disconnect(); print("メールボックス一覧が取得できませんでした\n"); return; } // メールボックス一覧を表示 if (is_array($arrMbox)) { foreach ($arrMbox as $nMboxId => $strMboxName) { $strMboxName = mb_convert_encoding($strMboxName, 'SJIS', 'auto'); $strMboxName = htmlspecialchars($strMboxName, ENT_QUOTES, 'SJIS'); printf("%02d : %s\n", $nMboxId, $strMboxName); } } // IMAPサーバから切断 $imap->disconnect(); return; }

指定されたメールボックスの、メールタイトル一覧を表示する関数

function viewgmail_maillist($nMboxId) { // IMAPサーバに接続する $imap = new Net_IMAP('ssl://imap.example.com', 993); if(PEAR::isError($imap->login('ユーザ名', 'パスワード'))) { print("IMAPサーバへの接続に失敗\n"); return; } // メールボックス一覧の取得 $arrMbox = $imap->getMailboxes(); if(PEAR::isError($arrMbox)) { $imap->disconnect(); print("メールボックス一覧が取得できませんでした\n"); return; } if(!isset($arrMbox[$nMboxId])) { $imap->disconnect(); print("存在しないメールボックスを指定しました\n"); return; } // 指定されたメールボックスを開く(指定する) if(PEAR::isError($imap->selectMailbox(mb_convert_encoding($arrMbox[$nMboxId], 'UTF-8', 'auto')))) { $imap->disconnect(); print("メールボックスが開けません\n"); return; } // メール数を得る $n = $imap->getNumberOfMessages(); if(PEAR::isError($n)) { $imap->disconnect(); print("メールボックス内のメール数が取得できません\n"); return; } // メールタイトル一覧を表示する(管理番号が大きい順) for($i=$n; $i>=; $i--) { $header = $imap->getParsedHeaders($i); if(PEAR::isError($header)) { // ヘッダが読めなかった場合 printf("%03d : 記事名読み込みエラー\n", $i); continue; } $senddate = mb_decode_mimeheader($header['Date']); $senddate = htmlspecialchars($senddate); $arrSenddate = date_parse($senddate); $from = mb_decode_mimeheader($header['From']); $from = mb_convert_encoding($from, 'SJIS', 'auto'); $from = mb_strcut($from, 0, mb_strlen($from)>10? 10:mb_strlen($from)) . '...'; $from = htmlspecialchars($from, ENT_QUOTES, 'SJIS'); $subj = mb_decode_mimeheader($header['Subject']); $subj = mb_convert_encoding($subj, 'SJIS', 'auto'); $subj = htmlspecialchars($subj, ENT_QUOTES, 'SJIS'); if(!strlen($subj)) $subj = '記事名が存在しない記事'; printf("%03d : %04d/%02d/%02d : %s : %s\n", $i, $arrSenddate['year'], $arrSenddate['month'], $arrSenddate['day'], $from, $subj); } // IMAPサーバから切断 $imap->disconnect(); return; }

指定されたメールボックス、メッセージ番号のメール本文を表示する関数

function viewgmail_readmsg($nMboxId, $nMsgId) { // IMAPサーバに接続する $imap = new Net_IMAP('ssl://imap.example.com', 993); if(PEAR::isError($imap->login('ユーザ名', 'パスワード'))) { print("IMAPサーバへの接続に失敗\n"); return; } // メールボックス一覧の取得 $arrMbox = $imap->getMailboxes(); if(PEAR::isError($arrMbox)) { $imap->disconnect(); print("メールボックス一覧が取得できませんでした\n"); return; } if(!isset($arrMbox[$nMboxId])) { $imap->disconnect(); print("存在しないメールボックスを指定しました\n"); return; } // 指定されたメールボックスを開く(指定する) if(PEAR::isError($imap->selectMailbox(mb_convert_encoding($arrMbox[$nMboxId], 'UTF-8', 'auto')))) { $imap->disconnect(); print("メールボックスが開けません\n"); return; } // メール本文の読み込み $body = $imap->getBody($nMsgId); if(PEAR::isError($body)) { print("メール本文 読み込み不能\n"); } else { $body = mb_convert_encoding($body, 'SJIS', 'auto'); $body = htmlspecialchars($body, ENT_QUOTES, 'SJIS'); print($body); } // IMAPサーバから切断 $imap->disconnect(); return; }