Пример #1
0
        public void Appendによるヘッダの追加()
        {
            //setUp
            var appned = new Dat(new CtrlType[] { CtrlType.TextBox, CtrlType.TextBox });
            appned.Add(true, "tag2\tzzz");
            var sut = new ChangeHeader(null, appned);

            var mail = new Mail();

            var expected = "zzz";

            //exercise
            sut.Exec(mail, new Logger());
            var actual = mail.GetHeader("tag2");

            //varify
            Assert.That(actual, Is.EqualTo(expected));
        }
Пример #2
0
        public void Relpaceによるヘッダの置き換え2()
        {
            //setUp
            var replace = new Dat(new CtrlType[] { CtrlType.TextBox, CtrlType.TextBox });
            replace.Add(true, "ABC\tBBB");
            var sut = new ChangeHeader(replace, null);

            var mail = new Mail();
            mail.AddHeader("tag1", "ABC123");
            mail.AddHeader("tag2", "DEF123");
            mail.AddHeader("tag3", "GHI123");

            var expected = "BBB123";

            //exercise
            sut.Exec(mail, new Logger());
            var actual = mail.GetHeader("tag1");

            //varify
            Assert.That(actual, Is.EqualTo(expected));
        }
Пример #3
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;
        }
Пример #4
0
        public void Relpaceによるヘッダの置き換え3()
        {
            //setUp
            var replace = new Dat(new CtrlType[] { CtrlType.TextBox, CtrlType.TextBox });
            replace.Add(true, "EFGH\tWXYZ");
            var sut = new ChangeHeader(replace, null);

            var mail = new Mail();
            mail.AddHeader("To", "\"ABCD\" <****@******>");
            mail.AddHeader("From", "\"EFGH\" <****@******>");
            mail.AddHeader("Subject", "test");

            var expected = "\"WXYZ\" <****@******>";

            //exercise
            sut.Exec(mail, new Logger());
            var actual = mail.GetHeader("From");

            //varify
            Assert.That(actual, Is.EqualTo(expected));
        }
Пример #5
0
        public void Relpaceによるヘッダの置き換え4()
        {
            //setUp
            var replace = new Dat(new CtrlType[] { CtrlType.TextBox, CtrlType.TextBox });
            replace.Add(true, "User-Agent:.*\tUser-Agent:Henteko Mailer 09.87.12");
            var sut = new ChangeHeader(replace, null);

            var mail = new Mail();
            mail.AddHeader("User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130801 Thunderbird/17.0.8");

            var expected = "Henteko Mailer 09.87.12";

            //exercise
            sut.Exec(mail, new Logger());
            var actual = mail.GetHeader("User-Agent");

            //varify
            Assert.That(actual, Is.EqualTo(expected));
        }
Пример #6
0
 //折り返しメールのためのToヘッダの作成
 string ReturnTo(Mail mail, MlEnvelope mlEnvelope)
 {
     //元メールのFromヘッダを取得する
     //無い場合は、mlEmvelope.Fromからセットする
     var to = mail.GetHeader("from") ?? mlEnvelope.From.ToString();
     return to;
 }
Пример #7
0
        //投稿
        public bool Post(Mail mail, MlEnvelope mlEnvelope)
        {
            //var no = mlDb.IncNo(mlAddr.Name);//インクリメントした記事番号の取得
            var incNo = _mlDb.Count() + 1;//インクリメントした記事番号の取得

            //記事メールの編集
            //Subject:の変更
            mail.ConvertHeader("subject", _mlSubject.Get(mail.GetHeader("subject"), incNo));
            //Reply-To:の追加
            mail.ConvertHeader("Reply-To", string.Format("\"{0}\"<{1}>", _mlAddr.Name, _mlAddr.Post));
            //List-Id:の追加
            mail.ConvertHeader("List-Id", string.Format("{0}.{1}", _mlAddr.Name, _mlAddr.DomainList[0]));
            //List-Software:の追加
            mail.ConvertHeader("List-Software", string.Format("{0}", Define.ApplicationName()));
            //List-Post:の追加
            mail.ConvertHeader("List-Post", string.Format("<mailto:{0}>", _mlAddr.Post));
            //List-Owner:の追加
            mail.ConvertHeader("List-Owner", string.Format("<mailto:{0}>", _mlAddr.Admin));
            //List-Help:の追加
            mail.ConvertHeader("List-Help", string.Format("<mailto:{0}?body=help>", _mlAddr.Ctrl));
            //List-Unsubscribe:の追加
            mail.ConvertHeader("List-Unsubscribe", string.Format("<mailto:{0}?body=unsubscribe>", _mlAddr.Ctrl));

            //ライブラリへの保存
            _mlDb.Save(mail);

            //各メンバーへの配信
            foreach (MlOneUser to in _mlUserList) {
                if (to.Enable && to.IsReader) {//「配信する」のみが対象となる
                    if (!_mlSender.Send(mlEnvelope.ChangeTo(to.MailAddress), mail)) {
                        //配信に失敗したメールを管理者に転送する
                        var subject = string.Format("DELIVERY ERROR article to {0} ({1} ML)", to, _mlAddr.Name);
                        return AttachToAmdin(mail, subject, mlEnvelope);
                    }
                }
            }
            return true;
        }
Пример #8
0
        public void Readによるn通目の読み込み(int n)
        {
            //setUp
            var max = 10;
            var threadSpan = 0; //最小経過時間

            var mail = new Mail();
            var expected = string.Format("{0}", n);
            mail.AddHeader("tag",expected);
            var mailInfo = CreateMailInfo();
            for (int i = 0; i < max; i++) {
                sut.Save(mail, mailInfo);
            }
            var list = sut.GetList(max, threadSpan);

            //exerceise
            sut.Read(list[n].MailInfo.FileName, ref mail);
            var actual = mail.GetHeader("tag");

            //verify
            Assert.That(actual, Is.EqualTo(expected));
        }