예제 #1
0
        public void IndexOfによる検索_存在しない場合()
        {
            var dir = Path.GetTempPath();
            //setUp
            var sut = new FetchDb(dir, "TEST");
            sut.Add("0-1234567890");
            sut.Add("1-1234567890");
            var expected = -1;
            //exercise
            var actual = sut.IndexOf("2-1234567890");
            //verify
            Assert.That(actual, Is.EqualTo(expected));

            //tearDown
            File.Delete(sut.FileName);
        }
예제 #2
0
        public void Delによる削除_失敗_存在しない()
        {
            var dir = Path.GetTempPath();
            //setUp
            //いったん保存された状態を作る
            var sut = new FetchDb(dir, "TEST");
            sut.Add("0-1234567890");
            sut.Add("1-1234567890");
            var expected = false;

            //exercise
            //存在するデータの削除
            var actual = sut.Del("XXX");
            //verify
            Assert.That(actual, Is.EqualTo(expected));
            //存在するかどうか検索してみる(存在する)
            Assert.That(sut.IndexOf("0-1234567890"), Is.EqualTo(0));

            //tearDown
            File.Delete(sut.FileName);
        }
예제 #3
0
        public void IsPastによる確認_指定時間を経過した()
        {
            var dir = Path.GetTempPath();
            //setUp
            //いったん保存された状態を作る
            var sut = new FetchDb(dir, "TEST");
            sut.Add("0-1234567890");
            Thread.Sleep(1100); //1.1秒経過
            var expected = true;

            //exercise
            var actual = sut.IsPast("0-1234567890",1);
            //verify
            Assert.That(actual, Is.EqualTo(expected));

            //tearDown
            File.Delete(sut.FileName);
        }
예제 #4
0
        public void 複合試験()
        {
            var dir = Path.GetTempPath();

            //当初2件で作成
            var sut = new FetchDb(dir, "TEST");
            sut.Add("0-1234567890");
            sut.Add("1-1234567890");
            sut.Save();

            sut = new FetchDb(dir, "TEST");//改めて読み込む
            sut.Del("0-1234567890");//1件目削除
            sut.Add("2-1234567890");//追加
            sut.Save();

            sut = new FetchDb(dir, "TEST");//改めで読み込む

            //verify
            //最終的に2件が検索できるはず
            Assert.That(sut.IndexOf("0-1234567890"),Is.EqualTo(-1));
            Assert.That(sut.IndexOf("1-1234567890"), Is.EqualTo(0));
            Assert.That(sut.IndexOf("2-1234567890"), Is.EqualTo(1));

            //tearDown
            File.Delete(sut.FileName);
        }
예제 #5
0
        public void Saveによる保存()
        {
            var dir = Path.GetTempPath();
            //setUp
            //いったん保存された状態を作る
            var dmy = new FetchDb(dir, "TEST");
            dmy.Add("0-1234567890");
            dmy.Add("1-1234567890");
            dmy.Save();
            //改めて読み込む
            var sut = new FetchDb(dir, "TEST");
            var expected = 0;
            //exercise
            //存在するかどうか検索してみる
            var actual = sut.IndexOf("0-1234567890");
            //verify
            Assert.That(actual, Is.EqualTo(expected));

            //tearDown
            File.Delete(sut.FileName);
        }
