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(); }
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)); }
//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; }
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); // コマンド数 }
//当該メーリングリストに処理を分岐する public bool Job(MlEnvelope mlEnvelope,Mail mail) { foreach(var ml in _ar) { if (ml.IsUser(mlEnvelope.To)) { return ml.Job(mlEnvelope,mail); } } return false; }
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; }
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))); } }
//メールの送信 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; }
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 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); }
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; }
//メンバー以外は投稿できません 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); }
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; } }
//変換と追加 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)); } }
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);//解釈失敗 } } }
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; }
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)); }
//メールを添付する 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; }
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)); }
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)); }
//元メールを添付して管理者へ送る 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); }
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); }
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(); }
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 bool Read(string fname, ref Mail mail) { lock (_lockObj) {//�r������ var fileName = string.Format("{0}\\MF_{1}", Dir, fname); return mail.Read(fileName); } }
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; }
long _len; //受信バッファのデータ量(受信サイズ制限に使用する) #endregion Fields #region Constructors public Data(long sizeLimit) { _sizeLimit = sizeLimit; Mail = new Mail(); }
public void Dispose() { Mail.Dispose(); Mail = null; }
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; }
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; }