//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 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 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 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; }
//リモート操作(データの取得) 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 RETRによるメール取得(InetKind inetKind) { //setUp var sut = CreatePopClient(inetKind); var expected = true; //exercise sut.Connect(); sut.Login("user2", "user2"); var mail = new Mail(); var actual = sut.Retr(0,mail); //verify Assert.That(actual, Is.EqualTo(expected)); Assert.That(mail.GetBytes().Length, Is.EqualTo(308)); //tearDown sut.Dispose(); }