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); }
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)); }
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)); }
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)); } }
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))); } }
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; }
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); }
//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; } }
//リモート操作(データの取得) 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 ""; }
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)); }
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); } }
//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; }
//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; }
public OneQueue(string fname, MailInfo mailInfo) { _fname = fname; MailInfo = mailInfo; }
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; }
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; }
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)); }
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; } }
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); }