protected override void OnSessionCompleted(Relay_Session session, Exception exception)
 {
     base.OnSessionCompleted(session, exception);
     try
     {
         FileStream       fileStream       = (FileStream)session.MessageStream;
         RelayMessageInfo relayMessageInfo = (RelayMessageInfo)session.QueueTag;
         bool             flag             = false;
         if (exception == null)
         {
             flag = true;
             this.Send_DSN_Relayed(session);
         }
         else
         {
             bool flag2 = false;
             if (exception is SMTP_ClientException)
             {
                 flag2 = ((SMTP_ClientException)exception).IsPermanentError;
             }
             if (flag2 || relayMessageInfo.Date.AddMinutes((double)this.m_UndeliveredAfter) < DateTime.Now)
             {
                 this.Send_DSN_Failed(session, exception.Message);
                 flag = true;
             }
             else if (session.Queue.Name.ToLower() == "relay")
             {
                 session.MessageStream.Position = 0L;
                 this.StoreRelayMessage("Retry", Path.GetFileNameWithoutExtension(fileStream.Name), relayMessageInfo.EnvelopeID, relayMessageInfo.Date, session.MessageStream, relayMessageInfo.HostEndPoint, relayMessageInfo.Sender, relayMessageInfo.Recipient, relayMessageInfo.OriginalRecipient, relayMessageInfo.DSN_Notify, relayMessageInfo.DSN_Ret);
                 flag = true;
             }
             else if (!relayMessageInfo.DelayedDeliveryNotifySent && DateTime.Now > relayMessageInfo.Date.AddMinutes((double)this.DelayedDeliveryNotifyAfter))
             {
                 this.Send_DSN_Delayed(session, exception.Message);
                 relayMessageInfo.DelayedDeliveryNotifySent = true;
                 File.WriteAllBytes(fileStream.Name.Replace(".eml", ".info"), relayMessageInfo.ToByte());
             }
         }
         if (flag)
         {
             File.Delete(fileStream.Name);
             File.Delete(fileStream.Name.Replace(".eml", ".info"));
         }
         fileStream.Dispose();
     }
     catch (Exception x)
     {
         DataSmart.MailServer.Error.DumpError(this.m_pVirtualServer.Name, x);
     }
 }
        private void StoreRelayMessage(string queueName, string id, string envelopeID, DateTime date, Stream message, HostEndPoint targetHost, string sender, string to, string originalRecipient, SMTP_DSN_Notify notify, SMTP_DSN_Ret ret)
        {
            if (queueName == null)
            {
                throw new ArgumentNullException("queueName");
            }
            if (queueName == "")
            {
                throw new ArgumentException("Argumnet 'queueName' value must be specified.");
            }
            if (id == null)
            {
                throw new ArgumentNullException("id");
            }
            if (id == "")
            {
                throw new ArgumentException("Argument 'id' value must be specified.");
            }
            if (message == null)
            {
                throw new ArgumentNullException("message");
            }
            if (to == null)
            {
                throw new ArgumentNullException("to");
            }
            if (to == "")
            {
                throw new ArgumentException("Argument 'to' value must be specified.");
            }
            string text = this.m_pVirtualServer.MailStorePath + queueName;

            if (!Directory.Exists(text))
            {
                Directory.CreateDirectory(text);
            }
            using (FileStream fileStream = File.Create(PathHelper.PathFix(text + "\\" + id + ".eml")))
            {
                SCore.StreamCopy(message, fileStream);
                RelayMessageInfo relayMessageInfo = new RelayMessageInfo(envelopeID, sender, to, originalRecipient, notify, ret, date, false, targetHost);
                File.WriteAllBytes(PathHelper.PathFix(text + "\\" + id + ".info"), relayMessageInfo.ToByte());
            }
        }