예제 #1
0
        public void Dataの動作確認_Bodyの確認_最後が改行で終わらない(InetKind inetKind)
        {
            //setUp
            var sut = CreateSmtpClient(inetKind);

            var mail1 = new Mail();
            mail1.Init2(Encoding.ASCII.GetBytes("1:1\r\n\r\nbody1\r\nbody2\r\n123"));

            //exercise
            sut.Connect();
            sut.Helo();
            sut.Mail("1@1");
            sut.Rcpt("*****@*****.**");
            sut.Data(mail1);
            sut.Quit();

            //verify
            var mail2 = _testServer.GetMf("user1")[0];
            var actual = mail2.GetBody().Length;
            var expected = mail1.GetBody().Length + 2;//\r\nが追加される
            Assert.That(actual, Is.EqualTo(expected));

            //tearDown
            sut.Dispose();
        }
예제 #2
0
        public void Deleteによるn通の削除(int n)
        {
            //setUp
            var max = 10;
            var threadSpan = 0; //最小経過時間

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

            //exerceise
            foreach (var l in list){
                var filename = l.MailInfo.FileName;
                sut.Delete(filename);
                n--;
                if (n == 0)
                    break;
            }
            var actual = sut.GetList(max, threadSpan).Count;

            //verify
            Assert.That(actual, Is.EqualTo(expected));
        }
예제 #3
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;
        }
예제 #4
0
파일: MlCmdTest.cs 프로젝트: jsakamoto/bjd5
        public void Test(string cmdStr, int count)
        {
            var mail = new Mail();
            mail.AppendLine(Encoding.ASCII.GetBytes("\r\n"));//区切り行(ヘッダ終了)
            mail.AppendLine(Encoding.ASCII.GetBytes(cmdStr));//区切り行(ヘッダ終了)
            var mlCmd = new MlCmd(null, mail, _user1);

            Assert.AreEqual(mlCmd.Cast<object>().Count(),count); // コマンド数
        }
예제 #5
0
파일: MlList.cs 프로젝트: jsakamoto/bjd5
 //当該メーリングリストに処理を分岐する
 public bool Job(MlEnvelope mlEnvelope,Mail mail)
 {
     foreach(var ml in _ar) {
         if (ml.IsUser(mlEnvelope.To)) {
             return ml.Job(mlEnvelope,mail);
         }
     }
     return false;
 }
예제 #6
0
파일: MlSender.cs 프로젝트: jsakamoto/bjd5
        public bool Send(MlEnvelope mlEnvelope, Mail orgMail)
        {
            var mail = orgMail.CreateClone();//�w�b�_��ύX���邽�߂Ƀe���|������쐬����

            if (_mailSave.Save(mlEnvelope.From, mlEnvelope.To, mail, mlEnvelope.Host, mlEnvelope.Addr)) {
                _logger.Set(LogKind.Detail, null, 38, string.Format("From:{0} To:{1}", mlEnvelope.From, mlEnvelope.To));
                return true;
            }
            _logger.Set(LogKind.Error, null, 39, string.Format("From:{0} To:{1}", mlEnvelope.From, mlEnvelope.To));
            return true;
        }
예제 #7
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)));
            }
        }
예제 #8
0
 //メールの送信 count=本文の行数(-1の場合は全部)
 public bool Send(SockTcp sockTcp, int count)
 {
     string fileName = string.Format("{0}\\MF_{1}", _dir, _fname);
     var mail = new Mail();
     mail.Read(fileName);
     if (!mail.Send(sockTcp, count)){
         // Logger.Set(LogKind.Error, null, 9000058, ex.Message);
         //mail.GetLastEror()を未処理
         return false;
     }
     return true;
 }
예제 #9
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;
 }
예제 #10
0
파일: TsMail.cs 프로젝트: jsakamoto/bjd5
        public TsMail(string from, string to, string bodyStr)
        {
            Mail = new Mail();
            Mail.AppendLine(Encoding.ASCII.GetBytes("\r\n"));//区切り行(ヘッダ終了)
            var body = Encoding.ASCII.GetBytes(bodyStr);
            Mail.AppendLine(body);
            Mail.AddHeader("from", from);
            Mail.AddHeader("to", to);

            const string host = "TEST";
            var addr = new Ip("10.0.0.1");
            MlEnvelope = new MlEnvelope(CreateMailAddress(from), CreateMailAddress(to), host, addr);
        }
