niiyz
8/18/2014 - 1:19 PM

Gmailを取得し添付ファイルのWord文書を保存。

Gmailを取得し添付ファイルのWord文書を保存。

<?php
setlocale(LC_ALL, 'ja_JP.UTF-8');// pathinfo()日本語対応
/**
 * Created by PhpStorm.
 * User: tetsuya
 * Date: 2014/08/15
 * Time: 10:06
 * Gmailを読み込み添付ファイルを保存
 */

class Gmail {
	// IMAP
	protected $imap;
	
	// アカウント情報
	const SERVER = 'imap.googlemail.com';
	const PORT = 993;
	const ACCOUNT = 'hoge@gmail.com';
	const PASSWORD = 'hogehoge';
	const LABEL = 'INBOX';
	
	// ボディタイプ 参考:http://jp2.php.net/manual/ja/function.imap-fetchstructure.php
	const BODY_TYPE_APPLICATION = 3;
	
	// 保存設定
	protected $extensionList = array('doc', 'docx');
	protected $saveDir = './';
	
	const DEBUG_MODE = true;
	
	public function __construct()
	{
		// メールボックス
		$mailBox = '{'.self::SERVER.':'.self::PORT.'/novalidate-cert/imap/ssl}'.self::LABEL;
		// メールサーバ接続
		$this->imap = imap_open($mailBox, self::ACCOUNT, self::PASSWORD);
		
		if ($this->imap && imap_num_msg($this->imap) > 0) {
			# メール検索条件
			if (self::DEBUG_MODE) {
				# 1日前〜
				$time = mktime(0, 0, 0, date("m")  , date("d")-1, date("Y"));
				$since = date('d-F-Y', $time);
				$search = "SINCE $since";
			} else {
				# 未読
				$search = 'UNSEEN ';
			}
			# メール検索
			$mailList = imap_search($this->imap, $search);
			if ($mailList) {
				$n = count($mailList);
				print 'メール:'.$n.'件<br>';
				for ($i = 0;$i < $n;$i ++) {
					# メール番号
					$mailNo = $mailList[$i];
					# ドキュメント保存
					$this->saveDocs($mailNo);
				}
			} else {
				print '新規メールはありませんでした。<br>';
			}
			imap_close($this->imap);
		}
	}
	
	# ドキュメント保存
	protected function saveDocs($mailNo) {
		# メール情報
		$info = imap_fetchstructure($this->imap, $mailNo);
		if (!isset($info->parts) || !is_array($info->parts)) {
			return;
		}
		$n = count($info->parts);
		for ($i = 0;$i < $n;$i ++) {
			# パート
			$part = $info->parts[$i];
			$partNo = $i + 1;
			# ボディ取得(既読にする)
			$body = imap_fetchbody($this->imap, $mailNo, $partNo, FT_INTERNAL);
			# 種類
			if ($part->type != self::BODY_TYPE_APPLICATION || !isset($part->dparameters)) {
				continue;
			}
			# ファイル名
			$fname = imap_mime_header_decode($part->parameters[0]->value);
			if ($fname[0]->charset != 'default') {
				$originalFilename = mb_convert_encoding($fname[0]->text, 'utf-8', $fname[0]->charset);
			} else {
				$originalFilename = $fname[0]->text;
			}
			# 拡張子
			$extension = pathinfo($originalFilename, PATHINFO_EXTENSION);
			if (!in_array($extension, $this->extensionList)) {
				continue;
			}
			# デコード
			$body = imap_base64($body);
			# 保存
			$filename = pathinfo($originalFilename, PATHINFO_FILENAME);
			$saveFilename = $filename.'_'.date('Ymd_Hi').'.'.$extension;
			$savePath = $this->saveDir.$saveFilename;
			if ($fp = fopen($savePath, "w")) {
				$length = strlen($body);
				fwrite($fp, $body, $length);
				fclose($fp);
				print '保存ファイル: '.$saveFilename.'<br>';
			}
		}
	}
}

new Gmail();