public override void AckConnection(MessageTrackingSource messageTrackingSource, string messageTrackingSourceContext, AckStatus status, SmtpResponse smtpResponse, AckDetails details, TimeSpan?retryInterval, bool resubmitWithoutHighAvailablityRouting, SessionSetupFailureReason failureReason) { switch (status) { case AckStatus.Pending: case AckStatus.Skip: throw new InvalidOperationException("Invalid status"); case AckStatus.Success: case AckStatus.Retry: case AckStatus.Fail: case AckStatus.Resubmit: if (this.result == null) { this.result = new SmtpMailItemResult(); } this.result.ConnectionResponse = new AckStatusAndResponse(status, smtpResponse); if (details != null) { this.result.RemoteHostName = details.RemoteHostName; } if (this.notificationHandler != null) { this.notificationHandler.AckConnection(status, smtpResponse); } SmtpMailItemNextHopConnection.EndSmtpLatencyTracking(this.mailItem.LatencyTracker); if (this.autoResetEvent != null) { this.autoResetEvent.Set(); return; } break; case AckStatus.Expand: case AckStatus.Relay: case AckStatus.SuccessNoDsn: case AckStatus.Quarantine: break; default: return; } }
public void Submit(MessageTrackingSource messageTrackingSource, MemorySubmissionItem.OnConvertedToTransportMailItemDelegate transportMailItemHandler, MbxTransportMailItem relatedMailItem) { TransportMailItem transportMailItem; if (relatedMailItem == null) { transportMailItem = TransportMailItem.NewMailItem(this.organizationId, LatencyComponent.StoreDriverSubmit, MailDirectionality.Originating, default(Guid)); } else { transportMailItem = TransportMailItem.NewSideEffectMailItem(relatedMailItem, this.organizationId, LatencyComponent.StoreDriverSubmit, MailDirectionality.Originating, relatedMailItem.ExternalOrganizationId); } base.CopyContentTo(transportMailItem); base.DecorateMessage(transportMailItem); base.ApplySecurityAttributesTo(transportMailItem); if (relatedMailItem != null) { transportMailItem.PrioritizationReason = relatedMailItem.PrioritizationReason; transportMailItem.Priority = relatedMailItem.Priority; } SubmissionItemUtils.CopySenderTo(this, transportMailItem); List <string> invalidRecipients = null; List <string> list = null; SubmissionItemUtils.CopyRecipientsTo(this, transportMailItem, null, ref invalidRecipients, ref list); ClassificationUtils.PromoteStoreClassifications(transportMailItem.RootPart.Headers); SubmissionItemUtils.PatchQuarantineSender(transportMailItem, base.QuarantineOriginalSender); bool flag = transportMailItem.Recipients.Count > 0; if (relatedMailItem != null) { MimeInternalHelpers.CopyHeaderBetweenList(relatedMailItem.RootPart.Headers, transportMailItem.RootPart.Headers, "X-MS-Exchange-Moderation-Loop"); } bool flag2 = transportMailItemHandler(transportMailItem, flag); if (flag && flag2) { MsgTrackReceiveInfo msgTrackInfo = new MsgTrackReceiveInfo(StoreDriverDelivery.LocalIPAddress, (relatedMailItem != null) ? new long?(relatedMailItem.RecordId) : null, transportMailItem.MessageTrackingSecurityInfo, invalidRecipients); MessageTrackingLog.TrackReceive(messageTrackingSource, transportMailItem, msgTrackInfo); Utils.SubmitMailItem(transportMailItem, false); } }
public override void AckMailItem(AckStatus ackStatus, SmtpResponse smtpResponse, AckDetails details, TimeSpan?retryInterval, MessageTrackingSource source, string messageTrackingSourceContext, LatencyComponent deliveryComponent, string remoteMta, bool shadowed, string primaryServer, bool reportEndToEndLatencies) { if (this.recipientsPending != 0 && ackStatus == AckStatus.Success) { throw new InvalidOperationException("Cannot ack message successfully until all pending recipients have been acked"); } if (ackStatus == AckStatus.Pending) { this.recipientsPending = this.readyRecipients.Count; this.recipientEnumerator = this.mailItem.Recipients.GetEnumerator(); this.recipientEnumeratorAck = this.mailItem.Recipients.GetEnumerator(); this.result = null; } else { if (this.result == null) { this.result = new SmtpMailItemResult(); } this.result.MessageResponse = new AckStatusAndResponse(ackStatus, smtpResponse); this.mailItemSentForProcessing = true; } if (this.notificationHandler != null) { this.notificationHandler.AckMessage(ackStatus, smtpResponse); } }
public List <MessageTrackingLogEntry> GetMessageLog(RpcReason rpcReason, ILogReader reader, TrackingLogPrefix logPrefix, ProxyAddressCollection senderAddresses, MessageTrackingSource eventSource, HashSet <MessageTrackingEvent> eventIdFilterSet, ProxyAddressCollection[] recipientAddresses, string messageId) { List <MessageTrackingLogEntry> list = new List <MessageTrackingLogEntry>(); string text = null; bool flag = false; if (senderAddresses == null && string.IsNullOrEmpty(messageId)) { throw new ArgumentException("Either senderAddresses or messageId must be specified to use log cache"); } if (!string.IsNullOrEmpty(messageId)) { text = TrackingSearch.RemoveAngleBracketsIfNeeded(messageId); } List <MessageTrackingLogEntry> messageLog; if (!string.IsNullOrEmpty(text)) { messageLog = this.GetMessageLog(rpcReason, reader, logPrefix, text); flag = true; } else { messageLog = this.GetMessageLog(rpcReason, reader, logPrefix, senderAddresses); } foreach (MessageTrackingLogEntry messageTrackingLogEntry in messageLog) { if (messageTrackingLogEntry.Source == eventSource && (eventIdFilterSet == null || eventIdFilterSet.Contains(messageTrackingLogEntry.EventId)) && (!flag || senderAddresses == null || LogCache.AtLeastOneAddressFoundInProxy(new string[] { messageTrackingLogEntry.SenderAddress }, senderAddresses)) && (recipientAddresses == null || LogCache.AtLeastOneAddressFoundInProxies(messageTrackingLogEntry.RecipientAddresses, recipientAddresses))) { list.Add(messageTrackingLogEntry); } } return(list); }