예제 #11
0
파일: MailSave.cs 프로젝트: jsakamoto/bjd5
        public bool Save(MailAddress from, List<MailAddress> rcptList, Mail mail, string host, Ip addr)
        {
            List<MailAddress> toList = _alias.Reflection(rcptList, _logger);

            foreach (var to in toList) {
                if (!Save(from, to, mail, host, addr)){
                    //Ver5.9.8
                    //_logger.Set(LogKind.Error, null, 7, String.Format("From:{0} To:{1}", from, to));
                    _logger.Set(LogKind.Error, null, 55, String.Format("From:{0} To:{1}", from, to));
                    return false;
                }
            }
            return true;
        }
예제 #12
0
        //メンバー以外は投稿できません
        public bool Deny(Mail orgMail, MlEnvelope mlEnvelope)
        {
            //メール生成
            var subject = string.Format("You are not member ({0} ML)", _mlAddr.Name);
            var bodyStr = _mlAddr.Conv(_docs[(int)MlDocKind.Deny]);
            var mail = Create(ContentTyep.Sjis, subject, bodyStr);

            //宛先設定 from<->To from = mailDaemon
            mail.ConvertHeader("from", _mlAddr.Admin.ToString());
            mail.ConvertHeader("to", ReturnTo(orgMail, mlEnvelope));//送信者をそのまま受信者にする
            mail.ConvertHeader("date", Util.LocalTime2Str(DateTime.Now));//日付
            //配送
            return _mlSender.Send(mlEnvelope.Swap().ChangeFrom(_mlAddr.Admin), mail);
        }
예제 #13
0
파일: MlCmdTest.cs 프로젝트: jsakamoto/bjd5
        public void Test(string cmdStr, MlCmdKind mlCmdKind, string paramStr)
        {
            var mail = new Mail();
            mail.AppendLine(Encoding.ASCII.GetBytes("\r\n"));//区切り行(ヘッダ終了)
            mail.AppendLine(Encoding.ASCII.GetBytes(cmdStr));//区切り行(ヘッダ終了)
            var mlCmd = new MlCmd(null, mail, _user1);

            Assert.AreEqual(mlCmd.Cast<object>().Count(),1); // コマンド数は1

            foreach (OneMlCmd oneMlCmd in mlCmd) {
                Assert.AreEqual(oneMlCmd.CmdKind,mlCmdKind);
                Assert.AreEqual(oneMlCmd.ParamStr,paramStr);
                break;
            }
        }
예제 #14
0
 //変換と追加
 public void Exec(Mail mail,Logger logger)
 {
     Debug.Assert(logger != null, "logger != null");
     //ヘッダ変換
     foreach (var a in _replace){
         if (mail.RegexHeader(a.Key,a.Value)){
             logger.Set(LogKind.Normal, null, 16, string.Format("{0} -> {1}", a.Key,a.Value));
         }
     }
     //ヘッダの追加
     foreach (var a in _append){
         mail.AddHeader(a.Key, a.Value);
         logger.Set(LogKind.Normal, null, 17, string.Format("{0}: {1}", a.Key, a.Value));
     }
 }
예제 #15
0
파일: MlCmd.cs 프로젝트: jsakamoto/bjd5
 public MlCmd(Logger logger, Mail mail, MlOneUser mlOneUser)
 {
     //this.logger = logger;
     var lines = Inet.GetLines(mail.GetBody());
     foreach (var line in lines) {
         var str = mail.GetEncoding().GetString(line);
         str = Inet.TrimCrlf(str);
         //Ver5.6.4 前後の空白を除去する
         str = str.Trim();
         if (str == "")//空白行は無視する
             continue;
         if (!SetCmd(str, mlOneUser)) {
             logger.Set(LogKind.Error, null, 40, str);//解釈失敗
         }
     }
 }
