CakePHPで不達メールの一覧を取得するモデルを作ってみた

お問い合わせフォームからメールを送信することもままあると思いますが、
不達メールの問題はついて回るかと思います。

そこでPOP3でメールサーバに接続し不達メールの一覧を取得するモデルを作ってみました。

<?php
/**
 * 不達メールモデル
 */
class BounceMail extends AppModel {
  var $useTable = false;
  var $name = 'BounceMail';
  
  var $mboxconnstr  = "{メールサーバーホスト名:110/pop3}INBOX";
  var $user          = "ユーザー名";
  var $passwd        = "パスワード";
  var $subject      = "Undelivered Mail Returned to Sender";
  
  function find($conditions = null, $extra = array()) {
    $records = array();
    $mbox    = imap_open($this->mboxconnstr, $this->user, $this->passwd);
    if ($mbox == false) {
      return $records;
    }
    $mail_check    = imap_check($mbox);
    for($i=1;$i<=$mail_check->Nmsgs;$i++) {
      $headinfo  = imap_headerinfo($mbox, $i);
      $bodyinfo  = imap_body($mbox, $i);
      if ($headinfo->Subject == $this->subject) {
        $rtn = preg_match("/<.+@.+?>/", $bodyinfo, $rslt);
        if ($rtn == true) {
          if (is_array($rslt)) {
            foreach($rslt as $key=>$val) {
              if (!empty($conditions)) {
                foreach($conditions as $condition){
                  // 日付範囲指定の条件
                  if (isset($condition['dateFrom'])) {
                    if (date("Ymd", strtotime($headinfo->date)) < date("Ymd", strtotime($condition['dateFrom']))) {
                      continue 2;
                    }
                  }
                  if (isset($condition['dateTo'])) {
                    if (date("Ymd", strtotime($headinfo->date)) > date("Ymd", strtotime($condition['dateTo']))) {
                      continue 2;
                    }
                  }
                }
              }
              $records[$i]["datetime"]  = date("Y-n-j H:i:s", strtotime($headinfo->date));
              $records[$i]["mail"]      = rtrim(ltrim($val, "<"), ">");
              break;
            }
          }
        }
      }
    }
    imap_close($mbox);
    return $records;
  }
  
  function paginateCount($conditions = null, $recursive = 0, $extra = array()) {
    $rslt = $this->find($conditions, $extra);
    $count = count($rslt);
    return count($rslt);
  }

  function paginate($conditions, $fields, $order, $limit, $page = 1, $recursive = null, $extra = array()) {
    $rslt = $this->find($conditions, $extra);
    $records = array();
    $end = $page * $limit;
    $start = $end - $limit + 1;
    $i = 0;
    foreach($rslt as $row){
      if (++$i >= $start && $i <= $end) {
        $records[] = $row;
      }
    }
    return $records;
  }
  
}

Googleカレンダーから祝日を取得して配列に展開するコンポーネントを作ってみた。

ここを参照して作ってみました。
国については適宜追加してください。

