bool SpanFunc(DelegateFunc func, Mail orgMail, MlEnvelope mlEnvelope, MlParamSpan mlParamSpan) { var max = _maxGet; var s = mlParamSpan.Start; var e = mlParamSpan.Start + max - 1; bool finish = false; while (!finish) { if (e >= mlParamSpan.End) { e = mlParamSpan.End; finish = true; } var mail = func(s, e); mail.AddHeader("from", _mlAddr.Admin.ToString()); mail.AddHeader("to", ReturnTo(orgMail, mlEnvelope)); //送信者をそのまま受信者にする mail.ConvertHeader("date", Util.LocalTime2Str(DateTime.Now)); //日付 if (!_mlSender.Send(mlEnvelope.Swap().ChangeFrom(_mlAddr.Admin), mail)) { return(false); } s = e + 1; e = s + max - 1; } return(true); }
public bool Send(MlEnvelope mlEnvelope, Mail orgMail) { var mail = orgMail.CreateClone();//ヘッダを変更するためにテンポラリを作成する //MlCreatorで追加されない FromとToをここでセットする //var from = mail.GetHeader("from"); //if (from==null || from.IndexOf(mlEnvelope.From.ToString()) == -1) { // mail.ConvertHeader("from", mlEnvelope.From.ToString()); //} //mail.ConvertHeader("from",mlEnvelope.From.ToString()); //var to = mail.GetHeader("to"); //if (to == null) { // mail.AddHeader("to", mlEnvelope.To.ToString()); //} 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); } else { logger.Set(LogKind.Error, null, 39, string.Format("From:{0} To:{1}", mlEnvelope.From, mlEnvelope.To)); return(true); } }
//元メールを添付して管理者へ送る 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 Error(MlEnvelope mlEnvelope, string subject) { var mail = Create(ContentTyep.Ascii, subject, ""); mail.ConvertHeader("date", Util.LocalTime2Str(DateTime.Now));//日付 return(_mlSender.Send(mlEnvelope.Swap().ChangeFrom(_mlAddr.Admin), mail)); }
//折り返しメールのためのToヘッダの作成 string ReturnTo(Mail mail, MlEnvelope mlEnvelope) { //元メールのFromヘッダを取得する //無い場合は、mlEmvelope.Fromからセットする var to = mail.GetHeader("from") ?? mlEnvelope.From.ToString(); return(to); }
//各種のドキュメントをname-admin@domainから送信者へ送る public bool Doc(MlDocKind mlDocKind, Mail orgMail, MlEnvelope mlEnvelope) { var mail = Fixed(mlDocKind); 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 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 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 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 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 TestMail(string from, string to, string bodyStr) { this.Mail = new Mail(null); Mail.Init(Encoding.ASCII.GetBytes("\r\n"));//区切り行(ヘッダ終了) var body = Encoding.ASCII.GetBytes(bodyStr); Mail.Init(body); Mail.AddHeader("from", from); Mail.AddHeader("to", to); var host = "TEST"; var addr = new Ip("10.0.0.1"); MlEnvelope = new MlEnvelope(CreateMailAddress(from), CreateMailAddress(to), host, addr); }
//メンバー以外は投稿できません 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 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)); }
//メール保存(MLとそれ以外を振り分ける) public bool MailSave2(MailAddress from, MailAddress to, Mail mail, string host, Ip addr) { //#if ML_SERVER if (_mlList.IsUser(to)) { var mlEnvelope = new MlEnvelope(from, to, host, addr); return(_mlList.Job(mlEnvelope, mail)); } else { //#endif return(_mailSave.Save(from, to, mail, host, addr)); //#if ML_SERVER } //#endif }
//管理者すべてに送信する public bool SendAllAdmin(MlEnvelope mlEnvelope, Mail mail) { foreach (MlOneUser to in _mlUserList) { if (!to.Enable || !to.IsManager) { continue; //管理者アドレス } var mlenv = mlEnvelope.ChangeTo(to.MailAddress); //受信者を管理者に変更する var tmpMail = mail.CreateClone(); tmpMail.ConvertHeader("to", to.MailAddress.ToString()); if (!_mlSender.Send(mlenv, tmpMail)) { return(false);//失敗した場合は、全宛先に送信されない } } return(true); }
//「投稿アドレス」宛の処理 bool JobMain(MlEnvelope mlEnvelope, Mail mail, MlOneUser mlOneUser) { //投稿者がメンバー以外若しくは投稿が許可されていない場合 if (mlOneUser == null || !mlOneUser.IsContributor) { _logger.Set(LogKind.Detail, null, 34, string.Format("from:{0}", mlEnvelope.From)); //投稿者にDenyメールを送信 _mlDevivery.Deny(mail, mlEnvelope); //メールを添付して管理者へ var subject = string.Format("NOT MEMBER article from {0} ({1} ML)", mlEnvelope.From, _mlAddr.Name); return(_mlDevivery.AttachToAmdin(mail, subject, mlEnvelope)); } //投稿者が有効な場合 _logger.Set(LogKind.Detail, null, 33, string.Format("from:{0}", mlEnvelope.From)); //各メンバーへの配信 return(_mlDevivery.Post(mail, mlEnvelope)); }
//MLメイン処理(投稿者の有効無効・管理者アドレス・制御アドレス宛の処理も、この中で分岐して行う) public bool Job(MlEnvelope mlEnvelope, Mail mail) { //メンバーの検索 var mlOneUser = _mlUserList.Search(mlEnvelope.From); switch (_mlAddr.GetKind(mlEnvelope.To)) { case MlAddrKind.Post: //「投稿アドレス」宛の処理 return(JobMain(mlEnvelope, mail, mlOneUser)); case MlAddrKind.Ctrl: //「制御アドレス」宛の処理 JobCtrl(mlEnvelope, mail, mlOneUser); return(true); //MailBoxの処置としては成功 case MlAddrKind.Admin: //「管理者アドレス」宛の処理 return(_mlDevivery.SendAllAdmin(mlEnvelope, mail)); //全管理者への送信 } return(false); //無効アドレス }
//投稿 public bool Post(Mail mail, MlEnvelope mlEnvelope) { //var no = mlDb.IncNo(mlAddr.Name);//インクリメントした記事番号の取得 var incNo = _mlDb.Count() + 1;//インクリメントした記事番号の取得 //記事メールの編集 //Subject:の変更 mail.ConvertHeader("subject", _mlSubject.Get(mail.GetHeader("subject"), incNo)); //Reply-To:の追加 mail.ConvertHeader("Reply-To", string.Format("\"{0}\"<{1}>", _mlAddr.Name, _mlAddr.Post)); //List-Id:の追加 mail.ConvertHeader("List-Id", string.Format("{0}.{1}", _mlAddr.Name, _mlAddr.DomainList[0])); //List-Software:の追加 mail.ConvertHeader("List-Software", string.Format("{0}", Define.ApplicationName())); //List-Post:の追加 mail.ConvertHeader("List-Post", string.Format("<mailto:{0}>", _mlAddr.Post)); //List-Owner:の追加 mail.ConvertHeader("List-Owner", string.Format("<mailto:{0}>", _mlAddr.Admin)); //List-Help:の追加 mail.ConvertHeader("List-Help", string.Format("<mailto:{0}?body=help>", _mlAddr.Ctrl)); //List-Unsubscribe:の追加 mail.ConvertHeader("List-Unsubscribe", string.Format("<mailto:{0}?body=unsubscribe>", _mlAddr.Ctrl)); //ライブラリへの保存 _mlDb.Save(mail); //各メンバーへの配信 foreach (MlOneUser to in _mlUserList) { if (to.Enable && to.IsReader) //「配信する」のみが対象となる { if (!_mlSender.Send(mlEnvelope.ChangeTo(to.MailAddress), mail)) { //配信に失敗したメールを管理者に転送する var subject = string.Format("DELIVERY ERROR article to {0} ({1} ML)", to, _mlAddr.Name); return(AttachToAmdin(mail, subject, mlEnvelope)); } } } return(true); }
//元メールを添付して管理者へ送る 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 Send(MlEnvelope mlEnvelope,Mail orgMail) { var mail = orgMail.CreateClone();//ヘッダを変更するためにテンポラリを作成する //MlCreatorで追加されない FromとToをここでセットする //var from = mail.GetHeader("from"); //if (from==null || from.IndexOf(mlEnvelope.From.ToString()) == -1) { // mail.ConvertHeader("from", mlEnvelope.From.ToString()); //} //mail.ConvertHeader("from",mlEnvelope.From.ToString()); //var to = mail.GetHeader("to"); //if (to == null) { // mail.AddHeader("to", mlEnvelope.To.ToString()); //} 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; } else { logger.Set(LogKind.Error, null, 39, string.Format("From:{0} To:{1}", mlEnvelope.From, mlEnvelope.To)); return true; } }
public bool Get(Mail mail, MlEnvelope mlEnvelope, MlParamSpan mlParamSpan) { return SpanFunc(Get1, mail, mlEnvelope, mlParamSpan); }
//MLメイン処理(投稿者の有効無効・管理者アドレス・制御アドレス宛の処理も、この中で分岐して行う) public bool Job(MlEnvelope mlEnvelope, Mail mail) { //メンバーの検索 var mlOneUser = _mlUserList.Search(mlEnvelope.From); switch (_mlAddr.GetKind(mlEnvelope.To)) { case MlAddrKind.Post://「投稿アドレス」宛の処理 return JobMain(mlEnvelope, mail, mlOneUser); case MlAddrKind.Ctrl://「制御アドレス」宛の処理 JobCtrl(mlEnvelope, mail, mlOneUser); return true;//MailBoxの処置としては成功 case MlAddrKind.Admin://「管理者アドレス」宛の処理 return _mlDevivery.SendAllAdmin(mlEnvelope, mail);//全管理者への送信 } return false;//無効アドレス }
//「投稿アドレス」宛の処理 bool JobMain(MlEnvelope mlEnvelope, Mail mail, MlOneUser mlOneUser) { //投稿者がメンバー以外若しくは投稿が許可されていない場合 if (mlOneUser == null || !mlOneUser.IsContributor) { _logger.Set(LogKind.Detail, null, 34, string.Format("from:{0}", mlEnvelope.From)); //投稿者にDenyメールを送信 _mlDevivery.Deny(mail, mlEnvelope); //メールを添付して管理者へ var subject = string.Format("NOT MEMBER article from {0} ({1} ML)", mlEnvelope.From, _mlAddr.Name); return _mlDevivery.AttachToAmdin(mail, subject, mlEnvelope); } //投稿者が有効な場合 _logger.Set(LogKind.Detail, null, 33, string.Format("from:{0}", mlEnvelope.From)); //各メンバーへの配信 return _mlDevivery.Post(mail, mlEnvelope); }
//「制御アドレス」宛の処理 void JobCtrl(MlEnvelope mlEnvelope, Mail mail, MlOneUser mlOneUser) { var adminLogin = false;//管理者としての認証が済んでいるかどうかのフラグ var log = new StringBuilder();//コマンドLog var mlCmd = new MlCmd(_logger, mail, mlOneUser);//コマンド解釈 //var envelopeAdmin = mlEnvelope.ChangeFrom(mlAddr.Admin); var envelopeReturn = mlEnvelope.Swap().ChangeFrom(_mlAddr.Admin); //コマンドの処理 foreach (OneMlCmd oneCmd in mlCmd) { //ログ出力 var memberStr = (oneCmd.MlOneUser == null) ? "not member" : oneCmd.MlOneUser.MailAddress.ToString(); var prompt = adminLogin ? "#" : "$"; var logStr = string.Format("{0}>{1} {2} [{3}]", prompt, oneCmd.CmdKind.ToString().ToLower(), oneCmd.ParamStr, memberStr); log.Append(logStr + "\r\n"); _logger.Set(LogKind.Detail, null, 41, logStr); //メンバーでない場合 if (mlOneUser == null) { //subscribe/confirm の場合 if (oneCmd.CmdKind == MlCmdKind.Subscribe || oneCmd.CmdKind == MlCmdKind.Confirm){ if (_autoRegistration) {//自動登録が有効の場合、処理対象になる goto ok; } } //メンバー外からのリクエストの場合、Guide以外は受け付けない if (oneCmd.CmdKind != MlCmdKind.Guide) { //投稿者にDenyメールを送信 _mlDevivery.Deny(mail, mlEnvelope); break; } } ok: //権限確認 return "" エラーなし var errStr = ""; switch (oneCmd.CmdKind) { case MlCmdKind.Guide: break; case MlCmdKind.Exit: case MlCmdKind.Quit: case MlCmdKind.Members: case MlCmdKind.Member: case MlCmdKind.Summary: case MlCmdKind.Subject: break; case MlCmdKind.Bye: case MlCmdKind.Unsubscribe: if (oneCmd.MlOneUser.IsManager) { errStr = _kernel.IsJp() ? "管理者は、このコマンドを使用できません" : "cannot use a manager"; } break; case MlCmdKind.Subscribe: case MlCmdKind.Confirm: if (mlOneUser != null){ errStr = _kernel.IsJp() ? "このコマンドはメンバー以外しか使用できません" : "cannot use a memeber"; } break; case MlCmdKind.Password: case MlCmdKind.Add: case MlCmdKind.Del: if (!oneCmd.MlOneUser.IsManager) {//管理者しか使用できない errStr = _kernel.IsJp() ? "このコマンドは管理者しか使用できません" : "net administrator"; } break; } if (errStr != "") {//権限に問題あり _logger.Set(LogKind.Error, null, 47, errStr); log.Append(errStr + "\r\n"); goto end; } //管理者ログイン確認 if (!adminLogin) { switch (oneCmd.CmdKind) { case MlCmdKind.Del: case MlCmdKind.Add: _logger.Set(LogKind.Error, null, 50, "The certification is not over"); log.Append(errStr + "\r\n"); goto end; } } //パラメータの処理 MlParamSpan mlParamSpan = null; switch (oneCmd.CmdKind) { case MlCmdKind.Get: case MlCmdKind.Summary: case MlCmdKind.Subject: mlParamSpan = new MlParamSpan(oneCmd.ParamStr, _mlMailDb.Count()); if (mlParamSpan.Start == -1) { errStr = _kernel.IsJp() ? "パラメータに矛盾がありあます" : "Appointment includes contradiction"; _logger.Set(LogKind.Error, null, 51, errStr); log.Append(errStr + "\r\n"); //ここエラーメールを返すようにする _mlDevivery.Error(mlEnvelope, string.Format("ERROR \"{0} {1}\"", oneCmd.CmdKind.ToString().ToUpper(),oneCmd.ParamStr)); goto end; } break; } switch (oneCmd.CmdKind) { case MlCmdKind.Bye: case MlCmdKind.Unsubscribe: //メンバーの削除 using (var dat = _mlUserList.Del(mlEnvelope.From)){ if (dat == null){ errStr = _kernel.IsJp() ? "メンバーの削除に失敗しました" : "Failed in delete of a member"; } else{ UpdateMemberList(dat);//memberListの更新 } } break; case MlCmdKind.Password: if (mlOneUser.Psssword == oneCmd.ParamStr) { adminLogin = true;//管理者として認証 } else { errStr = _kernel.IsJp() ? "パスワードが違います" : "A password is different"; } break; case MlCmdKind.Del: var tmp = oneCmd.ParamStr.Split(new char[] { ' ' }, 2); var mailAddress = new MailAddress(tmp[0]); //メンバーの削除 using (var dat = _mlUserList.Del(mailAddress)){ if (dat == null){ errStr = _kernel.IsJp() ? "メンバーの削除に失敗しました" : "Failed in addition of a member"; } else{ UpdateMemberList(dat);//memberListの更新 } } break; case MlCmdKind.Add: //メンバーの追加 var tmp2 = oneCmd.ParamStr.Split(new char[] { ' ' }, 2); var mailAddress2 = new MailAddress(tmp2[0]); var name = "USER";//表示名が指定されていない場合 if (tmp2.Length >= 2){ name = tmp2[1]; } if (null != _mlUserList.Search(mailAddress2)) { errStr = _kernel.IsJp() ? "既にメンバーが登録されています" : "There is already a member"; } else { using(var dat = _mlUserList.Add(mailAddress2, name)){ if (dat == null){ errStr = _kernel.IsJp() ? "メンバーの追加に失敗しました" : "Failed in addition of a member"; } else{ UpdateMemberList(dat);//memberListの更新 } } } break; case MlCmdKind.Subscribe: { var oneSubscribe = _mlSubscribeDb.Search(mlEnvelope.From); if (oneSubscribe == null) { oneSubscribe = _mlSubscribeDb.Add(mlEnvelope.From, oneCmd.ParamStr);//subscribeDbへの追加 } var confirmStr = string.Format("confirm {0} {1}", oneSubscribe.ConfirmStr, oneSubscribe.Name); _mlSender.Send(envelopeReturn, _mlCreator2.Confirm(confirmStr)); log.Length = 0;//ログメールの送信抑制 } break; case MlCmdKind.Confirm: { var success = false; var oneSubscribe = _mlSubscribeDb.Search(mlEnvelope.From); if (oneSubscribe != null) { //Ver6.0.1 var paramStr = string.Format("{0} {1}", oneSubscribe.ConfirmStr, oneSubscribe.Name); if (oneCmd.ParamStr == paramStr){ success = true; //認証成功 _mlSubscribeDb.Del(mlEnvelope.From); //subscribeDbの削除 if (_autoRegistration){ //自動登録の場合 //メンバーの追加 using (var dat = _mlUserList.Add(mlEnvelope.From, oneSubscribe.Name)){ if (dat != null){ UpdateMemberList(dat); //memberListの更新 //Welcodeメールの送信 _mlSender.Send(envelopeReturn, _mlCreator2.Welcome()); _logger.Set(LogKind.Detail, null, 46, mlEnvelope.From.ToString()); } else{ _logger.Set(LogKind.Detail, null, 48, mlEnvelope.From.ToString()); } } } else{ //管理者による登録 //管理者宛にconfirmが有ったことを連絡する var mlenv = mlEnvelope.ChangeFrom(_mlAddr.Admin).ChangeTo(_mlAddr.Admin); var appendStr = string.Format("{0} {1}", mlEnvelope.From, oneSubscribe.Name); _mlSender.Send(mlenv, _mlCreator2.Append(appendStr)); } } //confirm行の検索 //var confirmStr = string.Format("confirm {0} {1}", oneSubscribe.ConfirmStr, oneSubscribe.Name); //var lines = Inet.GetLines(mail.GetBody()); //foreach (var line in lines) { // var str = mail.GetEncoding().GetString(line); // if (str.IndexOf(confirmStr) != -1) { // success = true;//認証成功 // // _mlSubscribeDb.Del(mlEnvelope.From);//subscribeDbの削除 // // if (_autoRegistration) {//自動登録の場合 // //メンバーの追加 // using (var dat = _mlUserList.Add(mlEnvelope.From, oneSubscribe.Name)) { // if (dat != null){ // // UpdateMemberList(dat);//memberListの更新 // // //Welcodeメールの送信 // _mlSender.Send(envelopeReturn, _mlCreator2.Welcome()); // _logger.Set(LogKind.Detail, null, 46, mlEnvelope.From.ToString()); // // } // else{ // _logger.Set(LogKind.Detail, null, 48, mlEnvelope.From.ToString()); // } // } // } else { // //管理者による登録 // //管理者宛にconfirmが有ったことを連絡する // var mlenv = mlEnvelope.ChangeFrom(_mlAddr.Admin).ChangeTo(_mlAddr.Admin); // var appendStr = string.Format("{0} {1}", mlEnvelope.From, oneSubscribe.Name); // _mlSender.Send(mlenv, _mlCreator2.Append(appendStr)); // // } // } // } } if (!success) { //認証失敗 _mlSender.Send(envelopeReturn, _mlCreator2.Guide()); } } break; case MlCmdKind.Members: case MlCmdKind.Member: var sb = new StringBuilder(); foreach (var o in from MlOneUser o in _mlUserList where !o.IsManager select o){ sb.Append(string.Format("{0} {1}\r\n", o.MailAddress,o.Name)); } _mlSender.Send(envelopeReturn, _mlCreator2.Member(sb.ToString())); break; case MlCmdKind.Get: _mlDevivery.Get(mail, mlEnvelope, mlParamSpan); break; case MlCmdKind.Summary: case MlCmdKind.Subject: _mlDevivery.Summary(mail, mlEnvelope, mlParamSpan); break; case MlCmdKind.Guide: _mlDevivery.Doc(MlDocKind.Guide, mail, mlEnvelope); break; case MlCmdKind.Help: _mlDevivery.Doc(mlOneUser.IsManager ? MlDocKind.Admin : MlDocKind.Help, mail, mlEnvelope); break; case MlCmdKind.Exit: case MlCmdKind.Quit: goto end;//コマンド終了 } if (errStr != ""){ //コマンド実行にエラー発生 log.Append(string.Format("error! {0}\r\n", errStr)); _logger.Set(LogKind.Error, null, 49, errStr); goto end; } log.Append("success!\r\n"); } end: ; //ログが必要なコマンド時だけログを送信する //if (log.Length != 0) { // mlSender2.Send(envelopeAdmin,mlCreator2.Log(log.ToString())); //} }
//投稿 public bool Post(Mail mail, MlEnvelope mlEnvelope) { //var no = mlDb.IncNo(mlAddr.Name);//インクリメントした記事番号の取得 var incNo = _mlDb.Count() + 1;//インクリメントした記事番号の取得 //記事メールの編集 //Subject:の変更 mail.ConvertHeader("subject", _mlSubject.Get(mail.GetHeader("subject"), incNo)); //Reply-To:の追加 mail.ConvertHeader("Reply-To", string.Format("\"{0}\"<{1}>", _mlAddr.Name, _mlAddr.Post)); //List-Id:の追加 mail.ConvertHeader("List-Id", string.Format("{0}.{1}", _mlAddr.Name, _mlAddr.DomainList[0])); //List-Software:の追加 mail.ConvertHeader("List-Software", string.Format("{0}", Define.ApplicationName())); //List-Post:の追加 mail.ConvertHeader("List-Post", string.Format("<mailto:{0}>", _mlAddr.Post)); //List-Owner:の追加 mail.ConvertHeader("List-Owner", string.Format("<mailto:{0}>", _mlAddr.Admin)); //List-Help:の追加 mail.ConvertHeader("List-Help", string.Format("<mailto:{0}?body=help>", _mlAddr.Ctrl)); //List-Unsubscribe:の追加 mail.ConvertHeader("List-Unsubscribe", string.Format("<mailto:{0}?body=unsubscribe>", _mlAddr.Ctrl)); //ライブラリへの保存 _mlDb.Save(mail); //各メンバーへの配信 foreach (MlOneUser to in _mlUserList) { if (to.Enable && to.IsReader) {//「配信する」のみが対象となる if (!_mlSender.Send(mlEnvelope.ChangeTo(to.MailAddress), mail)) { //配信に失敗したメールを管理者に転送する var subject = string.Format("DELIVERY ERROR article to {0} ({1} ML)", to, _mlAddr.Name); return AttachToAmdin(mail, subject, mlEnvelope); } } } return true; }
//各種のドキュメントをname-admin@domainから送信者へ送る public bool Doc(MlDocKind mlDocKind, Mail orgMail, MlEnvelope mlEnvelope) { var mail = Fixed(mlDocKind); 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 bool Summary(Mail mail, MlEnvelope mlEnvelope, MlParamSpan mlParamSpan) { return(SpanFunc(Summary1, mail, mlEnvelope, mlParamSpan)); }
public bool Get(Mail mail, MlEnvelope mlEnvelope, MlParamSpan mlParamSpan) { return(SpanFunc(Get1, mail, mlEnvelope, mlParamSpan)); }
public bool Summary(Mail mail, MlEnvelope mlEnvelope, MlParamSpan mlParamSpan) { return SpanFunc(Summary1, mail, mlEnvelope, mlParamSpan); }
//折り返しメールのためのToヘッダの作成 string ReturnTo(Mail mail, MlEnvelope mlEnvelope) { //元メールのFromヘッダを取得する //無い場合は、mlEmvelope.Fromからセットする var to = mail.GetHeader("from") ?? mlEnvelope.From.ToString(); return to; }
bool SpanFunc(DelegateFunc func, Mail orgMail, MlEnvelope mlEnvelope, MlParamSpan mlParamSpan) { var max = _maxGet; var s = mlParamSpan.Start; var e = mlParamSpan.Start + max - 1; bool finish = false; while (!finish) { if (e >= mlParamSpan.End) { e = mlParamSpan.End; finish = true; } var mail = func(s, e); mail.AddHeader("from", _mlAddr.Admin.ToString()); mail.AddHeader("to", ReturnTo(orgMail, mlEnvelope));//送信者をそのまま受信者にする mail.ConvertHeader("date", Util.LocalTime2Str(DateTime.Now));//日付 if (!_mlSender.Send(mlEnvelope.Swap().ChangeFrom(_mlAddr.Admin), mail)) { return false; } s = e + 1; e = s + max - 1; } return true; }
//エラーメールを返信する public bool Error(MlEnvelope mlEnvelope,string subject) { var mail = Create(ContentTyep.Ascii, subject,""); mail.ConvertHeader("date", Util.LocalTime2Str(DateTime.Now));//日付 return _mlSender.Send(mlEnvelope.Swap().ChangeFrom(_mlAddr.Admin), mail); }
//管理者すべてに送信する public bool SendAllAdmin(MlEnvelope mlEnvelope, Mail mail) { foreach (MlOneUser to in _mlUserList) { if (!to.Enable || !to.IsManager) continue; //管理者アドレス var mlenv = mlEnvelope.ChangeTo(to.MailAddress);//受信者を管理者に変更する var tmpMail = mail.CreateClone(); tmpMail.ConvertHeader("to", to.MailAddress.ToString()); if (!_mlSender.Send(mlenv, tmpMail)) { return false;//失敗した場合は、全宛先に送信されない } } return true; }
//メール保存(MLとそれ以外を振り分ける) public bool MailSave2(MailAddress from, MailAddress to, Mail mail, string host, Ip addr) { //#if ML_SERVER if (_mlList.IsUser(to)) { var mlEnvelope = new MlEnvelope(from, to, host, addr); return _mlList.Job(mlEnvelope,mail); } else { //#endif return _mailSave.Save(from, to, mail, host, addr); //#if ML_SERVER } //#endif }
//「制御アドレス」宛の処理 void JobCtrl(MlEnvelope mlEnvelope, Mail mail, MlOneUser mlOneUser) { var adminLogin = false; //管理者としての認証が済んでいるかどうかのフラグ var log = new StringBuilder(); //コマンドLog var mlCmd = new MlCmd(_logger, mail, mlOneUser);//コマンド解釈 //var envelopeAdmin = mlEnvelope.ChangeFrom(mlAddr.Admin); var envelopeReturn = mlEnvelope.Swap().ChangeFrom(_mlAddr.Admin); //コマンドの処理 foreach (OneMlCmd oneCmd in mlCmd) { //ログ出力 var memberStr = (oneCmd.MlOneUser == null) ? "not member" : oneCmd.MlOneUser.MailAddress.ToString(); var prompt = adminLogin ? "#" : "$"; var logStr = string.Format("{0}>{1} {2} [{3}]", prompt, oneCmd.CmdKind.ToString().ToLower(), oneCmd.ParamStr, memberStr); log.Append(logStr + "\r\n"); _logger.Set(LogKind.Detail, null, 41, logStr); //メンバーでない場合 if (mlOneUser == null) { //subscribe/confirm の場合 if (oneCmd.CmdKind == MlCmdKind.Subscribe || oneCmd.CmdKind == MlCmdKind.Confirm) { if (_autoRegistration) //自動登録が有効の場合、処理対象になる { goto ok; } } //メンバー外からのリクエストの場合、Guide以外は受け付けない if (oneCmd.CmdKind != MlCmdKind.Guide) { //投稿者にDenyメールを送信 _mlDevivery.Deny(mail, mlEnvelope); break; } } ok: //権限確認 return "" エラーなし var errStr = ""; switch (oneCmd.CmdKind) { case MlCmdKind.Guide: break; case MlCmdKind.Exit: case MlCmdKind.Quit: case MlCmdKind.Members: case MlCmdKind.Member: case MlCmdKind.Summary: case MlCmdKind.Subject: break; case MlCmdKind.Bye: case MlCmdKind.Unsubscribe: if (oneCmd.MlOneUser.IsManager) { errStr = _kernel.IsJp() ? "管理者は、このコマンドを使用できません" : "cannot use a manager"; } break; case MlCmdKind.Subscribe: case MlCmdKind.Confirm: if (mlOneUser != null) { errStr = _kernel.IsJp() ? "このコマンドはメンバー以外しか使用できません" : "cannot use a memeber"; } break; case MlCmdKind.Password: case MlCmdKind.Add: case MlCmdKind.Del: if (!oneCmd.MlOneUser.IsManager) //管理者しか使用できない { errStr = _kernel.IsJp() ? "このコマンドは管理者しか使用できません" : "net administrator"; } break; } if (errStr != "") //権限に問題あり { _logger.Set(LogKind.Error, null, 47, errStr); log.Append(errStr + "\r\n"); goto end; } //管理者ログイン確認 if (!adminLogin) { switch (oneCmd.CmdKind) { case MlCmdKind.Del: case MlCmdKind.Add: _logger.Set(LogKind.Error, null, 50, "The certification is not over"); log.Append(errStr + "\r\n"); goto end; } } //パラメータの処理 MlParamSpan mlParamSpan = null; switch (oneCmd.CmdKind) { case MlCmdKind.Get: case MlCmdKind.Summary: case MlCmdKind.Subject: mlParamSpan = new MlParamSpan(oneCmd.ParamStr, _mlMailDb.Count()); if (mlParamSpan.Start == -1) { errStr = _kernel.IsJp() ? "パラメータに矛盾がありあます" : "Appointment includes contradiction"; _logger.Set(LogKind.Error, null, 51, errStr); log.Append(errStr + "\r\n"); //ここエラーメールを返すようにする _mlDevivery.Error(mlEnvelope, string.Format("ERROR \"{0} {1}\"", oneCmd.CmdKind.ToString().ToUpper(), oneCmd.ParamStr)); goto end; } break; } switch (oneCmd.CmdKind) { case MlCmdKind.Bye: case MlCmdKind.Unsubscribe: //メンバーの削除 using (var dat = _mlUserList.Del(mlEnvelope.From)){ if (dat == null) { errStr = _kernel.IsJp() ? "メンバーの削除に失敗しました" : "Failed in delete of a member"; } else { UpdateMemberList(dat); //memberListの更新 } } break; case MlCmdKind.Password: if (mlOneUser.Psssword == oneCmd.ParamStr) { adminLogin = true; //管理者として認証 } else { errStr = _kernel.IsJp() ? "パスワードが違います" : "A password is different"; } break; case MlCmdKind.Del: var tmp = oneCmd.ParamStr.Split(new char[] { ' ' }, 2); var mailAddress = new MailAddress(tmp[0]); //メンバーの削除 using (var dat = _mlUserList.Del(mailAddress)){ if (dat == null) { errStr = _kernel.IsJp() ? "メンバーの削除に失敗しました" : "Failed in addition of a member"; } else { UpdateMemberList(dat); //memberListの更新 } } break; case MlCmdKind.Add: //メンバーの追加 var tmp2 = oneCmd.ParamStr.Split(new char[] { ' ' }, 2); var mailAddress2 = new MailAddress(tmp2[0]); var name = "USER";//表示名が指定されていない場合 if (tmp2.Length >= 2) { name = tmp2[1]; } if (null != _mlUserList.Search(mailAddress2)) { errStr = _kernel.IsJp() ? "既にメンバーが登録されています" : "There is already a member"; } else { using (var dat = _mlUserList.Add(mailAddress2, name)){ if (dat == null) { errStr = _kernel.IsJp() ? "メンバーの追加に失敗しました" : "Failed in addition of a member"; } else { UpdateMemberList(dat); //memberListの更新 } } } break; case MlCmdKind.Subscribe: { var oneSubscribe = _mlSubscribeDb.Search(mlEnvelope.From); if (oneSubscribe == null) { oneSubscribe = _mlSubscribeDb.Add(mlEnvelope.From, oneCmd.ParamStr); //subscribeDbへの追加 } var confirmStr = string.Format("confirm {0} {1}", oneSubscribe.ConfirmStr, oneSubscribe.Name); _mlSender.Send(envelopeReturn, _mlCreator2.Confirm(confirmStr)); log.Length = 0; //ログメールの送信抑制 } break; case MlCmdKind.Confirm: { var success = false; var oneSubscribe = _mlSubscribeDb.Search(mlEnvelope.From); if (oneSubscribe != null) { //Ver6.0.1 var paramStr = string.Format("{0} {1}", oneSubscribe.ConfirmStr, oneSubscribe.Name); if (oneCmd.ParamStr == paramStr) { success = true; //認証成功 _mlSubscribeDb.Del(mlEnvelope.From); //subscribeDbの削除 if (_autoRegistration) { //自動登録の場合 //メンバーの追加 using (var dat = _mlUserList.Add(mlEnvelope.From, oneSubscribe.Name)){ if (dat != null) { UpdateMemberList(dat); //memberListの更新 //Welcodeメールの送信 _mlSender.Send(envelopeReturn, _mlCreator2.Welcome()); _logger.Set(LogKind.Detail, null, 46, mlEnvelope.From.ToString()); } else { _logger.Set(LogKind.Detail, null, 48, mlEnvelope.From.ToString()); } } } else { //管理者による登録 //管理者宛にconfirmが有ったことを連絡する var mlenv = mlEnvelope.ChangeFrom(_mlAddr.Admin).ChangeTo(_mlAddr.Admin); var appendStr = string.Format("{0} {1}", mlEnvelope.From, oneSubscribe.Name); _mlSender.Send(mlenv, _mlCreator2.Append(appendStr)); } } //confirm行の検索 //var confirmStr = string.Format("confirm {0} {1}", oneSubscribe.ConfirmStr, oneSubscribe.Name); //var lines = Inet.GetLines(mail.GetBody()); //foreach (var line in lines) { // var str = mail.GetEncoding().GetString(line); // if (str.IndexOf(confirmStr) != -1) { // success = true;//認証成功 // // _mlSubscribeDb.Del(mlEnvelope.From);//subscribeDbの削除 // // if (_autoRegistration) {//自動登録の場合 // //メンバーの追加 // using (var dat = _mlUserList.Add(mlEnvelope.From, oneSubscribe.Name)) { // if (dat != null){ // // UpdateMemberList(dat);//memberListの更新 // // //Welcodeメールの送信 // _mlSender.Send(envelopeReturn, _mlCreator2.Welcome()); // _logger.Set(LogKind.Detail, null, 46, mlEnvelope.From.ToString()); // // } // else{ // _logger.Set(LogKind.Detail, null, 48, mlEnvelope.From.ToString()); // } // } // } else { // //管理者による登録 // //管理者宛にconfirmが有ったことを連絡する // var mlenv = mlEnvelope.ChangeFrom(_mlAddr.Admin).ChangeTo(_mlAddr.Admin); // var appendStr = string.Format("{0} {1}", mlEnvelope.From, oneSubscribe.Name); // _mlSender.Send(mlenv, _mlCreator2.Append(appendStr)); // // } // } // } } if (!success) //認証失敗 { _mlSender.Send(envelopeReturn, _mlCreator2.Guide()); } } break; case MlCmdKind.Members: case MlCmdKind.Member: var sb = new StringBuilder(); foreach (var o in from MlOneUser o in _mlUserList where !o.IsManager select o) { sb.Append(string.Format("{0} {1}\r\n", o.MailAddress, o.Name)); } _mlSender.Send(envelopeReturn, _mlCreator2.Member(sb.ToString())); break; case MlCmdKind.Get: _mlDevivery.Get(mail, mlEnvelope, mlParamSpan); break; case MlCmdKind.Summary: case MlCmdKind.Subject: _mlDevivery.Summary(mail, mlEnvelope, mlParamSpan); break; case MlCmdKind.Guide: _mlDevivery.Doc(MlDocKind.Guide, mail, mlEnvelope); break; case MlCmdKind.Help: _mlDevivery.Doc(mlOneUser.IsManager ? MlDocKind.Admin : MlDocKind.Help, mail, mlEnvelope); break; case MlCmdKind.Exit: case MlCmdKind.Quit: goto end; //コマンド終了 } if (errStr != "") { //コマンド実行にエラー発生 log.Append(string.Format("error! {0}\r\n", errStr)); _logger.Set(LogKind.Error, null, 49, errStr); goto end; } log.Append("success!\r\n"); } end: ; //ログが必要なコマンド時だけログを送信する //if (log.Length != 0) { // mlSender2.Send(envelopeAdmin,mlCreator2.Log(log.ToString())); //} }