override protected void OnRunThread() { //ログ用文字列の生成 string mailStr = string.Format("{0} retry:{1}", _oneQueue.MailInfo, _oneQueue.MailInfo.RetryCounter); //[C#] ThreadBaseKind = ThreadBaseKind.Running; //開始ログ _logger.Set(LogKind.Normal, null, 10, mailStr); //ここで、1通のメールを1回処理する //成功か失敗かの処理は、この関数の最後にもってくるべき? //失敗の理由によって、再試行にまわしたり、リターンメールを作成したり・・・・ //リターンのリターンはループの危険性がある var retryMax = (int)_conf.Get("retryMax"); //リトライ回数 var deleteTarget = false; //処理対象のメールを削除するかどうかのフラグ //0.サーバ検索が終わっていない状態からスタート var result = SmtpClientResult.Faild; //Ver5.7.3 無効データの削除 if (_oneQueue.MailInfo.To.Domain == "") { deleteTarget = true; goto end; } //サーバ(アドレス)検索 List <OneSmtpServer> smtpServerList = GetSmtpServerList(_oneQueue.MailInfo.To.Domain); if (smtpServerList.Count == 0) { //サーバ(アドレス)検索失敗(リトライ対象) _logger.Set(LogKind.Error, null, 12, string.Format("domain={0}", _oneQueue.MailInfo.To.Domain));//失敗 } else { //送信処理 foreach (OneSmtpServer oneSmtpServer in smtpServerList) { Ssl ssl = null; if (oneSmtpServer.Ssl) { //クライアント用SSLの初期化 //ssl = new Ssl(server.Logger,oneSmtpServer.TargetServer); ssl = new Ssl(oneSmtpServer.TargetServer); } var timeout = 5; var tcpObj = Inet.Connect(_kernel, oneSmtpServer.Ip, oneSmtpServer.Port, timeout, ssl); if (tcpObj == null) { //serverMain.Logger.Set(LogKind.Error, xx, string.Format("to={0} address={1}", oneQueue.MailInfo.To.ToString(), ip.IpStr)); continue; } //Ver5.9.8 if (tcpObj.SockState != SockState.Connect) { _logger.Set(LogKind.Error, tcpObj, 56, tcpObj.GetLastEror());//失敗 break; } string esmtpUser = null; string esmtpPass = null; if (oneSmtpServer.UseSmtp) { esmtpUser = oneSmtpServer.User; esmtpPass = oneSmtpServer.Pass; } result = _smtpClient2.Send(tcpObj, _kernel.ServerName, _oneQueue.Mail(_mailQueue), _oneQueue.MailInfo.From, _oneQueue.MailInfo.To, esmtpUser, esmtpPass, this); tcpObj.Close(); if (result == SmtpClientResult.Success) { //送信成功 _logger.Set(LogKind.Normal, tcpObj, 11, mailStr);//成功 deleteTarget = true; break; } if (result == SmtpClientResult.ErrorCode) { //明確なエラーの発生 _logger.Set(LogKind.Error, tcpObj, 14, mailStr);//失敗 break; } } if (result == SmtpClientResult.Faild) { _logger.Set(LogKind.Error, null, 13, mailStr);//失敗 } } //エラーコードが返された場合及びリトライ回数を超えている場合、リターンメールを作成する if (result == SmtpClientResult.ErrorCode || retryMax <= _oneQueue.MailInfo.RetryCounter) { var from = new MailAddress((string)_conf.Get("errorFrom")); var to = _oneQueue.MailInfo.From; //Ver_Ml //メール本体からMLメールかどうかを確認する //List-Software: BlackJumboDog Ver 5.0.0-b13 //List-Owner: <mailto:[email protected]> var orgMail = _oneQueue.Mail(_mailQueue); var listSoftware = orgMail.GetHeader("List-Software"); if (listSoftware != null && listSoftware.IndexOf(Define.ApplicationName()) == 0) { var listOwner = orgMail.GetHeader("List-Owner"); if (listOwner != null) { //<mailto:[email protected]> listOwner = listOwner.Trim(new char[] { '<', '>' }); //mailto:[email protected] var admin = listOwner.Substring(7); //[email protected] to = new MailAddress(admin);//宛先をML管理者に変更する } } const string reason = "550 Host unknown"; var mail = MakeErrorMail(from, to, reason, _smtpClient2.LastLog); _logger.Set(LogKind.Normal, null, 15, string.Format("from:{0} to:{1}", from, to)); if (_server.MailSave2(from, to, mail, _oneQueue.MailInfo.Host, _oneQueue.MailInfo.Addr)) { deleteTarget = true; //メール削除 } } end: if (deleteTarget) { _oneQueue.Delete(_mailQueue); //メール削除 } }