<?php
class HolidayComponent extends Object {
	/**
	 * 指定年の祝日リストを配列で取得します。
	 */
	function getHoliday($year = null, $country = 'ja'){
		$ret = array();;
		if(empty($year)){
			$dateBegin = date( "Y-m-01" );
			$dateEnd   = date( "Y-m-t"  );
		}else{
			$dateBegin = date( "Y-01-01", mktime( 0, 0, 0,  1, 1, $year ) );
			$dateEnd   = date( "Y-12-t",  mktime( 0, 0, 0, 12, 1, $year ) );
		}
		$query = "start-min=" . $dateBegin . "&start-max=" . $dateEnd . "&max-results=100";
		switch($country){
		case 'ja':
			$feed = "http://www.google.com/calendar/feeds/japanese__ja@holiday.calendar.google.com/public/full" . "?" . $query;
			break;
		case 'us':
			$feed = "http://www.google.com/calendar/feeds/usa__ja@holiday.calendar.google.com/public/full" . "?" . $query;
			break;
		case 'uk':
			$feed = "http://www.google.com/calendar/feeds/uk__ja@holiday.calendar.google.com/public/full" . "?" . $query;
			break;
		case 'ch':
			$feed = "http://www.google.com/calendar/feeds/china__ja@holiday.calendar.google.com/public/full" . "?" . $query;
			break;
		case 'ph':
			$feed = "http://www.google.com/calendar/feeds/philippines__ja@holiday.calendar.google.com/public/full" . "?" . $query;
			break;
		default :
			$feed = "http://www.google.com/calendar/feeds/japanese__ja@holiday.calendar.google.com/public/full" . "?" . $query;
			break;
		}
		
		$xml = simplexml_load_file( $feed );
		if(!$xml){
			return $ret;
		}
		$ii = 0;
		foreach( $xml->entry as $entry ){
			$gd					= $entry->children( "http://schemas.google.com/g/2005" );
			$attributes	= $gd->when->attributes();
			foreach( $attributes as $name => $value ){
				if( $name == "startTime" ){
					$ret[$ii]['date'] = "".$value."";
					$ret[$ii]['title'] = "".$entry->title."";
					$ii++;
					break;
				}
			}
		}
		usort($ret, array($this, "_cmp"));
		return $ret;
	}
	/**
	 * 指定年の祝日リスト配列のソート
	 */
	function _cmp($a, $b) {
		if ($a['date'] == $b['date']) {
			return 0;
		}
		return ($a['date'] < $b['date']) ? -1 : 1;
	}
	
}

ロりポップでsubversion

チカッパプランでSSHが使えてsvn関連のコマンドを使えるのでリポジトリを作ってみる。

サーバー側

1.リポジトリ用のディレクトリを作成。
mkdir -p repos/hoge
2.リポジトリを初期化
svnadmin create repos/hoge --fs-type fsfs
3.trunk、branchs、tagsを作成
svn mkdir file://[フルパス]/repos/hoge/trunk -m "create trunk."
svn mkdir file://[フルパス]/repos/hoge/branchs -m "create branchs."
svn mkdir file://[フルパス]/repos/hoge/tags -m "create tags."

続いてクライアント側(TortoiseSVNを使用)

1.SSHクライアントの設定

TortoiseSVN同梱の「TortoisePlink.exe」(SSHクライアント)を利用
[TortoiseSVN]→[設定]→[ネットワーク]のSSHクライアントに

"C:\Program Files\TortoiseSVN\bin\TortoisePlink.exe" -P [接続ポート番号] -l [SSHアカウント] -pw [SSHパスワード]
2.チェックアウト

空フォルダを作りチェックアウト。
[TortoiseSVN]→[チェックアウト]
その際のリポジトリのURLは

svn+ssh://[SSHアカウント]@[SSHサーバー]/[リポジトリまでの絶対パス]/trunk
3.チェックアウトしたフォルダにバージョン管理するフォルダ、ファイルをコピー
4.コミット

これでいけるようです。

Backlogでsubversionの備忘

バージョン管理を始める際にやること。
1.Backlog上にリポジトリを作る。
2.自分のPCにsubversion用に空のフォルダを作る。
3.空のフォルダでチェックアウト。
4.チェックアウトしたフォルダにバージョン管理するフォルダ、ファイルをコピー
5.コミット

当たり前のことなんですが、いつもまごまごしてしまうのでメモしておきます。

CakePHPで普通のHtmlやPHPを配置する

ガッチリできあがったCakePHPで作成したサイトがあるとして、他で作った「普通に」作った簡単な問い合わせフォーム的なものをサブディレクトリに配置したい場合って結構あると思います。
その時は「.htaccess」を細工すればOK。
元の.htaccess

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>

で、普通のHtmlファイルを配置したいサブディレクトリを「XXXX」とすると

<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteBase /
	RewriteCond %{REQUEST_URI} ^/XXXX/(.*)$
	RewriteRule ^.*$ - [L]
</IfModule>

を先頭に追加して以下のようにする。

<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteBase /
	RewriteCond %{REQUEST_URI} ^/XXXX/(.*)$
	RewriteRule ^.*$ - [L]
</IfModule>
# Begin CakePHP
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>

参照元はこちら。