예제 #16
0
파일: MlMailDb.cs 프로젝트: jsakamoto/bjd5
        public Mail Read(int no)
        {
            //ディレクトリが存在しない場合は失敗となる
            if (!Directory.Exists(_dir)) {
                return null;
            }

            var fileName = MailFile(no);
            if (File.Exists(fileName)) {
                var mail = new Mail();
                if (mail.Read(fileName)) {
                    return mail;
                }
            }
            _logger.Set(LogKind.Error, null, 44, fileName);
            return null;
        }
예제 #17
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));
        }
예제 #18
0
파일: MlCreator.cs 프로젝트: jsakamoto/bjd5
        //メールを添付する
        public Mail Attach(string subject, Mail orgMail)
        {
            var mail = new Mail();

            mail.AppendLine(Encoding.ASCII.GetBytes("\r\n"));//区切り行(ヘッダ終了)
            //ヘッダ作成
            mail.AddHeader("subject", subject);
            //本文作成
            mail.AppendLine(Encoding.ASCII.GetBytes(subject + "\r\n"));
            mail.AppendLine(Encoding.ASCII.GetBytes("\r\n"));
            mail.AppendLine(Encoding.ASCII.GetBytes("Original mail as follows:\r\n"));
            mail.AppendLine(Encoding.ASCII.GetBytes("\r\n"));
            //オリジナルメールの添付
            var body = Inet.GetLines(orgMail.GetBytes());
            foreach (var buf in body) {
                mail.AppendLine(Encoding.ASCII.GetBytes("  "));//行頭に空白を追加
                mail.AppendLine(buf);
            }
            return mail;
        }
예제 #19
0
        public void Relpaceによるヘッダの置き換え()
        {
            //setUp
            var replace = new Dat(new CtrlType[]{CtrlType.TextBox, CtrlType.TextBox});
            replace.Add(true, "ABC\tXYZ");
            var sut = new ChangeHeader(replace, null);

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

            var expected = "tag1: XYZ123\r\n";

            //exercise
            sut.Exec(mail, new Logger());
            var actual = Encoding.ASCII.GetString(mail.GetBytes()).Substring(0, 14);

            //varify
            Assert.That(actual, Is.EqualTo(expected));
        }
예제 #20
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));
        }
예제 #21
0
        //元メールを添付して管理者へ送る
        public bool AttachToAmdin(Mail orgMail, string subject, MlEnvelope mlEnvelope)
        {
            //メール生成
            var mail = new Mail();
            mail.AppendLine(Encoding.ASCII.GetBytes("\r\n"));//区切り行(ヘッダ終了)
            mail.AddHeader("subject", subject);
            mail.AppendLine(Encoding.ASCII.GetBytes(subject + "\r\n"));
            mail.AppendLine(Encoding.ASCII.GetBytes("\r\n"));
            mail.AppendLine(Encoding.ASCII.GetBytes("Original mail as follows:\r\n"));
            mail.AppendLine(Encoding.ASCII.GetBytes("\r\n"));
            //オリジナルメールの添付
            var body = Inet.GetLines(orgMail.GetBytes());
            foreach (var buf in body) {
                mail.AppendLine(Encoding.ASCII.GetBytes("  "));//行頭に空白を追加
                mail.AppendLine(buf);
            }

            //宛先設定 from<->To from = mailDaemon
            mail.ConvertHeader("from", _mlAddr.Admin.ToString());
            //配送
            return SendAllAdmin(mlEnvelope.ChangeFrom(_mlAddr.Admin), mail);
        }
예제 #22
0
        public void SaveReadTest()
        {
            var tmpDir = TestUtil.GetTmpDir("$tmp");
            var logger = new Logger();

            var mail = new Mail();
            const string mlName = "1ban";
            var mlMailDb = new MlMailDb(logger, tmpDir, mlName);
            mlMailDb.Remove();//もし、以前のメールが残っていたらTESTが誤動作するので、ここで消しておく

            Assert.AreEqual(mlMailDb.Count(), 0);

            const int max = 10; //試験件数10件
            //保存と、
            for (int i = 0; i < max; i++) {
                var b = mlMailDb.Save( mail);
                Assert.AreEqual(b,true);//保存が成功しているか
                Assert.AreEqual(mlMailDb.Count(), i+1);//連番がインクリメントしているか
            }
            //範囲外のメール取得でnullが返るか
            //no==1..10が取得可能
            var m = mlMailDb.Read(0);//範囲外
            Assert.IsNull(m);
            //範囲内
            for (int no = 1; no <= max; no++) {
                //m = mlMailDb.Read(no);
                mlMailDb.Read(no);
                Assert.NotNull(mlMailDb.Read(no));
            }
            //範囲外
            m = mlMailDb.Read(11);
            Assert.IsNull(m);

            //TearDown
            mlMailDb.Remove();
            mlMailDb.Dispose();
            Directory.Delete(tmpDir,true);
        }
