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;
}