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()); } }