private int DeliverMailItem(MbxTransportMailItem mailItem, ulong sessionId) { int result = 0; TraceHelper.MessageProbeActivityId = mailItem.SystemProbeId; TraceHelper.StoreDriverDeliveryTracer.TracePass <string>(TraceHelper.MessageProbeActivityId, 0L, "Delivery: Processing started for MessageId {0}.", mailItem.InternetMessageId ?? "NULL"); TimeSpan?retryInterval; using (MailItemDeliver mailItemDeliver = new MailItemDeliver(mailItem, sessionId)) { try { StoreDriverDeliveryDiagnostics.HangDetector[sessionId] = mailItemDeliver; mailItemDeliver.DeliverToRecipients(); } finally { StoreDriverDeliveryDiagnostics.HangDetector.Remove(sessionId); } result = mailItemDeliver.DeliveredRecipients; retryInterval = mailItemDeliver.RetryInterval; } AckDetails ackDetails = new AckDetails(StoreDriverDelivery.localHostName); ackDetails.AddEventData("MailboxDatabaseName", mailItem.DatabaseName); mailItem.AckMailItem(AckStatus.Success, SmtpResponse.NoopOk, ackDetails, retryInterval, StoreDriverDelivery.GenerateSessionSourceContext(sessionId, mailItem.SessionStartTime)); TraceHelper.StoreDriverDeliveryTracer.TracePass <string>(TraceHelper.MessageProbeActivityId, 0L, "Delivery: Processing complete for MessageID {0}.", mailItem.InternetMessageId ?? "NULL"); return(result); }
public static IDeliveryProcessor Create(MailItemDeliver mailItemDeliver) { if (DeliveryProcessorFactory.InstanceBuilder != null) { return(DeliveryProcessorFactory.InstanceBuilder()); } bool value = mailItemDeliver.Recipient.ExtendedProperties.GetValue <bool>("Microsoft.Exchange.Transport.MailboxTransport.RetryOnDuplicateDelivery ", false); if (value) { return(new RetryAgentMessageSubmissionProcessor(mailItemDeliver)); } return(new DeliveryProcessorBase(mailItemDeliver)); }
public bool DetectHang(TimeSpan limit, out ulong sessionID, out MailItemDeliver mailItemDeliver) { bool hang = false; ulong hangSessionID = 0UL; MailItemDeliver hangMailItemDeliver = null; ExDateTime utcNow = ExDateTime.UtcNow; this.map.ForEach((MailItemDeliver perEntryMailItemDeliver) => !hang, delegate(ulong perEntrySessionID, MailItemDeliver perEntryMailItemDeliver) { if (default(ExDateTime) != perEntryMailItemDeliver.RecipientStartTime && limit < utcNow - perEntryMailItemDeliver.RecipientStartTime) { hang = true; hangSessionID = perEntrySessionID; hangMailItemDeliver = perEntryMailItemDeliver; } }); sessionID = hangSessionID; mailItemDeliver = hangMailItemDeliver; return(hang); }
internal static void UpdateDeliveryExceptionStatisticRecords(MessageStatus messageStatus, int lastOccurrencesPerException, int callstacksPerBucket, MailItemDeliver mailItemDeliver) { StoreDriverDeliveryDiagnostics.DeliveryOccurrenceRecord deliveryOccurrenceRecord = new StoreDriverDeliveryDiagnostics.DeliveryOccurrenceRecord(DateTime.UtcNow, mailItemDeliver.MbxTransportMailItem.DatabaseName, StoreDriverDelivery.MailboxServerFqdn, mailItemDeliver.MbxTransportMailItem.InternetMessageId, mailItemDeliver.Recipient.Email, mailItemDeliver.RecipientStartTime, mailItemDeliver.SessionId, mailItemDeliver.MbxTransportMailItem.MimeSize, mailItemDeliver.MbxTransportMailItem.MailItemRecipientCount, mailItemDeliver.MbxTransportMailItem.MimeSender, mailItemDeliver.MbxTransportMailItem.RoutingTimeStamp, mailItemDeliver.Stage); if (lastOccurrencesPerException > 0) { string key = StoreDriverDeliveryDiagnostics.GenerateExceptionKey(messageStatus); lock (StoreDriverDeliveryDiagnostics.deliveryExceptionStatisticRecords) { StoreDriverDeliveryDiagnostics.ExceptionStatisticRecord <StoreDriverDeliveryDiagnostics.DeliveryOccurrenceRecord> value; if (!StoreDriverDeliveryDiagnostics.deliveryExceptionStatisticRecords.TryGetValue(key, out value)) { value = default(StoreDriverDeliveryDiagnostics.ExceptionStatisticRecord <StoreDriverDeliveryDiagnostics.DeliveryOccurrenceRecord>); value.LastOccurrences = new Queue <StoreDriverDeliveryDiagnostics.DeliveryOccurrenceRecord>(lastOccurrencesPerException); } if (value.LastOccurrences.Count == lastOccurrencesPerException) { value.LastOccurrences.Dequeue(); } value.LastOccurrences.Enqueue(deliveryOccurrenceRecord); value.CountSinceServiceStart++; StoreDriverDeliveryDiagnostics.deliveryExceptionStatisticRecords[key] = value; } } StoreDriverDeliveryDiagnostics.UpdateDeliveryExceptionCallstackRecords(messageStatus, callstacksPerBucket, deliveryOccurrenceRecord); }
XElement IDiagnosable.GetDiagnosticInfo(DiagnosableParameters parameters) { bool flag = parameters.Argument.IndexOf("exceptions", StringComparison.OrdinalIgnoreCase) != -1; bool flag2 = parameters.Argument.IndexOf("callstacks", StringComparison.OrdinalIgnoreCase) != -1; bool flag3 = parameters.Argument.IndexOf("verbose", StringComparison.OrdinalIgnoreCase) != -1; bool flag4 = flag3 || parameters.Argument.IndexOf("basic", StringComparison.OrdinalIgnoreCase) != -1; bool flag5 = parameters.Argument.IndexOf("currentThreads", StringComparison.OrdinalIgnoreCase) != -1; bool flag6 = flag4 || parameters.Argument.IndexOf("config", StringComparison.OrdinalIgnoreCase) != -1; bool flag7 = !flag6 || parameters.Argument.IndexOf("help", StringComparison.OrdinalIgnoreCase) != -1; XElement xelement = new XElement(((IDiagnosable)this).GetDiagnosticComponentName()); if (flag7) { xelement.Add(new XElement("help", "Supported arguments: config, basic, verbose, exceptions, callstacks, currentThreads, help.")); } if (flag4) { xelement.Add(new XElement("deliveringThreads", StoreDriverDeliveryDiagnostics.deliveringThreads)); xelement.Add(DeliveryThrottling.Instance.DeliveryServerDiagnostics); xelement.Add(DeliveryThrottling.Instance.DeliveryDatabaseDiagnostics); xelement.Add(DeliveryThrottling.Instance.DeliveryRecipientDiagnostics); } if (flag5 && StoreDriverDeliveryDiagnostics.HangDetector != null) { xelement.Add(StoreDriverDeliveryDiagnostics.HangDetector.GetDiagnosticInfo()); } if (flag3) { XElement xelement2 = new XElement("HealthHistory"); foreach (DatabaseHealthBreadcrumb databaseHealthBreadcrumb in ((IEnumerable <DatabaseHealthBreadcrumb>)StoreDriverDeliveryDiagnostics.healthHistory)) { xelement2.Add(databaseHealthBreadcrumb.GetDiagnosticInfo()); } xelement.Add(xelement2); xelement.Add(MailItemDeliver.GetDiagnosticInfo()); string content; using (StringWriter stringWriter = new StringWriter(new StringBuilder(1024))) { MemoryTraceBuilder memoryTraceBuilder = StoreDriverDeliveryDiagnostics.TroubleshootingContext.MemoryTraceBuilder; if (memoryTraceBuilder == null) { stringWriter.Write("No traces were flushed from any thread yet, or in-memory tracing is disabled."); } else { memoryTraceBuilder.Dump(stringWriter, true, true); } content = stringWriter.ToString(); } xelement.Add(new XElement("tracing", content)); } if (flag) { StoreDriverDeliveryDiagnostics.DumpExceptionStatistics(xelement); } if (flag2) { StoreDriverDeliveryDiagnostics.DumpExceptionCallstacks(xelement); } return(xelement); }
internal StoreDriverDeliveryEventArgsImpl(MailItemDeliver mailItemDeliver) { this.mailItemDeliver = mailItemDeliver; }
public RetryAgentMessageSubmissionProcessor(MailItemDeliver mailItemDeliver) : base(mailItemDeliver) { this.useDeliveryProcessorBase = false; }
public MessageContext(Folder folder, MessageItem message, StoreSession session, ProxyAddress recipientAddress, ADRecipientCache <TransportMiniRecipient> recipientCache, long mimeSize, MailItemDeliver mailItemDeliver) : base(folder, message, session, recipientAddress, recipientCache, mimeSize, mailItemDeliver) { }
protected RuleEvaluationContext(Folder folder, MessageItem message, StoreSession session, ProxyAddress recipient, ADRecipientCache <TransportMiniRecipient> recipientCache, long mimeSize, MailItemDeliver mailItemDeliver) : base(folder, message, session, recipient, recipientCache, mimeSize, Microsoft.Exchange.Transport.MailboxRules.RuleConfig.Instance, ExTraceGlobals.MailboxRuleTracer) { MailboxSession mailboxSession = session as MailboxSession; this.initialFolder = folder; this.mailItemDeliver = mailItemDeliver; if (mailboxSession != null) { object obj = mailboxSession.Mailbox.TryGetProperty(MailboxSchema.MailboxOofState); if (obj is PropertyError) { this.IsOof = mailboxSession.IsMailboxOof(); } else { this.IsOof = (bool)obj; } } base.LimitChecker = new StoreDriverLimitChecker(this); }
public static RuleEvaluationContext Create(StoreDriverServer server, Folder folder, MessageItem message, StoreSession session, string recipientAddress, ADRecipientCache <TransportMiniRecipient> recipientCache, long mimeSize, bool processingTestMessage, bool shouldExecuteDisabledAndInErrorRules, MailItemDeliver mailItemDeliver) { return(new MessageContext(folder, message, session, new SmtpProxyAddress(recipientAddress, true), recipientCache, mimeSize, mailItemDeliver) { server = server, traceFormatter = new TraceFormatter(processingTestMessage), ShouldExecuteDisabledAndInErrorRules = shouldExecuteDisabledAndInErrorRules }); }
public DeliveryProcessorBase(MailItemDeliver mailItemDeliver) { this.mailItemDeliver = mailItemDeliver; }
internal static AccessCheckResult CheckAccessForEmailDelivery(MailItemDeliver mailItemDeliver, Folder mailPublicFolder) { if (mailItemDeliver == null) { throw new ArgumentNullException("MailItemDeliver"); } if (mailPublicFolder == null) { throw new ArgumentNullException("MailPublicFolder"); } if (mailItemDeliver.ReplayItem == null) { MailPublicFolderPermissionHandler.Diag.TraceError(0L, "ReplayItem for the message appears to be null."); return(AccessCheckResult.NotAllowedInternalSystemError); } if (mailItemDeliver.ReplayItem.From == null) { MailPublicFolderPermissionHandler.Diag.TraceError(0L, "From attribute of the ReplayItem for the given message appears to be null."); return(AccessCheckResult.NotAllowedInternalSystemError); } AccessCheckResult accessCheckResult = AccessCheckResult.NotAllowedAuthenticated; ClientSecurityContext context = null; bool isAnonymous = false; ADRecipientCache <TransportMiniRecipient> recipientCache = mailItemDeliver.MbxTransportMailItem.ADRecipientCache; IRecipientSession recipientSession = (recipientCache != null) ? recipientCache.ADSession : null; if (recipientSession != null) { recipientSession = DirectorySessionFactory.Default.GetTenantOrRootOrgRecipientSession(ConsistencyMode.IgnoreInvalid, ADSessionSettings.FromOrganizationIdWithoutRbacScopesServiceOnly(recipientSession.SessionSettings.CurrentOrganizationId), 146, "CheckAccessForEmailDelivery", "f:\\15.00.1497\\sources\\dev\\MailboxTransport\\src\\MailboxTransportDelivery\\StoreDriver\\MailPublicFolderPermissionHandler.cs"); try { GrayException.MapAndReportGrayExceptions(delegate() { Participant from = mailItemDeliver.ReplayItem.From; if (from.RoutingType != "EX") { MailPublicFolderPermissionHandler.Diag.TraceDebug(0L, "Determined the sent user as an anonymous entity"); isAnonymous = true; context = MailPublicFolderPermissionHandler.GetAnonymousClientSecurityContext(); MailPublicFolderPermissionHandler.Diag.TraceDebug(0L, "Constructed clientSecurityContext for anonymous user"); } else { MailPublicFolderPermissionHandler.Diag.TraceDebug(0L, "Determined the sent user as an authorized entity"); byte[] valueOrDefault = from.GetValueOrDefault <byte[]>(ParticipantSchema.ParticipantSID); SecurityIdentifier securityIdentifier = (valueOrDefault == null) ? null : new SecurityIdentifier(valueOrDefault, 0); TransportMiniRecipient data = recipientCache.FindAndCacheRecipient(ProxyAddress.Parse(mailItemDeliver.MbxTransportMailItem.From.ToString())).Data; if (securityIdentifier == null) { context = MailPublicFolderPermissionHandler.GetUserClientSecurityContext(MailPublicFolderPermissionHandler.EveryoneSID, null); } else if (data == null) { context = MailPublicFolderPermissionHandler.GetUserClientSecurityContext(securityIdentifier, null); } else { context = MailPublicFolderPermissionHandler.GetUserClientSecurityContext(securityIdentifier, recipientSession.GetTokenSids((ADObjectId)data[ADObjectSchema.Id], AssignmentMethod.S4U)); } MailPublicFolderPermissionHandler.Diag.TraceDebug(0L, "Constructed clientSecurityContext for user {0}.", new object[] { (data != null) ? data[ADRecipientSchema.PrimarySmtpAddress] : context.UserSid }); } if (MailPublicFolderPermissionHandler.CanPostItemsToPublicFolder(mailPublicFolder, context)) { accessCheckResult = AccessCheckResult.Allowed; return; } if (isAnonymous) { accessCheckResult = AccessCheckResult.NotAllowedAnonymous; } }); } catch (GrayException ex) { string arg = string.Empty; if (ex.InnerException != null) { arg = ex.InnerException.Message; } accessCheckResult = AccessCheckResult.NotAllowedInternalSystemError; MailPublicFolderPermissionHandler.Diag.TraceError <ClientSecurityContext, string>(0L, "Access check failed on ClientSecurityContext {0} with {1}.", context, arg); } finally { if (context != null) { context.Dispose(); context = null; } } } return(accessCheckResult); }
public DeliveryItem(MailItemDeliver context) { this.context = context; }