Пример #1
0
        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); //メール削除
            }
        }