GMailFeedクラス
ちょっと今更なネタですが、個人的には最近になって知ったので。。。;-)
GMailのFeedはhttps+BASIC認証なので、取得する仕組みとしてはさほど難しくはありません。phpclassesではGmAtomが登録されていますが、curl拡張モジュールが必要です。まあ、最近はbuildするようにしているので問題はないのですが、curlを使わずにできないかなぁ、と。
ということで、PHPマニュアルにあったStream拡張のサンプルを使って、新着メールを取り出すクラスを作ってみました。結構便利ですよ > Stream拡張
<?php /** * GMailFeedクラス * * @author SHIMOOKA Hideyuki <shimooka@doyouphp.jp> * @create 2006/11/12 */ class GmailFeed { private static $GMAIL_FEED_URL = 'https://mail.google.com/mail/feed/atom'; private $authorization; private $label; /** * コンストラクタ * @param string GMailのユーザー名 * @param password パスワード */ public function __construct($username, $password) { $this->authorization = base64_encode($username . ':' . $password); $this->label = ''; } /** * ラベル名を取得する * @return string ラベル名。初期値は空文字 */ public function getLabel() { return $this->label = $label; } /** * ラベル名を取得する * @param string ラベル名。文字列のみ有効 * @throws RuntimeException */ public function setLabel($label) { if (!is_string($label)) { throw new RuntimeException('Invalid value for label'); } $this->label = $label; } /** * Feedを取得する * @throws RuntimeException */ public function getFeed() { return $this->_get(); } /** * FeedをSimpleXMLElementオブジェクトとして取得する * @throws RuntimeException */ public function getFeedAsSimpleXml() { return new SimpleXMLElement($this->_get()); } private function _get() { $options = array( 'http' => array( 'method' => "GET", 'header' => "Authorization: Basic ". $this->authorization ) ); $context = stream_context_create($options); $url = self::$GMAIL_FEED_URL; if ($this->label !== '') { $url .= '/' . $this->label; } $fp = @fopen($url, 'rb', false, $context); if ($fp === false) { throw new RuntimeException('Failed to connect'); } $contents = @stream_get_contents($fp); if ($contents === false) { throw new RuntimeException('Failed to get contents'); } fclose($fp); return $contents; } }
クライアント側は次のような感じ。
<?php require 'GmailFeed.class.php'; $username = 'YOUR USERNAME'; $password = 'YOUR PASSWORD'; /** * 未読メールのFeedを取得 */ $gmail = new GmailFeed($username, $password); var_dump(mb_convert_encoding($gmail->getFeed(), mb_internal_encoding(), 'utf-8')); /** * 未読メールのFeedをSimpleXMLElementオブジェクトを取得 */ $elements = $gmail->getFeedAsSimpleXml(); echo '<ul>'; foreach ($elements->entry as $entry) { $title = mb_convert_encoding($entry->title, mb_internal_encoding(), 'utf-8'); printf('<li>[%s] <a href="%s" title="%s">%s</a></li>', $entry->issued, $entry->link['href'], $title, $title); } echo '</ul>'; /** * ラベル「phpsec」が付いた未読メールのFeedを * SimpleXMLElementオブジェクトを取得 */ $gmail->setLabel('phpsec'); $elements = $gmail->getFeedAsSimpleXml(); echo '<ul>'; foreach ($elements->entry as $entry) { $title = mb_convert_encoding($entry->title, mb_internal_encoding(), 'utf-8'); printf('<li>[%s] <a href="%s" title="%s">%s</a></li>', $entry->issued, $entry->link['href'], $title, $title); } echo '</ul>'; try { /** * RuntimeExceptionが発生する */ $gmail->setLabel(null); } catch (Exception $e) { var_dump($e->getMessage()); }
動作確認はPHP5.2.0のみです。SimpleXMLをサポートしてるなら、PHP5.1.xでも動作すると思います。あと、クラス側はちょこっと書き換えれば、PHP4向けにもなると思います。
やっぱ、SimpleXML便利すぎ! :-D