예제 #6
0
        //RETRの後のメールの保存が完成したら、Job2をこちらに乗せ換えられる
        public bool Job(Logger logger,DateTime now,ILife iLife)
        {
            Debug.Assert(logger != null, "logger != null");

            var fetchDb = new FetchDb(_kernel.ProgDir(), _oneFetch.Name);
            var remoteUidList = new List<String>();
            var getList = new List<int>();//取得するメールのリスト
            var delList = new List<int>();//削除するメールのリスト

            //受信間隔を過ぎたかどうかの判断
            if (_dt.AddMinutes(_oneFetch.Interval) > now){
                return false;
            }

            logger.Set(LogKind.Normal, null, 1, _oneFetch.ToString());
            if (_oneFetch.Ip == null) {
                logger.Set(LogKind.Error, null, 2, "");
                return false;
            }
            var popClient = new PopClient(_kernel,_oneFetch.Ip,_oneFetch.Port,_timeout,iLife);
            //接続
            if (!popClient.Connect()){
                logger.Set(LogKind.Error, null, 3, popClient.GetLastError());
                return false;
            }
            //ログイン
            if (!popClient.Login(_oneFetch.User, _oneFetch.Pass)){
                logger.Set(LogKind.Error, null, 4, popClient.GetLastError());
                return false;
            }
            //UID
            var lines = new List<String>();
            if (!popClient.Uidl(lines)) {
                logger.Set(LogKind.Error, null, 5, popClient.GetLastError());
                return false;
            }
            for (int i=0;i<lines.Count;i++){
                var tmp = lines[i].Split(' ');
                if (tmp.Length == 2){
                    var uid = tmp[1];
                    remoteUidList.Add(uid);

                    //既に受信が完了しているかどうかデータベースで確認する
                    if (fetchDb.IndexOf(uid) == -1) {
                        //存在しない場合
                        getList.Add(i);//受信対象とする
                    }
                }
            }
            if (_oneFetch.Synchronize == 0) { //サーバに残す
                for (var i = 0; i < remoteUidList.Count; i++) {
                    if (_oneFetch.KeepTime != 0){ //保存期間0の時は、削除しない
                        //保存期間が過ぎているかどうかを確認する
                        if (fetchDb.IsPast(remoteUidList[i], _oneFetch.KeepTime * 60)) { //サーバに残す時間(分)
                            delList.Add(i);
                        }
                    }
                }
            } else if (_oneFetch.Synchronize == 1) { //メールボックスと同期する
                //メールボックスの状態を取得する
                var localUidList = new List<string>();
                var folder = string.Format("{0}\\{1}", _kernel.MailBox.Dir, _oneFetch.LocalUser);
                foreach (var fileName in Directory.GetFiles(folder, "DF_*")) {
                    var mailInfo = new MailInfo(fileName);
                    localUidList.Add(mailInfo.Uid);
                }
                //メールボックスに存在しない場合、削除対象になる
                for (var i = 0; i < remoteUidList.Count; i++) {
                    if (localUidList.IndexOf(remoteUidList[i]) == -1) {
                        delList.Add(i);
                    }
                }
            } else if (_oneFetch.Synchronize == 2) { //サーバから削除
                //受信完了リストに存在する場合、削除対象になる
                for (var i = 0; i < remoteUidList.Count; i++) {
                    if (fetchDb.IndexOf(remoteUidList[i]) != -1) {
                        delList.Add(i);
                    }
                }
            }
            //RETR
            for (int i = 0; i < getList.Count;i++ ){
                var mail = new Mail();
                if (!popClient.Retr(getList[i], mail)) {
                    logger.Set(LogKind.Error, null, 6, popClient.GetLastError());
                    return false;
                }
                //Ver5.9.8
                var fromStr = mail.GetHeader("From");
                if (fromStr == null){
                    fromStr = string.Format("{0}@{1}_{2}", _oneFetch.User, _oneFetch.Host, _oneFetch.Port);
                }

                var from = new MailAddress(fromStr);
                mail.ConvertHeader("X-UIDL", remoteUidList[i]);
                var remoteAddr = _oneFetch.Ip;
                var remoteHost = _oneFetch.Host;

                var rcptList = new List<MailAddress>();
                rcptList.Add(new MailAddress(_oneFetch.LocalUser, _domainName));

                if (_mailSave != null){
                    if (!_mailSave.Save(from, rcptList, mail, remoteHost, remoteAddr)){
                        return false;
                    }
                }

                fetchDb.Add(remoteUidList[i]);
            }
            //DELE
            for (int i = 0; i < delList.Count;i++ ){
                if (!popClient.Dele(delList[i])){
                    logger.Set(LogKind.Error, null, 7, popClient.GetLastError());
                    return false;
                }
                fetchDb.Del(remoteUidList[i]);
            }
            //QUIT
            if (!popClient.Quit()){
                logger.Set(LogKind.Error, null, 5, popClient.GetLastError());
                return false;
            }
            fetchDb.Save();
            _dt = DateTime.Now;//最終処理時刻の更新
            return true;
        }