예제 #23
0
        public void Dataの動作確認_Bodyの確認_ドットのみの行を含む(InetKind inetKind)
        {
            //setUp
            var sut = CreateSmtpClient(inetKind);

            var mail1 = new Mail();
            mail1.Init2(Encoding.ASCII.GetBytes("1:1\r\n\r\nbody1\r\nbody2\r\n.\r\n"));

            //exercise
            sut.Connect();
            sut.Helo();
            sut.Mail("1@1");
            sut.Rcpt("*****@*****.**");
            sut.Data(mail1);
            sut.Quit();

            //verify
            var mail2 = _testServer.GetMf("user1")[0];
            Assert.That(mail2.GetBody(), Is.EqualTo(mail1.GetBody()));

            //tearDown
            sut.Dispose();
        }
예제 #24
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;
     }
 }
예제 #25
0
파일: MailQueue.cs 프로젝트: jsakamoto/bjd5
 public bool Read(string fname, ref Mail mail)
 {
     lock (_lockObj) {//�r������
         var fileName = string.Format("{0}\\MF_{1}", Dir, fname);
         return mail.Read(fileName);
     }
 }
예제 #26
0
        public bool Data(Mail mail)
        {
            //トランザクションでない場合エラー
            if (Status != SmtpClientStatus.Transaction) {
                SetLastError("Data() Status != Transaction");
                return false;
            }
            //DATA送信
            if (!SendCmd("DATA")) {
                return false;
            }
            //354受信
            if (!RecvStatus(354)) {
                return false;
            }
            var lines = Inet.GetLines(mail.GetBytes());
            foreach (var l in lines){

                //ドットのみの行の場合、ドットを追加する
                if (l.Length == 3 && l[0] == '.' && l[1] == '\r' && l[2] == '\n'){
                    var buf = new byte[1]{l[0]};
                    _sockTcp.Send(buf);
                }
                if (l.Length != _sockTcp.Send(l)){
                    SetLastError(String.Format("Faild in SmtpClient Data()"));
                    ConfirmConnect();//接続確認
                    return false;
                }
            }
            //最終行が改行で終わっているかどうかの確認
            var last = lines[lines.Count - 1];
            if (last.Length < 2 || last[last.Length - 2] != '\r' || last[last.Length - 1] != '\n'){
                SendCmd("");//改行を送る
            }
            if (!SendCmd(".")){
                return false;
            }
            //250受信
            if (!RecvStatus(250)) {
                return false;
            }
            return true;
        }
예제 #27
0
파일: Data.cs 프로젝트: jsakamoto/bjd5
        long _len; //受信バッファのデータ量(受信サイズ制限に使用する)

        #endregion Fields

        #region Constructors

        public Data(long sizeLimit)
        {
            _sizeLimit = sizeLimit;
            Mail = new Mail();
        }
예제 #28
0
파일: Data.cs 프로젝트: jsakamoto/bjd5
 public void Dispose()
 {
     Mail.Dispose();
     Mail = null;
 }
예제 #29
0
파일: Mail.cs 프로젝트: jsakamoto/bjd5
 public Mail CreateClone()
 {
     var mail = new Mail();
     //�w�b�_�s
     _header.ForEach(s => mail.AppendLine(Encoding.ASCII.GetBytes(s)));
     //��؂�s
     mail.AppendLine(Encoding.ASCII.GetBytes("\r\n"));
     //�{��
     _body.ForEach(d => mail.AppendLine(d));
     return mail;
 }
예제 #30
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;
        }