コード例 #1
0
        private async Task <(MimeMessageWithUniqueId, LockResult)> GetOrCreateStorageMessageInFolderAsync(IMailFolder folder, string uniqueStoreName, string lockFolderName, bool unlockResource, Action <MimeMessage>?initializationCallback = null)
        {
            var messageIdHeaderValue = uniqueStoreName.EnsureContentIdFormat();

            logger.Debug("Searching storage message in folder {FolderPath} with Message-Id header value {MessageIdHeaderValue}", folder.FullName, messageIdHeaderValue);
            var lockResult = await remoteLock.AcquireLockRetry(folder, lockFolderName);

            if (!lockResult.IsSuccess)
            {
                throw new CannotLockException($"Cannot get lock for resource '{lockFolderName}'");
            }

            try
            {
                var searchResult = await folder.FindIdByMessageIdHeader(messageIdHeaderValue, false, false);

                var         uniqueId      = searchResult.Item1;
                MimeMessage?resultMessage = null;
                if (uniqueId.IsValid)
                {
                    var message = await folder.GetMessageOrDefaultAsync(uniqueId);

                    logger.Debug("Found storage message in folder {FolderPath} for Message-Id header value {MessageIdHeaderValue} with ID {ID}", folder.FullName, messageIdHeaderValue, message.Item2);
                    resultMessage = message.Item1;
                }

                if (resultMessage == null)
                {
                    Action <MimeMessage> initializationCallbackPlusSubjectInit = (message) =>
                    {
                        message.Subject = EmailBackedKeyValueStore.GetSubjectFromUniqueStoreName(uniqueStoreName);
                        initializationCallback?.Invoke(message);
                    };
                    (resultMessage, uniqueId) = await CreateEmptyStorageMessageAsync(folder, messageIdHeaderValue, initializationCallback);
                }
                return(new MimeMessageWithUniqueId()
                {
                    Message = resultMessage, UniqueId = uniqueId
                }, lockResult);
            }
            finally
            {
                if (unlockResource)
                {
                    var unlockResult = await remoteLock.ReleaseLock(folder, lockFolderName, lockResult.ResultingLockCookie);

                    if (!unlockResult)
                    {
                        logger.Warning("Could not unlock the following lock: {@LockResult}", lockResult);
                    }
                }
            }
        }