예제 #7
0
        //RETRの後のメールの保存が完成したら、Job2をこちらに乗せ換えられる
        public bool Job(Logger logger, DateTime now, ILife iLife)
        {
            Debug.Assert(logger != null, "logger != null");

            var fetchDb       = new FetchDb(_kernel.ProgDir(), _oneFetch.Name);
            var remoteUidList = new List <String>();
            var getList       = new List <int>(); //取得するメールのリスト
            var delList       = new List <int>(); //削除するメールのリスト

            //受信間隔を過ぎたかどうかの判断
            if (_dt.AddMinutes(_oneFetch.Interval) > now)
            {
                return(false);
            }

            logger.Set(LogKind.Normal, null, 1, _oneFetch.ToString());
            if (_oneFetch.Ip == null)
            {
                logger.Set(LogKind.Error, null, 2, "");
                return(false);
            }
            var popClient = new PopClient(_kernel, _oneFetch.Ip, _oneFetch.Port, _timeout, iLife);

            //接続
            if (!popClient.Connect())
            {
                logger.Set(LogKind.Error, null, 3, popClient.GetLastError());
                return(false);
            }
            //ログイン
            if (!popClient.Login(_oneFetch.User, _oneFetch.Pass))
            {
                logger.Set(LogKind.Error, null, 4, popClient.GetLastError());
                return(false);
            }
            //UID
            var lines = new List <String>();

            if (!popClient.Uidl(lines))
            {
                logger.Set(LogKind.Error, null, 5, popClient.GetLastError());
                return(false);
            }
            for (int i = 0; i < lines.Count; i++)
            {
                var tmp = lines[i].Split(' ');
                if (tmp.Length == 2)
                {
                    var uid = tmp[1];
                    remoteUidList.Add(uid);

                    //既に受信が完了しているかどうかデータベースで確認する
                    if (fetchDb.IndexOf(uid) == -1)
                    {
                        //存在しない場合
                        getList.Add(i);//受信対象とする
                    }
                }
            }
            if (_oneFetch.Synchronize == 0)   //サーバに残す
            {
                for (var i = 0; i < remoteUidList.Count; i++)
                {
                    if (_oneFetch.KeepTime != 0)  //保存期間0の時は、削除しない
                    //保存期間が過ぎているかどうかを確認する
                    {
                        if (fetchDb.IsPast(remoteUidList[i], _oneFetch.KeepTime * 60))   //サーバに残す時間(分)
                        {
                            delList.Add(i);
                        }
                    }
                }
            }
            else if (_oneFetch.Synchronize == 1)     //メールボックスと同期する
            //メールボックスの状態を取得する
            {
                var localUidList = new List <string>();
                var folder       = string.Format("{0}\\{1}", _kernel.MailBox.Dir, _oneFetch.LocalUser);
                foreach (var fileName in Directory.GetFiles(folder, "DF_*"))
                {
                    var mailInfo = new MailInfo(fileName);
                    localUidList.Add(mailInfo.Uid);
                }
                //メールボックスに存在しない場合、削除対象になる
                for (var i = 0; i < remoteUidList.Count; i++)
                {
                    if (localUidList.IndexOf(remoteUidList[i]) == -1)
                    {
                        delList.Add(i);
                    }
                }
            }
            else if (_oneFetch.Synchronize == 2)     //サーバから削除
            //受信完了リストに存在する場合、削除対象になる
            {
                for (var i = 0; i < remoteUidList.Count; i++)
                {
                    if (fetchDb.IndexOf(remoteUidList[i]) != -1)
                    {
                        delList.Add(i);
                    }
                }
            }
            //RETR
            for (int i = 0; i < getList.Count; i++)
            {
                var mail = new Mail();
                if (!popClient.Retr(getList[i], mail))
                {
                    logger.Set(LogKind.Error, null, 6, popClient.GetLastError());
                    return(false);
                }
                //Ver5.9.8
                var fromStr = mail.GetHeader("From");
                if (fromStr == null)
                {
                    fromStr = string.Format("{0}@{1}_{2}", _oneFetch.User, _oneFetch.Host, _oneFetch.Port);
                }

                var from = new MailAddress(fromStr);
                mail.ConvertHeader("X-UIDL", remoteUidList[i]);
                var remoteAddr = _oneFetch.Ip;
                var remoteHost = _oneFetch.Host;

                var rcptList = new List <MailAddress>();
                rcptList.Add(new MailAddress(_oneFetch.LocalUser, _domainName));

                if (_mailSave != null)
                {
                    if (!_mailSave.Save(from, rcptList, mail, remoteHost, remoteAddr))
                    {
                        return(false);
                    }
                }

                fetchDb.Add(remoteUidList[i]);
            }
            //DELE
            for (int i = 0; i < delList.Count; i++)
            {
                if (!popClient.Dele(delList[i]))
                {
                    logger.Set(LogKind.Error, null, 7, popClient.GetLastError());
                    return(false);
                }
                fetchDb.Del(remoteUidList[i]);
            }
            //QUIT
            if (!popClient.Quit())
            {
                logger.Set(LogKind.Error, null, 5, popClient.GetLastError());
                return(false);
            }
            fetchDb.Save();
            _dt = DateTime.Now;//最終処理時刻の更新
            return(true);
        }