コード例 #1
0
        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;
            }
        }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
 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);
     }
 }
コード例 #4
0
ファイル: LogCache.cs プロジェクト: YHZX2013/exchange_diff
        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);
        }