PHPのIMAP関数を使って楽天カードの「【速報情報】カード利用お知らせメール」を取得し、楽天カード利用明細をデータベースに保存する

スーパーやコンビニで買い物する際、楽天カードで支払いを済ませているのですが、楽天カードの利用情報が「楽天e-NAVI」に即日反映されず、正確な利用金額の合計がわからず困っていました。

楽天カードには利用情報が「楽天e-NAVI」に即日反映されない代わりに、「【速報情報】カード利用お知らせメール」というサービスがあります。このサービスは前日の楽天カードの利用明細を午前11時頃にメールでお知らせしてくれるものです。

このメールをチェックしてエクセルなどで利用金額を更新していけば当月の利用金額の合計が分かるのですが、これはちょっと面倒くさいですよね…。

なので、定期的に「【速報情報】カード利用お知らせメール」を取得して、利用金額をデータベースに保存するプログラムを書くことにしました。

以下、ソースコードです。

ちなみに以下のソースコードはGメールでメールを受信している場合のみ動作します。

class RakutenCard
{
	private $server = "imap.gmail.com";
	private $port = 993;
	private $account = "ここにGメールアドレスを入れて下さい";
	private $password = "ここにGメールアドレスのパスワードを入れて下さい";

	public function __construct()
	{
		if(($mbox = imap_open("{" . $this->server . ":" . $this->port . "/novalidate-cert/imap/ssl}INBOX", $this->account, $this->password)) === FALSE)
		{
			echo "メールサーバーに接続できない、またはアカウント・パスワードが間違っています。";
			exit;
		}

		// 件名が【速報情報】カード利用お知らせメールのメールを探す
		$mids =imap_search($mbox, 'SUBJECT "【速報情報】カード利用お知らせメール"', SE_FREE, 'UTF-8');

		$data = array();
		foreach($mids as $mid){
			$struct = imap_fetchstructure($mbox, $mid);

			// body部の型がmultipartかチェック
			if($struct->type == 1){

				// テキストメールのみ取得
				$section = array_filter($struct->parts, function($psrt){
					return (strtoupper($psrt->subtype) == 'PLAIN');
				});

				// 本文中の特定のセクションを取得
				$body = imap_fetchbody($mbox, $mid, key($section) + 1, FT_INTERNAL);
				$body = mb_convert_encoding($body, 'UTF-8', 'auto');

				// 利用日を取得
				preg_match_all('/■利用日: ([0-9]{4}\/[0-9]{2}\/[0-9]{2})/', $body, $date);

				// 利用金額を取得
				preg_match_all('/■利用金額: ([0-9,]+) 円/', $body, $price);

				// 利用日と利用金額をマージする
				for($i = 0; $i < count($date[1]); $i++){
					$data[] = array(
						'price' => str_replace(',', '', $price[1][$i]),
						'date'  => date('Y-m-d', strtotime($date[1][$i]))
					);
				}
			}
		}

		/**
		 * ここにデータベースに保存する処理を書く
		 */

		// メールを閉じる
		imap_close($mbox);
	}
}

new RakutenCard;

上記プログラムをcronで定期的に実行させればデータベースに利用金額が保存されます。

あとは集計プログラムを用意すれば完成です。

お気軽にコメントをどうぞ

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください