コード例 #1
0
ファイル: MailBox.cs プロジェクト: schifflee/bjd5
        public bool Save(string user, Mail mail, MailInfo mailInfo)
        {
            //Ver_Ml
            if (!IsUser(user))
            {
                _log.Set(LogKind.Error, null, 9000047, string.Format("[{0}] {1}", user, mailInfo));
                return(false);
            }

            //�t�H���_�쐬
            var folder = string.Format("{0}\\{1}", Dir, user);

            if (!Directory.Exists(folder))
            {
                Directory.CreateDirectory(folder);
            }

            //�t�@�C��������
            var name   = CreateFileName();
            var mfName = string.Format("{0}\\MF_{1}", folder, name);
            var dfName = string.Format("{0}\\DF_{1}", folder, name);

            //�t�@�C���ۑ�
            var success = false;

            try{
                if (mail.Save(mfName))
                {
                    if (mailInfo.Save(dfName))
                    {
                        success = true;
                    }
                }
                else
                {
                    _log.Set(LogKind.Error, null, 9000059, mail.GetLastError());
                }
            }catch (Exception) {
                ;
            }
            //���s�����ꍇ�́A�쐬�r���̃t�@�C����S���폜
            if (!success)
            {
                if (File.Exists(mfName))
                {
                    File.Delete(mfName);
                }
                if (File.Exists(dfName))
                {
                    File.Delete(dfName);
                }
                return(false);
            }
            //_logger.Set(LogKind.Normal, null, 8, mailInfo.ToString());

            return(true);
        }
コード例 #2
0
ファイル: MailInfoTest.cs プロジェクト: jsakamoto/bjd5
 public void IsProcessにより処理対象かどうかを判断する(double threadSpan, bool expected)
 {
     //setUp
     var sut = new MailInfo(_dfFile);
     //exercise
     var actual = sut.IsProcess(threadSpan,_dfFile);
     //verify
     Assert.That(actual, Is.EqualTo(expected));
 }
コード例 #3
0
ファイル: MailInfoTest.cs プロジェクト: jsakamoto/bjd5
 public void ToStringによる文字列化()
 {
     //setUp
     var sut = new MailInfo(_dfFile);
     var expected = "from:[email protected] to:[email protected] size:310 uid:bjd.00634712193942765633.000";
     //exercise
     var actual = sut.ToString();
     //verify
     Assert.That(actual, Is.EqualTo(expected));
 }
コード例 #4
0
ファイル: MessageList.cs プロジェクト: jsakamoto/bjd5
 public MessageList(string folder)
 {
     string[] files = Directory.GetFiles(folder, "DF_*");
     Array.Sort(files);//ファイル名をソート(DF_名は作成日付なので、結果的に日付順となる)FAT32対応
     foreach (string fileName in files) {
         var mailInfo = new MailInfo(fileName);
         string fname = Path.GetFileName(fileName);
         Add(new OneMessage(folder, fname.Substring(3), mailInfo.Uid, mailInfo.Size));
     }
 }
コード例 #5
0
ファイル: OneMail.cs プロジェクト: jsakamoto/bjd5
        public OneMail(String owner,String fileName)
        {
            Owner = owner;
            _mailInfo = new MailInfo(fileName);
            fileName = fileName.Replace("\\DF_","\\MF_");

            _mail = new Mail();
            if (File.Exists(fileName)) {
                _mail.Init2(Encoding.ASCII.GetBytes(File.ReadAllText(fileName)));
            }
        }
コード例 #6
0
ファイル: LocalBox.cs プロジェクト: jsakamoto/bjd5
 public bool Save(MailAddress to,Mail mail,MailInfo mailInfo)
 {
     if (mail.Append(to.ToString())) {
         if (_logger != null){
             _logger.Set(LogKind.Normal, null, 21, string.Format("[{0}] {1}", to.User, mailInfo));
         }
     } else {
         _logger.Set(LogKind.Error, null, 9000059, mail.GetLastError());
         _logger.Set(LogKind.Error, null, 22, string.Format("[{0}] {1}", to.User, mailInfo));
     }
     return true;
 }
コード例 #7
0
ファイル: MailInfoTest.cs プロジェクト: jsakamoto/bjd5
        public void Saveによる保存()
        {
            //setUp
            var tmpFile = Path.GetTempFileName();
            var sut = new MailInfo(_dfFile);
            //exercise
            sut.Save(tmpFile);

            //verify
            var src = File.ReadAllLines(_dfFile);
            var dst = File.ReadAllLines(tmpFile);
            Assert.AreEqual(src.Count(), dst.Count());
            for (int i = 0; i < src.Count(); i++) {
                Assert.AreEqual(src[i], dst[i]);
            }

            //tearDown
            File.Delete(tmpFile);
        }
コード例 #8
0
ファイル: MailQueue.cs プロジェクト: jsakamoto/bjd5
        //sec:�Ō��GetList���Ă���sec���Ԍo�߂��Ȃ���͎̂擾�̑ΏۊO�Ƃ���
        public List<OneQueue> GetList(int max, int sec)
        {
            var queueList = new List<OneQueue>();

            lock (_lockObj) {//�r������
                foreach (var fileName in Directory.GetFiles(Dir, "DF_*")) {
                    if (queueList.Count == max)
                        break;
                    var mailInfo = new MailInfo(fileName);

                    //�����Ώۂ��ǂ����̊m�F
                    if (mailInfo.IsProcess(sec, fileName)) {
                        var fname = Path.GetFileName(fileName);
                        queueList.Add(new OneQueue(fname.Substring(3), mailInfo));
                    }
                }
                return queueList;
            }
        }
コード例 #9
0
ファイル: Server.cs プロジェクト: jsakamoto/bjd5
        //リモート操作(データの取得)
        public override string Cmd(string cmdStr)
        {
            if (!Kernel.MailBox.Status)
                return "";

            if (cmdStr == "Refresh-MailBox") {
                //キュー一覧
                var sb = new StringBuilder();
                var files = Directory.GetFiles(_mailQueue.Dir, "DF_*");
                Array.Sort(files);
                foreach (string fileName in files) {
                    var mailInfo = new MailInfo(fileName);
                    sb.Append(string.Format("{0}\t{1}\t{2}\t{3}\t{4}\t{5}", "$queue", mailInfo.Uid, mailInfo.From, mailInfo.To, mailInfo.Size.ToString(), mailInfo.Date));
                    sb.Append('\b');
                }
                //ユーザメール一覧
                foreach (var user in Kernel.MailBox.UserList) {
                    var folder = string.Format("{0}\\{1}", Kernel.MailBox.Dir, user);
                    files = Directory.GetFiles(folder, "DF_*");
                    Array.Sort(files);
                    foreach (string fileName in files) {
                        var mailInfo = new MailInfo(fileName);
                        sb.Append(string.Format("{0}\t{1}\t{2}\t{3}\t{4}\t{5}", user, mailInfo.Uid, mailInfo.From, mailInfo.To, mailInfo.Size.ToString(), mailInfo.Date));
                        sb.Append('\b');
                    }
                }
                return sb.ToString();
            } else if (cmdStr.IndexOf("Cmd-View") == 0) {
                var tmp = cmdStr.Split('-');
                if (tmp.Length == 4) {
                    var folder = "";
                    var mailInfo = Search(tmp[2], tmp[3], ref folder);
                    if (mailInfo != null) {
                        var emlFileName = string.Format("{0}\\MF_{1}", folder, mailInfo.FileName);
                        var mail = new Mail();
                        mail.Read(emlFileName);
                        return Inet.FromBytes(mail.GetBytes());
                    }
                    return "ERROR";
                }
            } else if (cmdStr.IndexOf("Cmd-Delete") == 0) {
                if (ThreadBaseKind == ThreadBaseKind.Running) {
                    return "running";
                }
                var tmp = cmdStr.Split('-');
                if (tmp.Length == 4) {
                    string folder = "";
                    var mailInfo = Search(tmp[2], tmp[3], ref folder);
                    if (mailInfo != null) {
                        string fileName = string.Format("{0}\\MF_{1}", folder, mailInfo.FileName);
                        File.Delete(fileName);
                        fileName = string.Format("{0}\\DF_{1}", folder, mailInfo.FileName);
                        File.Delete(fileName);
                        return "success";
                    }
                }
            }
            return "";
        }
コード例 #10
0
ファイル: MailInfoTest.cs プロジェクト: jsakamoto/bjd5
 public void パラメータ指定によるコンストラクタの動作確認()
 {
     //setUp
     var a = new MailInfo(_dfFile);
     //var sut = new MailInfo(a.Uid, a.Size, a.Host, a.Addr, a.Date,a.From, a.To);
     var sut = new MailInfo(a.Uid, a.Size, a.Host, a.Addr, a.From, a.To);
     var expected = "from:[email protected] to:[email protected] size:310 uid:bjd.00634712193942765633.000";
     //exercise
     var actual = sut.ToString();
     //verify
     Assert.That(actual, Is.EqualTo(expected));
 }
コード例 #11
0
ファイル: MailBoxTest.cs プロジェクト: jsakamoto/bjd5
        public void SaveDfTest(string user, bool status, string uid, int size, string hostname, string from, string to)
        {
            var mail = new Mail();
            var ip = new Ip("10.0.0.1");
            var mailInfo = new MailInfo(uid, size, hostname, ip, new MailAddress(from),new MailAddress(to));

            var b = sut.Save(user, mail, mailInfo);
            //メールボックス内に蓄積されたファイル数を検証する
            var path = string.Format("{0}\\{1}", sut.Dir, user);
            var di = new DirectoryInfo(path);

            if (status){
                Assert.AreEqual(b,true);//保存成功

                var files = di.GetFiles("DF_*");

                //メールボックス内に蓄積されたファイル数を検証する
                var lines = File.ReadAllLines(files[0].FullName);
                Assert.AreEqual(lines[0], uid); //1行目 uid
                Assert.AreEqual(lines[1], size.ToString()); //2行目 size
                Assert.AreEqual(lines[2], hostname); //3行目 hostname
                Assert.AreEqual(lines[3], ip.ToString()); //4行目 ip
                Assert.AreEqual(lines[7], from); //8行目 from
                Assert.AreEqual(lines[8], to); //9行目 to
            }else{
                Assert.AreEqual(b, false);//保存失敗
                Assert.AreEqual(Directory.Exists(di.FullName),false);
            }
        }
コード例 #12
0
ファイル: MailSave.cs プロジェクト: jsakamoto/bjd5
        //Server及びMlから使用される
        //メールの保存(宛先はML以外であることが確定してから使用する)
        //テスト用のモックオブジェクト(TsMailSaveでSave()をオーバーライドできるようにvirtualにする
        public virtual bool Save(MailAddress from, MailAddress to, Mail orgMail, string host, Ip addr)
        {
            //Mailのヘッダ内容等を変更するので、この関数内だけの変更にとどめるため、テンポラリを作成する
            var mail = new Mail(); //orgMail.CreateClone();
            mail.Init2(orgMail.GetBytes());

            //ユニークなID文字列の生成
            var uidStr = string.Format("bjd.{0:D20}.{1:D3}", DateTime.Now.Ticks, _idCounter++);
            //日付文字列の生成
            //var date = Util.LocalTime2Str(DateTime.Now);
            //Receivedヘッダの追加
            mail.AddHeader("Received", _receivedHeader.Get(to, host, addr));

            //            //Message-Idの追加
            //            if (null == mail.GetHeader("Message-ID"))
            //                mail.AddHeader("Message-ID", string.Format("<{0}@{1}>", uidStr, _domainList[0]));
            //            //Fromの追加
            //            if (null == mail.GetHeader("From"))
            //                mail.AddHeader("From", string.Format("<{0}>", @from));
            //            //Dateの追加
            //            if (null == mail.GetHeader("Date"))
            //                mail.AddHeader("Date", string.Format("{0}", date));

            //ローカル宛(若しくはローカルファイル)
            if (to.IsLocal(_domainList)) {

                //ローカル保存の場合は、X-UIDLを追加する
                mail.AddHeader("X-UIDL", uidStr);

                //ヘッダを追加してサイズが変わるので、ここで初期化する
                var mailInfo = new MailInfo(uidStr, mail.Length, host, addr, from, to);

                if (to.IsFile()) {  //ローカルファイルの場合(直接ファイルにAppendする)
                    if (!_localBox.Save(to,mail,mailInfo)){
                        return false;
                    }
                } else { //ローカルユーザの場合(メールボックスへSaveする)
                    if (!_mailBox.Save(to.User, mail, mailInfo)){
                        return false;
                    }
                }
                _logger.Set(LogKind.Normal, null, 8, mailInfo.ToString());
            } else {
                //Toの追加
            //                if (null == mail.GetHeader("To")) {
            //                    mail.AddHeader("To", string.Format("<{0}>", to));
            //                }

                //ヘッダを追加してサイズが変わるので、ここで初期化する
                var mailInfo = new MailInfo(uidStr, mail.Length, host, addr, from, to);
                if (!_mailQueue.Save(mail, mailInfo)) {
                    _logger.Set(LogKind.Error, null, 9000059, mail.GetLastError());
                    return false;
                }
                _logger.Set(LogKind.Normal, null, 9, mailInfo.ToString());

            }
            return true;
        }
コード例 #13
0
ファイル: OneFetchJob.cs プロジェクト: jsakamoto/bjd5
        //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;
        }
コード例 #14
0
ファイル: OneQueue.cs プロジェクト: jsakamoto/bjd5
 public OneQueue(string fname, MailInfo mailInfo)
 {
     _fname = fname;
     MailInfo = mailInfo;
 }
コード例 #15
0
ファイル: Server.cs プロジェクト: jsakamoto/bjd5
        MailInfo Search(string user, string uid, ref string folder)
        {
            folder = string.Format("{0}\\{1}", Kernel.MailBox.Dir, user);
            if (user == "QUEUE")
                folder = _mailQueue.Dir;

            foreach (var fileName in Directory.GetFiles(folder, "DF_*")) {
                var mailInfo = new MailInfo(fileName);
                if (mailInfo.Uid == uid) {
                    return mailInfo;
                }
            }
            return null;
        }
コード例 #16
0
ファイル: MailBox.cs プロジェクト: jsakamoto/bjd5
        public bool Save(string user, Mail mail, MailInfo mailInfo)
        {
            //Ver_Ml
            if (!IsUser(user)){
                _log.Set(LogKind.Error, null, 9000047, string.Format("[{0}] {1}", user, mailInfo));
                return false;
            }

            //�t�H���_�쐬
            var folder = string.Format("{0}\\{1}", Dir, user);
            if (!Directory.Exists(folder)){
                Directory.CreateDirectory(folder);
            }

            //�t�@�C��������
            var name = CreateFileName();
            var mfName = string.Format("{0}\\MF_{1}", folder, name);
            var dfName = string.Format("{0}\\DF_{1}", folder, name);

            //�t�@�C���ۑ�
            var success = false;
            try{
                if (mail.Save(mfName)){
                    if (mailInfo.Save(dfName)){
                        success = true;
                    }
                } else{
                    _log.Set(LogKind.Error, null, 9000059, mail.GetLastError());
                }
            }catch (Exception){
                ;
            }
            //���s�����ꍇ�́A�쐬�r���̃t�@�C����S���폜
            if (!success){
                if (File.Exists(mfName)) {
                    File.Delete(mfName);
                }
                if (File.Exists(dfName)) {
                    File.Delete(dfName);
                }
                return false;
            }
            //_logger.Set(LogKind.Normal, null, 8, mailInfo.ToString());

            return true;
        }
コード例 #17
0
ファイル: MailInfoTest.cs プロジェクト: jsakamoto/bjd5
 public void プロパティによる値取得(string tag, string expected)
 {
     //setUp
     var sut = new MailInfo(_dfFile);
     //exercise
     var actual = sut.GetType().GetProperty(tag).GetValue(sut, null).ToString();
     //verify
     Assert.That(actual, Is.EqualTo(expected));
 }
コード例 #18
0
ファイル: MailQueue.cs プロジェクト: jsakamoto/bjd5
 public bool Save(Mail mail, MailInfo mailInfo)
 {
     lock (_lockObj) {//�r������
         var fname = CreateName();
         var fileName = string.Format("{0}\\MF_{1}", Dir, fname);
         if (mail.Save(fileName)){
             fileName = string.Format("{0}\\DF_{1}", Dir, fname);
             mailInfo.Save(fileName);
             return true;
         }
         return false;
     }
 }
コード例 #19
0
ファイル: MailBoxTest.cs プロジェクト: jsakamoto/bjd5
        public void SaveCountTest(int n)
        {
            var mail = new Mail();
            const string uid = "XXX123";
            const int size = 100;
            const string host = "hostname";
            const string user = "******";
            var ip = new Ip("10.0.0.1");
            var from = new MailAddress("1@1");
            var to = new MailAddress("2@2");
            var mailInfo = new MailInfo(uid, size, host, ip, from, to);

            //同一内容でn回送信
            for (int i = 0; i < n; i++){
                sut.Save(user, mail, mailInfo);
            }

            //メールボックス内に蓄積されたファイル数を検証する
            var path = string.Format("{0}\\{1}", sut.Dir, user);
            var di = new DirectoryInfo(path);

            //DF_*がn個存在する
            var files = di.GetFiles("DF_*");
            Assert.AreEqual(files.Count(), n);
            //MF_*がn個存在する
            files = di.GetFiles("MF_*");
            Assert.AreEqual(files.Count(), n);
        }