Showing preview only (4,526K chars total). Download the full file or copy to clipboard to get everything.
Repository: EvotecIT/Mailozaurr
Branch: v2-speedygonzales
Commit: 62ba8142485a
Files: 982
Total size: 4.1 MB
Directory structure:
gitextract_lxvxdwwn/
├── .editorconfig
├── .gitattributes
├── .github/
│ ├── FUNDING.yml
│ └── workflows/
│ ├── claude-code-review.yml
│ ├── claude.yml
│ ├── dotnet-tests.yml
│ └── powershell-tests-all.yml
├── .gitignore
├── Build/
│ ├── Artefacts/
│ │ └── ProjectBuild/
│ │ └── project.build.plan.json
│ ├── Build-Module.ps1
│ ├── Build-Project.ps1
│ ├── Refresh-DisposableDomains.ps1
│ └── project.build.json
├── CHANGELOG.MD
├── Docs/
│ ├── Configuration-and-Usage.md
│ ├── OAuthFlows.md
│ ├── PGP.md
│ └── Platform-Architecture.md
├── Examples/
│ ├── Example-AcquireGoogleTokenInteractive.ps1
│ ├── Example-AcquireO365TokenInteractive.ps1
│ ├── Example-ClearGraphJunk.ps1
│ ├── Example-ClearImapJunk.ps1
│ ├── Example-ConnecToImap-01.ps1
│ ├── Example-ConnecToImap-02.ps1
│ ├── Example-ConnecToImap-03-oAuth.ps1
│ ├── Example-ConnecToPop3-01.ps1
│ ├── Example-ConnecToPop3-02.ps1
│ ├── Example-ConnecToPop3-03-oAuth.ps1
│ ├── Example-ConnectEmailGraph-DeviceCode.ps1
│ ├── Example-ConnectEmailGraph-OnBehalfOf.ps1
│ ├── Example-ConvertFromEmlToMsg.ps1
│ ├── Example-DeleteImapMessages.ps1
│ ├── Example-DeletePop3Messages.ps1
│ ├── Example-EmailPendingMessages.ps1
│ ├── Example-ExtractLocalImagePaths.ps1
│ ├── Example-ForwardMessageAttachmentFiltered.ps1
│ ├── Example-GetEmailDeliveryMatch.ps1
│ ├── Example-GetEmailDeliveryStatus.ps1
│ ├── Example-GetGraphDmarcReport.ps1
│ ├── Example-GetGraphEvent.ps1
│ ├── Example-GetGraphMailboxStatistics-Console.ps1
│ ├── Example-GetGraphMailboxStatistics.ps1
│ ├── Example-GetImapDmarcReport.ps1
│ ├── Example-GetMailFolder.ps1
│ ├── Example-GetPop3DmarcReport.ps1
│ ├── Example-GmailApi-01-OAuth.ps1
│ ├── Example-GmailApi-02-SendMessage.ps1
│ ├── Example-GmailApi-03-SendEmailMessageProvider.ps1
│ ├── Example-GmailApi-04-ListMessages.ps1
│ ├── Example-GmailApi-05-GetMessage.ps1
│ ├── Example-GmailApi-06-SaveAttachments.ps1
│ ├── Example-GmailApi-07-DeleteMessage.ps1
│ ├── Example-GmailApi-08-FilterAndDelete.ps1
│ ├── Example-GmailApi-09-DownloadAttachments.ps1
│ ├── Example-GmailApi-10-SendWithAttachment.ps1
│ ├── Example-GmailApi-11-ListThreads.ps1
│ ├── Example-GmailApi-12-GetThread.ps1
│ ├── Example-GmailApi-13-SendWithHeaders.ps1
│ ├── Example-GmailApi-14-SearchNonDeliveryReports.ps1
│ ├── Example-GmailApi-15-GetDmarcReport.ps1
│ ├── Example-GraphMailboxPermissions.ps1
│ ├── Example-GraphManageMessages.ps1
│ ├── Example-ImapFilterScenarios.ps1
│ ├── Example-ImportMSG.ps1
│ ├── Example-ListImapFolderContents.ps1
│ ├── Example-ListImapRootFolders.ps1
│ ├── Example-ListImapRootFoldersOAuth.ps1
│ ├── Example-MoveMailFolder.ps1
│ ├── Example-NewGraphEvent.ps1
│ ├── Example-ParseGraphError.ps1
│ ├── Example-Pop3FilterScenarios.ps1
│ ├── Example-ProcessPendingMessages.ps1
│ ├── Example-QueryLanguageSearch.ps1
│ ├── Example-ReadGraphEncryption.ps1
│ ├── Example-ReadImapEncryption.ps1
│ ├── Example-ReadPop3Encryption.ps1
│ ├── Example-RemoveGmailMessage.ps1
│ ├── Example-RemoveMailFolder.ps1
│ ├── Example-RemoveMessageAttachment.ps1
│ ├── Example-RemoveMessageAttachmentFiltered.ps1
│ ├── Example-RemoveMessages-01.ps1
│ ├── Example-RemoveMessages-02.ps1
│ ├── Example-RenameMailFolder.ps1
│ ├── Example-RetrieveAndCorrelateNdr.ps1
│ ├── Example-RetryAlways.Tests.ps1
│ ├── Example-RetryAlways.cs
│ ├── Example-SaveGmailMessageAttachment.ps1
│ ├── Example-SaveImapMessageAttachment.ps1
│ ├── Example-SaveImapMessageAttachmentFiltered.ps1
│ ├── Example-SaveMimeMessage.ps1
│ ├── Example-SavePop3MessageAttachment.ps1
│ ├── Example-SavePop3MessageAttachmentFiltered.ps1
│ ├── Example-SearchAndFind.ps1
│ ├── Example-SearchMessageBody.ps1
│ ├── Example-SendEmail-01-Text.ps1
│ ├── Example-SendEmail-01.ps1
│ ├── Example-SendEmail-02.ps1
│ ├── Example-SendEmail-Attachments.ps1
│ ├── Example-SendEmail-ConnectionPool-Advanced.ps1
│ ├── Example-SendEmail-ConnectionPool.ps1
│ ├── Example-SendEmail-CramMd5.ps1
│ ├── Example-SendEmail-DeduplicateAttachments.ps1
│ ├── Example-SendEmail-GmailApiProvider.ps1
│ ├── Example-SendEmail-Graph-Headers.ps1
│ ├── Example-SendEmail-Graph-Policy.ps1
│ ├── Example-SendEmail-Graph-SmtpFallback.ps1
│ ├── Example-SendEmail-Graph.ps1
│ ├── Example-SendEmail-GraphCertificate.ps1
│ ├── Example-SendEmail-GraphDeviceCode.ps1
│ ├── Example-SendEmail-GraphWithMgRequest.ps1
│ ├── Example-SendEmail-Headers.ps1
│ ├── Example-SendEmail-Mailgun-Headers.ps1
│ ├── Example-SendEmail-Mailgun.ps1
│ ├── Example-SendEmail-OAuthGmail.ps1
│ ├── Example-SendEmail-OAuthO365.ps1
│ ├── Example-SendEmail-Pgp.ps1
│ ├── Example-SendEmail-SendGrid-Headers.ps1
│ ├── Example-SendEmail-SendGrid01.ps1
│ ├── Example-SendEmail-SendGrid02.ps1
│ ├── Example-SendEmail-SentLog.ps1
│ ├── Example-SendEmail-Ses-Headers.ps1
│ ├── Example-SendEmail-SignEncrypt.ps1
│ ├── Example-SendEmail-TemporaryMailCrypto.ps1
│ ├── Example-SendEmail-TemporaryPgp.ps1
│ ├── Example-SendEmail-TemporarySmime.ps1
│ ├── Example-SendEmail-VerifyAttachment.ps1
│ ├── Example-SendEmailPendingMessage-ScheduleAndNotify.ps1
│ ├── Example-SendEmailPendingMessage-Scheduled.ps1
│ ├── Example-SetGraphMessage.ps1
│ ├── Example-SetImapFolder.ps1
│ ├── Example-SetImapMessage.ps1
│ ├── Example-SetPop3Message.ps1
│ ├── Example-SmtpConnectionPoolMetrics.ps1
│ ├── Example-TestSmtpConnection.ps1
│ ├── Example-ValidateEmail.ps1
│ ├── Example-WaitGraphMessage.ps1
│ ├── Example-WaitImapMessage.ps1
│ ├── Example-WaitImapMessageSearchQuery.ps1
│ ├── Example-WaitPop3Message.ps1
│ ├── GraphRules/
│ │ ├── Example-GetInboxRules.ps1
│ │ ├── Example-NewInboxRule.ps1
│ │ ├── Example-RemoveInboxRule.ps1
│ │ ├── Example-RuleBuilder.ps1
│ │ └── Example-SetInboxRule.ps1
│ └── PGPKeys/
│ ├── mimekit.gpg.pub
│ └── mimekit.gpg.sec
├── LICENSE
├── Mailozaurr.AzurePipelines.yml
├── Mailozaurr.Tests.ps1
├── Mailozaurr.psd1
├── Mailozaurr.psm1
├── README.MD
├── Sources/
│ ├── Mailozaurr/
│ │ ├── AmazonSES/
│ │ │ └── SesClient.cs
│ │ ├── Attachment.cs
│ │ ├── Authentication/
│ │ │ ├── LoginState.cs
│ │ │ ├── OAuthCredentialCacheEntry.cs
│ │ │ ├── OAuthHelpers.cs
│ │ │ ├── OAuthTokenCache.cs
│ │ │ ├── SaslMechanismNtlmIntegrated.cs
│ │ │ └── TokenCacheHelper.cs
│ │ ├── Compatibility/
│ │ │ ├── IsExternalInit.cs
│ │ │ └── StringCompatibilityExtensions.cs
│ │ ├── ComposeProfileUtilities.cs
│ │ ├── Connections/
│ │ │ ├── ConnectionRetrier.cs
│ │ │ ├── ImapConnectionRequest.cs
│ │ │ ├── ImapConnector.cs
│ │ │ ├── ImapSessionService.cs
│ │ │ ├── Pop3Connector.cs
│ │ │ ├── ProtocolAuth.cs
│ │ │ └── SmtpSessionService.cs
│ │ ├── Cryptography/
│ │ │ ├── AesCredentialProtector.cs
│ │ │ ├── CredentialProtection.cs
│ │ │ ├── CredentialProtectionPaths.cs
│ │ │ ├── EphemeralOpenPgpContext.cs
│ │ │ ├── ICredentialProtector.cs
│ │ │ ├── TemporaryPgpKeyPair.cs
│ │ │ ├── TemporarySmimeCertificate.cs
│ │ │ └── WindowsCredentialProtector.cs
│ │ ├── Definitions/
│ │ │ ├── AttachmentDescriptor.cs
│ │ │ ├── MailComposeProfile.cs
│ │ │ ├── OAuthCredential.cs
│ │ │ └── ValidatedEmail.cs
│ │ ├── DmarcReports/
│ │ │ ├── DmarcReport.cs
│ │ │ ├── DmarcReportAttachment.cs
│ │ │ ├── DmarcReportServiceBase.cs
│ │ │ ├── GmailDmarcReportService.cs
│ │ │ ├── GraphDmarcReportService.cs
│ │ │ ├── ImapDmarcReportService.cs
│ │ │ └── Pop3DmarcReportService.cs
│ │ ├── EmailGraphMessage.cs
│ │ ├── Enums/
│ │ │ ├── ActionPreference.cs
│ │ │ ├── AuthenticationMechanism.cs
│ │ │ ├── DeliveryNotification.cs
│ │ │ ├── EmailAction.cs
│ │ │ ├── EmailActionEncryption.cs
│ │ │ ├── EmailEncryption.cs
│ │ │ ├── EmailProvider.cs
│ │ │ ├── GraphEndpoint.cs
│ │ │ ├── GraphImportance.cs
│ │ │ ├── GraphMailboxRole.cs
│ │ │ └── MessagePriority.cs
│ │ ├── Gmail/
│ │ │ ├── GmailApiClient.cs
│ │ │ ├── GmailApiException.cs
│ │ │ ├── GmailAttachmentInfo.cs
│ │ │ ├── GmailAuthenticationException.cs
│ │ │ ├── GmailLabel.cs
│ │ │ ├── GmailMailboxBrowser.cs
│ │ │ ├── GmailMessage.cs
│ │ │ ├── GmailThread.cs
│ │ │ └── GmailThreadInfo.cs
│ │ ├── GraphCredential.cs
│ │ ├── GraphEmailMessage.cs
│ │ ├── Helpers/
│ │ │ ├── CAPI.cs
│ │ │ ├── DictionaryExtensions.cs
│ │ │ ├── EncryptionResult.cs
│ │ │ ├── Helpers.cs
│ │ │ ├── HtmlUtils.cs
│ │ │ ├── LimitedStream.cs
│ │ │ ├── ProtectedData.cs
│ │ │ └── SecureStringHelper.cs
│ │ ├── IDmarcReportService.cs
│ │ ├── INonDeliveryReportService.cs
│ │ ├── ImapEmailMessage.cs
│ │ ├── ImapMessageInfo.cs
│ │ ├── Logging/
│ │ │ ├── InternalLogger.cs
│ │ │ ├── LogCollector.cs
│ │ │ ├── LogEntry.cs
│ │ │ ├── LogEventArgs.cs
│ │ │ ├── LogType.cs
│ │ │ ├── LoggingConfigurator.cs
│ │ │ └── LoggingMessages.cs
│ │ ├── MailboxBulkOperationResult.cs
│ │ ├── Mailgun/
│ │ │ └── Mailgun.cs
│ │ ├── Mailozaurr.csproj
│ │ ├── Mailozaurr.csproj.DotSettings
│ │ ├── MailozaurrOptions.cs
│ │ ├── MicrosoftGraph/
│ │ │ ├── Graph.cs
│ │ │ ├── GraphApiClient.cs
│ │ │ ├── GraphApiDiagnostic.cs
│ │ │ ├── GraphApiErrorDetail.cs
│ │ │ ├── GraphApiErrorHeaders.cs
│ │ │ ├── GraphApiErrorParser.cs
│ │ │ ├── GraphApiErrorResponse.cs
│ │ │ ├── GraphApiException.cs
│ │ │ ├── GraphApiInnerError.cs
│ │ │ ├── GraphApiServerInfo.cs
│ │ │ ├── GraphAttachment.cs
│ │ │ ├── GraphAttachmentItem.cs
│ │ │ ├── GraphAttachmentItemWrapper.cs
│ │ │ ├── GraphAttachmentPlaceHolder.cs
│ │ │ ├── GraphAuthorization.cs
│ │ │ ├── GraphBatchRequest.cs
│ │ │ ├── GraphBatchResult.cs
│ │ │ ├── GraphBulkOperationResult.cs
│ │ │ ├── GraphContent.cs
│ │ │ ├── GraphEmail.cs
│ │ │ ├── GraphEmailAddress.cs
│ │ │ ├── GraphErrors.cs
│ │ │ ├── GraphEvent.cs
│ │ │ ├── GraphEventAttendee.cs
│ │ │ ├── GraphEventBuilder.cs
│ │ │ ├── GraphEventTime.cs
│ │ │ ├── GraphHttpMethod.cs
│ │ │ ├── GraphInboxRule.cs
│ │ │ ├── GraphInboxRuleActions.cs
│ │ │ ├── GraphInboxRuleBuilder.cs
│ │ │ ├── GraphInboxRulePredicates.cs
│ │ │ ├── GraphInternetMessageHeader.cs
│ │ │ ├── GraphLargeAttachmentUploader.cs
│ │ │ ├── GraphMailFolder.cs
│ │ │ ├── GraphMailMessage.cs
│ │ │ ├── GraphMailMessageFlag.cs
│ │ │ ├── GraphMailboxBrowser.cs
│ │ │ ├── GraphMailboxFolderStatistics.cs
│ │ │ ├── GraphMailboxGrantee.cs
│ │ │ ├── GraphMailboxPermission.cs
│ │ │ ├── GraphMailboxPermissionBuilder.cs
│ │ │ ├── GraphMailboxStatistics.cs
│ │ │ ├── GraphMessage.cs
│ │ │ ├── GraphMessageAction.cs
│ │ │ ├── GraphMessageContainer.cs
│ │ │ ├── GraphMessageInfo.cs
│ │ │ ├── GraphMimeMessageSender.cs
│ │ │ ├── GraphMimePreparation.cs
│ │ │ ├── GraphPages.cs
│ │ │ ├── GraphRetryHelper.cs
│ │ │ ├── GraphSendPolicy.cs
│ │ │ └── GraphUploadSessionResult.cs
│ │ ├── MicrosoftGraphUtils.cs
│ │ ├── MimeKitUtils.cs
│ │ ├── MimeMessageContent.cs
│ │ ├── NativeMailboxBrowserSessions.cs
│ │ ├── NativeMailboxThreadingMetadataOperations.cs
│ │ ├── NonDeliveryReports/
│ │ │ ├── DsnDiagnosticCode.cs
│ │ │ ├── DsnStatus.cs
│ │ │ ├── DsnStatusClass.cs
│ │ │ ├── GmailNonDeliveryReportService.cs
│ │ │ ├── GraphNonDeliveryReportService.cs
│ │ │ ├── ImapNonDeliveryReportService.cs
│ │ │ ├── NonDeliveryReport.cs
│ │ │ ├── NonDeliveryReportResult.cs
│ │ │ ├── NonDeliveryReportServiceBase.cs
│ │ │ ├── NonDeliveryReportSubjectPatterns.cs
│ │ │ ├── NonDeliveryReportType.cs
│ │ │ └── Pop3NonDeliveryReportService.cs
│ │ ├── Pop3EmailMessage.cs
│ │ ├── Pop3MessageInfo.cs
│ │ ├── README.md
│ │ ├── Receive/
│ │ │ ├── FolderOperations.cs
│ │ │ ├── GraphMessageListener.cs
│ │ │ ├── ImapBulkFlagOperations.cs
│ │ │ ├── ImapClientFolderCache.cs
│ │ │ ├── ImapDeleteOperations.cs
│ │ │ ├── ImapIdleListener.cs
│ │ │ ├── ImapMailboxSearchQueryBuilder.cs
│ │ │ ├── ImapMessageReader.cs
│ │ │ ├── ImapMoveOperations.cs
│ │ │ ├── ImapRootFolderEnumerator.cs
│ │ │ ├── ImapSentFolderResolver.cs
│ │ │ ├── ImapSentMessageOperations.cs
│ │ │ ├── JunkCleaner.cs
│ │ │ ├── MailboxSearcher.cs
│ │ │ ├── MessageFetcher.cs
│ │ │ ├── MessageFlagSetter.cs
│ │ │ ├── MessageRemover.cs
│ │ │ ├── Pop3AttachmentPayloadBuilder.cs
│ │ │ ├── Pop3MailboxBrowser.cs
│ │ │ └── Pop3PollListener.cs
│ │ ├── Resources/
│ │ │ ├── allowlist.conf
│ │ │ └── disposable_email_blocklist.conf
│ │ ├── SendGrid/
│ │ │ ├── SendGridAttachment.cs
│ │ │ ├── SendGridClient.cs
│ │ │ ├── SendGridContent.cs
│ │ │ ├── SendGridEmailAddress.cs
│ │ │ ├── SendGridMessage.cs
│ │ │ └── SendGridPersonalization.cs
│ │ ├── SentMessages/
│ │ │ ├── FilePendingMessageRepository.cs
│ │ │ ├── FileSentMessageRepository.cs
│ │ │ ├── IPendingMessageProcessorObserver.cs
│ │ │ ├── IPendingMessageRepository.cs
│ │ │ ├── IPendingMessageSender.cs
│ │ │ ├── ISentMessageRepository.cs
│ │ │ ├── LogFileLineReader.cs
│ │ │ ├── NoopPendingMessageSender.cs
│ │ │ ├── PendingMessageProcessor.cs
│ │ │ ├── PendingMessageRecord.cs
│ │ │ ├── PendingMessageRepositoryOptions.cs
│ │ │ ├── PendingMessageSenderFactory.cs
│ │ │ ├── SendLogResolver.cs
│ │ │ ├── Senders/
│ │ │ │ ├── GmailPendingMessageSender.cs
│ │ │ │ ├── GraphPendingMessageSender.cs
│ │ │ │ ├── MailgunPendingMessageSender.cs
│ │ │ │ ├── SendGridPendingMessageSender.cs
│ │ │ │ ├── SesPendingMessageSender.cs
│ │ │ │ └── SmtpPendingMessageSender.cs
│ │ │ ├── SentMessageRecipients.cs
│ │ │ └── SentMessageRecord.cs
│ │ ├── Serialization/
│ │ │ ├── JsonDtos.cs
│ │ │ ├── MailozaurrJsonContext.cs
│ │ │ └── UnixTimeSecondsDateTimeOffsetConverter.cs
│ │ ├── Smtp/
│ │ │ ├── ClientSmtp.Disposal.cs
│ │ │ ├── ClientSmtp.cs
│ │ │ ├── NativeSentMailboxOperations.cs
│ │ │ ├── Smtp.cs
│ │ │ ├── SmtpAppendExecutionResult.cs
│ │ │ ├── SmtpAppendPipeline.cs
│ │ │ ├── SmtpConnectAuthenticateResult.cs
│ │ │ ├── SmtpConnectionInfo.cs
│ │ │ ├── SmtpConnectionPool.cs
│ │ │ ├── SmtpDuplicateProbeResult.cs
│ │ │ ├── SmtpResult.cs
│ │ │ ├── SmtpSecureMime.cs
│ │ │ ├── SmtpSendExecutionResult.cs
│ │ │ ├── SmtpSendPipeline.cs
│ │ │ ├── SmtpSentFolderSessionPipeline.cs
│ │ │ └── SmtpValidation.cs
│ │ └── Validator.cs
│ ├── Mailozaurr.Application/
│ │ ├── AttachmentSummary.cs
│ │ ├── CommonMessageActionsPreview.cs
│ │ ├── CommonMessageActionsPreviewRequest.cs
│ │ ├── DeleteMessagesPreview.cs
│ │ ├── DeleteMessagesPreviewRequest.cs
│ │ ├── DeleteMessagesRequest.cs
│ │ ├── DraftAttachment.cs
│ │ ├── DraftMessage.cs
│ │ ├── DraftMimeMessageFactory.cs
│ │ ├── FileMailDraftStore.cs
│ │ ├── FileMailMessageActionPlanBatchStore.cs
│ │ ├── FileMailProfileStore.cs
│ │ ├── FileMailSecretStore.cs
│ │ ├── FolderRef.cs
│ │ ├── FolderRefCompact.cs
│ │ ├── GetMessageRequest.cs
│ │ ├── GetMessagesRequest.cs
│ │ ├── GmailMailMessageActionHandler.cs
│ │ ├── GmailMailReadHandler.cs
│ │ ├── GmailMailSendHandler.cs
│ │ ├── GmailProfileBootstrapRequest.cs
│ │ ├── GmailProfileLoginRequest.cs
│ │ ├── GmailSession.cs
│ │ ├── GmailSessionFactory.cs
│ │ ├── GmailSessionRequest.cs
│ │ ├── GraphMailMessageActionHandler.cs
│ │ ├── GraphMailReadHandler.cs
│ │ ├── GraphMailSendHandler.cs
│ │ ├── GraphProfileBootstrapRequest.cs
│ │ ├── GraphProfileLoginRequest.cs
│ │ ├── GraphSession.cs
│ │ ├── GraphSessionFactory.cs
│ │ ├── GraphSessionRequest.cs
│ │ ├── IDraftMimeMessageFactory.cs
│ │ ├── IGmailSessionFactory.cs
│ │ ├── IGraphSessionFactory.cs
│ │ ├── IImapSessionFactory.cs
│ │ ├── IMailDraftExchangeService.cs
│ │ ├── IMailDraftService.cs
│ │ ├── IMailDraftStore.cs
│ │ ├── IMailFolderAliasService.cs
│ │ ├── IMailMessageActionBatchService.cs
│ │ ├── IMailMessageActionHandler.cs
│ │ ├── IMailMessageActionPlanBatchStore.cs
│ │ ├── IMailMessageActionPlanExchangeService.cs
│ │ ├── IMailMessageActionPlanRegistryService.cs
│ │ ├── IMailMessageActionPlanService.cs
│ │ ├── IMailMessageActionPreviewService.cs
│ │ ├── IMailMessageActionService.cs
│ │ ├── IMailProfileAuthService.cs
│ │ ├── IMailProfileBootstrapService.cs
│ │ ├── IMailProfileConnectionService.cs
│ │ ├── IMailProfileOverviewService.cs
│ │ ├── IMailProfileSecretService.cs
│ │ ├── IMailProfileService.cs
│ │ ├── IMailProfileStore.cs
│ │ ├── IMailQueueService.cs
│ │ ├── IMailReadHandler.cs
│ │ ├── IMailReadService.cs
│ │ ├── IMailSecretStore.cs
│ │ ├── IMailSendHandler.cs
│ │ ├── IMailSendService.cs
│ │ ├── ISmtpSessionFactory.cs
│ │ ├── ImapMailMessageActionHandler.cs
│ │ ├── ImapMailReadHandler.cs
│ │ ├── ImapSessionFactory.cs
│ │ ├── JsonMailDraftExchangeService.cs
│ │ ├── JsonMailMessageActionPlanExchangeService.cs
│ │ ├── ListAttachmentsRequest.cs
│ │ ├── MailApplication.cs
│ │ ├── MailApplicationBuilder.cs
│ │ ├── MailApplicationOptions.cs
│ │ ├── MailApplicationPaths.cs
│ │ ├── MailCapability.cs
│ │ ├── MailCapabilityCatalog.cs
│ │ ├── MailDraft.cs
│ │ ├── MailDraftCompact.cs
│ │ ├── MailDraftService.cs
│ │ ├── MailDraftStoreOptions.cs
│ │ ├── MailFolderAliasService.cs
│ │ ├── MailFolderAliasSummary.cs
│ │ ├── MailFolderAliases.cs
│ │ ├── MailFolderQuery.cs
│ │ ├── MailFolderTargetResolution.cs
│ │ ├── MailMessageActionBatchService.cs
│ │ ├── MailMessageActionPlanBatch.cs
│ │ ├── MailMessageActionPlanBatchCompact.cs
│ │ ├── MailMessageActionPlanBatchQuery.cs
│ │ ├── MailMessageActionPlanBatchSortBy.cs
│ │ ├── MailMessageActionPlanBatchStoreOptions.cs
│ │ ├── MailMessageActionPlanBatchSummary.cs
│ │ ├── MailMessageActionPlanBatchTransformPreview.cs
│ │ ├── MailMessageActionPlanRegistryService.cs
│ │ ├── MailMessageActionPlanService.cs
│ │ ├── MailMessageActionPreviewService.cs
│ │ ├── MailProfile.cs
│ │ ├── MailProfileAuthDefaults.cs
│ │ ├── MailProfileAuthFlowNames.cs
│ │ ├── MailProfileAuthService.cs
│ │ ├── MailProfileAuthStatus.cs
│ │ ├── MailProfileAuthenticationResult.cs
│ │ ├── MailProfileBootstrapService.cs
│ │ ├── MailProfileConnectionService.cs
│ │ ├── MailProfileConnectionTestResult.cs
│ │ ├── MailProfileConnectionTestScope.cs
│ │ ├── MailProfileKind.cs
│ │ ├── MailProfileKindParser.cs
│ │ ├── MailProfileOverview.cs
│ │ ├── MailProfileOverviewCompact.cs
│ │ ├── MailProfileOverviewQuery.cs
│ │ ├── MailProfileOverviewService.cs
│ │ ├── MailProfileOverviewSortBy.cs
│ │ ├── MailProfileSecretService.cs
│ │ ├── MailProfileService.cs
│ │ ├── MailProfileSettingsKeys.cs
│ │ ├── MailProfileStoreOptions.cs
│ │ ├── MailProfileValidationResult.cs
│ │ ├── MailProfileValidator.cs
│ │ ├── MailSearchRequest.cs
│ │ ├── MailSecretNames.cs
│ │ ├── MailSecretReferenceResolver.cs
│ │ ├── MailSecretStoreOptions.cs
│ │ ├── MailboxRef.cs
│ │ ├── Mailozaurr.Application.csproj
│ │ ├── MessageActionBatchExecutionItemResult.cs
│ │ ├── MessageActionBatchExecutionResult.cs
│ │ ├── MessageActionConfirmationTokens.cs
│ │ ├── MessageActionExecutionPlan.cs
│ │ ├── MessageActionExecutionPlanRequest.cs
│ │ ├── MessageActionItemResult.cs
│ │ ├── MessageActionPlanBatchTransformPreviewItem.cs
│ │ ├── MessageActionPlanBatchTransformRequest.cs
│ │ ├── MessageActionPreviewItem.cs
│ │ ├── MessageActionResult.cs
│ │ ├── MessageDetail.cs
│ │ ├── MessageDetailCompact.cs
│ │ ├── MessageRecipient.cs
│ │ ├── MessageStateChangePreview.cs
│ │ ├── MessageSummary.cs
│ │ ├── MessageSummaryCompact.cs
│ │ ├── MimeAttachmentStorage.cs
│ │ ├── MoveMessagesPreview.cs
│ │ ├── MoveMessagesPreviewRequest.cs
│ │ ├── MoveMessagesRequest.cs
│ │ ├── OperationResult.cs
│ │ ├── PendingMailQueueService.cs
│ │ ├── ProfileCapabilities.cs
│ │ ├── QueueProcessResult.cs
│ │ ├── QueuedMessageCompact.cs
│ │ ├── QueuedMessageSummary.cs
│ │ ├── RoutedMailMessageActionService.cs
│ │ ├── RoutedMailReadService.cs
│ │ ├── RoutedMailSendService.cs
│ │ ├── SaveAttachmentRequest.cs
│ │ ├── SaveAttachmentsManyRequest.cs
│ │ ├── SaveAttachmentsManyResult.cs
│ │ ├── SaveAttachmentsRequest.cs
│ │ ├── SaveAttachmentsResult.cs
│ │ ├── SavedAttachmentResult.cs
│ │ ├── SendMessageRequest.cs
│ │ ├── SendResult.cs
│ │ ├── SetFlaggedStateRequest.cs
│ │ ├── SetReadStateRequest.cs
│ │ ├── SmtpMailSendHandler.cs
│ │ ├── SmtpSessionFactory.cs
│ │ ├── StandardMessageActionsPreview.cs
│ │ └── StandardMessageActionsPreviewRequest.cs
│ ├── Mailozaurr.Cli/
│ │ ├── CliArguments.cs
│ │ ├── CliRunner.cs
│ │ ├── Mailozaurr.Cli.csproj
│ │ ├── Mcp/
│ │ │ ├── MailMcpTools.cs
│ │ │ └── McpServerHost.cs
│ │ └── Program.cs
│ ├── Mailozaurr.Examples/
│ │ ├── AcquireGoogleTokenInteractive.cs
│ │ ├── AcquireO365TokenDeviceCode.cs
│ │ ├── AcquireO365TokenInteractive.cs
│ │ ├── BuildGraphUriExample.cs
│ │ ├── DetectNonDeliveryReportExample.cs
│ │ ├── FetchGmailMessages.cs
│ │ ├── FetchImapMessages.cs
│ │ ├── FetchPopMessages.cs
│ │ ├── GenerateTemporaryMailCrypto.cs
│ │ ├── GenerateTemporaryPgpKeyPair.cs
│ │ ├── GenerateTemporarySmimeCertificate.cs
│ │ ├── ImapIdleListenerExample.cs
│ │ ├── ImapIdleListenerFilteredExample.cs
│ │ ├── Mailozaurr.Examples.csproj
│ │ ├── NonDeliveryReportServiceExample.cs
│ │ ├── ParseNonDeliveryReportExample.cs
│ │ ├── PendingMessageRepositoryExample.cs
│ │ ├── Program.cs
│ │ ├── RetrieveAndCorrelateNonDeliveryReportsExample.cs
│ │ ├── RetrieveDmarcReportsExample.cs
│ │ ├── SearchBodyContainsExample.cs
│ │ ├── SearchNonDeliveryReportsExample.cs
│ │ ├── SendEmailAttachments.cs
│ │ ├── SendEmailGmail.cs
│ │ ├── SendEmailGmailApi.cs
│ │ ├── SendEmailGraphCertificate.cs
│ │ ├── SendEmailGraphClientSecret.cs
│ │ ├── SendEmailGraphWithPolicy.cs
│ │ ├── SendEmailHeadersGraph.cs
│ │ ├── SendEmailHeadersSendGrid.cs
│ │ ├── SendEmailHeadersSmtp.cs
│ │ ├── SendEmailMailgun.cs
│ │ ├── SendEmailPgp.cs
│ │ ├── SendEmailRemoteImages.cs
│ │ ├── SendEmailSasl.cs
│ │ ├── SendEmailSmtpAsync.cs
│ │ ├── SendEmailVerifyAttachments.cs
│ │ ├── SendTemplatedEmailSes.cs
│ │ ├── SmtpPendingMessageExample.cs
│ │ └── SmtpProcessPendingMessagesExample.cs
│ ├── Mailozaurr.Msg/
│ │ ├── Definitions/
│ │ │ ├── EmlConversionResult.cs
│ │ │ └── MsgConversionResult.cs
│ │ ├── EmailMessage.cs
│ │ ├── MailFileModels.cs
│ │ ├── MailFileReader.cs
│ │ ├── MailFileReaderOptions.cs
│ │ └── Mailozaurr.Msg.csproj
│ ├── Mailozaurr.PowerShell/
│ │ ├── CmdletAddGraphMailboxPermission.cs
│ │ ├── CmdletClearGraphJunk.cs
│ │ ├── CmdletClearIMAPJunk.cs
│ │ ├── CmdletClearSmtpConnectionPool.cs
│ │ ├── CmdletConnectEmailGraph.cs
│ │ ├── CmdletConnectIMAP.cs
│ │ ├── CmdletConnectOAuthGoogle.cs
│ │ ├── CmdletConnectOAuthO365.cs
│ │ ├── CmdletConnectPOP3.cs
│ │ ├── CmdletConvertFromEmlToMsg.cs
│ │ ├── CmdletConvertFromMsgToEml.cs
│ │ ├── CmdletConvertFromOAuth2Credential.cs
│ │ ├── CmdletConvertToGraphCertificateCredential.cs
│ │ ├── CmdletConvertToGraphCredential.cs
│ │ ├── CmdletConvertToMailgunCredential.cs
│ │ ├── CmdletConvertToOAuth2Credential.cs
│ │ ├── CmdletConvertToSendGridCredential.cs
│ │ ├── CmdletDisconnectEmailGraph.cs
│ │ ├── CmdletDisconnectIMAP.cs
│ │ ├── CmdletDisconnectPOP3.cs
│ │ ├── CmdletGetDmarcReport.cs
│ │ ├── CmdletGetEmailDeliveryMatch.cs
│ │ ├── CmdletGetEmailDeliveryStatus.cs
│ │ ├── CmdletGetEmailGraphFolder.cs
│ │ ├── CmdletGetEmailGraphMessage.cs
│ │ ├── CmdletGetEmailGraphMessageAttachment.cs
│ │ ├── CmdletGetEmailGraphMessageMime.cs
│ │ ├── CmdletGetEmailPendingMessage.cs
│ │ ├── CmdletGetGmailMessage.cs
│ │ ├── CmdletGetGmailThread.cs
│ │ ├── CmdletGetGraphEvent.cs
│ │ ├── CmdletGetGraphInboxRule.cs
│ │ ├── CmdletGetGraphMailboxPermission.cs
│ │ ├── CmdletGetGraphMailboxStatistics.cs
│ │ ├── CmdletGetIMAPFolder.cs
│ │ ├── CmdletGetIMAPMessage.cs
│ │ ├── CmdletGetMimeMessageContent.cs
│ │ ├── CmdletGetPOP3Message.cs
│ │ ├── CmdletGetSmtpConnectionPool.cs
│ │ ├── CmdletImportMailFile.cs
│ │ ├── CmdletMoveGraphFolder.cs
│ │ ├── CmdletMoveGraphMessage.cs
│ │ ├── CmdletMoveIMAPFolder.cs
│ │ ├── CmdletMoveIMAPMessage.cs
│ │ ├── CmdletNewGraphEvent.cs
│ │ ├── CmdletNewGraphEventBuilder.cs
│ │ ├── CmdletNewGraphInboxRule.cs
│ │ ├── CmdletNewGraphInboxRuleBuilder.cs
│ │ ├── CmdletNewGraphInboxRuleObject.cs
│ │ ├── CmdletNewGraphMailboxPermissionBuilder.cs
│ │ ├── CmdletNewGraphMailboxPermissionObject.cs
│ │ ├── CmdletNewTemporaryMailCrypto.cs
│ │ ├── CmdletRemoveEmailPendingMessage.cs
│ │ ├── CmdletRemoveGmailMessage.cs
│ │ ├── CmdletRemoveGraphEvent.cs
│ │ ├── CmdletRemoveGraphFolder.cs
│ │ ├── CmdletRemoveGraphInboxRule.cs
│ │ ├── CmdletRemoveGraphMailboxPermission.cs
│ │ ├── CmdletRemoveGraphMessage.cs
│ │ ├── CmdletRemoveGraphMessageAttachment.cs
│ │ ├── CmdletRemoveIMAPFolder.cs
│ │ ├── CmdletRemoveIMAPMessage.cs
│ │ ├── CmdletRemoveIMAPMessageAttachment.cs
│ │ ├── CmdletRemovePOP3Message.cs
│ │ ├── CmdletRemovePOP3MessageAttachment.cs
│ │ ├── CmdletRenameGraphFolder.cs
│ │ ├── CmdletRenameIMAPFolder.cs
│ │ ├── CmdletSaveGmailMessageAttachment.cs
│ │ ├── CmdletSaveGraphMessage.cs
│ │ ├── CmdletSaveGraphMessageAttachment.cs
│ │ ├── CmdletSaveIMAPMessage.cs
│ │ ├── CmdletSaveIMAPMessageAttachment.cs
│ │ ├── CmdletSaveMimeMessage.cs
│ │ ├── CmdletSavePOP3Message.cs
│ │ ├── CmdletSavePOP3MessageAttachment.cs
│ │ ├── CmdletSearchGraphMailbox.cs
│ │ ├── CmdletSearchIMAPMailbox.cs
│ │ ├── CmdletSearchPOP3Mailbox.cs
│ │ ├── CmdletSendEmailMessage.Parameters.cs
│ │ ├── CmdletSendEmailMessage.Process.cs
│ │ ├── CmdletSendEmailMessage.cs
│ │ ├── CmdletSendEmailPendingMessage.cs
│ │ ├── CmdletSendGmailMessage.cs
│ │ ├── CmdletSetGraphEvent.cs
│ │ ├── CmdletSetGraphInboxRule.cs
│ │ ├── CmdletSetGraphMessage.cs
│ │ ├── CmdletSetIMAPFolder.cs
│ │ ├── CmdletSetIMAPMessage.cs
│ │ ├── CmdletSetPOP3Message.cs
│ │ ├── CmdletTestEmailAddress.cs
│ │ ├── CmdletTestMimeMessageSignature.cs
│ │ ├── CmdletTestSmtpConnection.cs
│ │ ├── CmdletUnprotectMimeMessage.cs
│ │ ├── CmdletWaitGraphMessage.cs
│ │ ├── CmdletWaitIMAPMessage.cs
│ │ ├── CmdletWaitPOP3Message.cs
│ │ ├── CmdletWatchSmtpConnectionPool.cs
│ │ ├── Communication/
│ │ │ ├── AsyncPSCmdlet.cs
│ │ │ ├── InternalLoggerPowerShell.cs
│ │ │ └── LogEmitter.cs
│ │ ├── CredentialHelpers.cs
│ │ ├── Definitions/
│ │ │ ├── ConnectionInfoBase.cs
│ │ │ ├── DefaultSessions.cs
│ │ │ ├── EmailProtocol.cs
│ │ │ ├── EmlConversionResult.cs
│ │ │ ├── GraphConnectionInfo.cs
│ │ │ ├── ImapConnectionInfo.cs
│ │ │ ├── MsgConversionResult.cs
│ │ │ └── PopConnectionInfo.cs
│ │ ├── Mailozaurr.PowerShell.csproj
│ │ ├── Mailozaurr.PowerShell.csproj.DotSettings
│ │ └── OnImportAndRemove.cs
│ ├── Mailozaurr.Tests/
│ │ ├── AdditionalCoverageTests.cs
│ │ ├── ApplicationBuilderTests.cs
│ │ ├── ApplicationCapabilitiesTests.cs
│ │ ├── ApplicationDraftServiceTests.cs
│ │ ├── ApplicationDraftStoreTests.cs
│ │ ├── ApplicationFolderAliasServiceTests.cs
│ │ ├── ApplicationGmailMailReadHandlerTests.cs
│ │ ├── ApplicationGmailMailSendHandlerTests.cs
│ │ ├── ApplicationGmailSessionFactoryTests.cs
│ │ ├── ApplicationGraphMailReadHandlerTests.cs
│ │ ├── ApplicationGraphMailSendHandlerTests.cs
│ │ ├── ApplicationGraphSessionFactoryTests.cs
│ │ ├── ApplicationImapMailReadHandlerTests.cs
│ │ ├── ApplicationImapSessionFactoryTests.cs
│ │ ├── ApplicationMessageActionBatchServiceTests.cs
│ │ ├── ApplicationMessageActionConfirmationTokensTests.cs
│ │ ├── ApplicationMessageActionPlanBatchStoreTests.cs
│ │ ├── ApplicationMessageActionPlanRegistryServiceTests.cs
│ │ ├── ApplicationMessageActionPlanServiceTests.cs
│ │ ├── ApplicationMessageActionPreviewServiceTests.cs
│ │ ├── ApplicationProfileAuthServiceTests.cs
│ │ ├── ApplicationProfileBootstrapServiceTests.cs
│ │ ├── ApplicationProfileConnectionServiceTests.cs
│ │ ├── ApplicationProfileOverviewServiceTests.cs
│ │ ├── ApplicationProfileSecretServiceTests.cs
│ │ ├── ApplicationProfileServiceTests.cs
│ │ ├── ApplicationProfileStoreTests.cs
│ │ ├── ApplicationQueueServiceTests.cs
│ │ ├── ApplicationRoutingServicesTests.cs
│ │ ├── ApplicationSecretStoreTests.cs
│ │ ├── ApplicationSmtpMailSendHandlerTests.cs
│ │ ├── ApplicationSmtpSessionFactoryTests.cs
│ │ ├── CliRunnerTests.cs
│ │ ├── ClientSmtpDisposeTests.cs
│ │ ├── ClientSmtpTests.cs
│ │ ├── CmdletImportMailFileTests.cs
│ │ ├── CmdletWaitImapMessageTests.cs
│ │ ├── ComposeProfileUtilitiesTests.cs
│ │ ├── ConnectorTests.cs
│ │ ├── ConvertFromGraphCredentialTests.cs
│ │ ├── CredentialHelpersTests.cs
│ │ ├── Cryptography/
│ │ │ ├── AesCredentialProtectorTests.cs
│ │ │ └── CredentialProtectionTests.cs
│ │ ├── DraftMimeMessageFactoryTests.cs
│ │ ├── EmailMessageConversionTests.cs
│ │ ├── EphemeralOpenPgpContextTests.cs
│ │ ├── FetchExamplesTests.cs
│ │ ├── FilePendingMessageRepositoryTests.cs
│ │ ├── FolderOperationsTests.cs
│ │ ├── GmailApiClientTests.cs
│ │ ├── GmailMailboxBrowserTests.cs
│ │ ├── GmailNonDeliveryReportsTests.cs
│ │ ├── GraphApiClientMailboxTests.cs
│ │ ├── GraphApiClientTests.cs
│ │ ├── GraphApiErrorParserTests.cs
│ │ ├── GraphAuthenticateTests.cs
│ │ ├── GraphBatchAndRetryTests.cs
│ │ ├── GraphChunkSizeLimitTests.cs
│ │ ├── GraphCreateMessageTests.cs
│ │ ├── GraphDraftTests.cs
│ │ ├── GraphEventBuilderTests.cs
│ │ ├── GraphExceptionStackTraceTests.cs
│ │ ├── GraphInboxRulesTests.cs
│ │ ├── GraphMailboxBrowserTests.cs
│ │ ├── GraphMailboxPermissionBuilderTests.cs
│ │ ├── GraphMailboxPermissionTests.cs
│ │ ├── GraphMessageListenerTests.cs
│ │ ├── GraphSearchMailboxesTests.cs
│ │ ├── GraphStopwatchTests.cs
│ │ ├── GraphTestCollection.cs
│ │ ├── GraphUploadRangeTests.cs
│ │ ├── GraphUploadSessionParsingTests.cs
│ │ ├── HelpersTests.cs
│ │ ├── HtmlAutoEmbedImageTests.cs
│ │ ├── HtmlUtilsTests.cs
│ │ ├── ImapBulkFlagOperationsTests.cs
│ │ ├── ImapConnectionRequestTests.cs
│ │ ├── ImapDeleteOperationsTests.cs
│ │ ├── ImapFetchTests.cs
│ │ ├── ImapIdleListenerTests.cs
│ │ ├── ImapMailboxSearchQueryBuilderTests.cs
│ │ ├── ImapMessageReaderTests.cs
│ │ ├── ImapMoveOperationsTests.cs
│ │ ├── ImapSentFolderResolverTests.cs
│ │ ├── ImapSentMessageOperationsTests.cs
│ │ ├── ImapSessionServiceTests.cs
│ │ ├── InternalLoggerTests.cs
│ │ ├── IsDisposableEmailTests.cs
│ │ ├── JsonMailDraftExchangeServiceTests.cs
│ │ ├── JsonMailMessageActionPlanExchangeServiceTests.cs
│ │ ├── JunkCleanerTests.cs
│ │ ├── LoggingConfiguratorDisposeTests.cs
│ │ ├── LoggingConfiguratorTests.cs
│ │ ├── LoggingConfiguratorValidationTests.cs
│ │ ├── LoggingMessagesTests.cs
│ │ ├── MailFileReaderTests.cs
│ │ ├── MailMcpToolsTests.cs
│ │ ├── MailboxSearcherBodyTests.cs
│ │ ├── MailgunClientTests.cs
│ │ ├── Mailozaurr.Tests.csproj
│ │ ├── MessageFlaggerTests.cs
│ │ ├── MessageInfoTests.cs
│ │ ├── MicrosoftGraphUtilsCertificateTokenCachingTests.cs
│ │ ├── MicrosoftGraphUtilsJunkMailTests.cs
│ │ ├── MicrosoftGraphUtilsNullResponseTests.cs
│ │ ├── MicrosoftGraphUtilsPagingTests.cs
│ │ ├── MicrosoftGraphUtilsTests.cs
│ │ ├── MimeKitNonDeliveryReportTests.cs
│ │ ├── NativeMailboxBrowserSessionsTests.cs
│ │ ├── NativeMailboxThreadingMetadataOperationsTests.cs
│ │ ├── NativeSentMailboxOperationsTests.cs
│ │ ├── NonDeliveryReportDetectionTests.cs
│ │ ├── NonDeliveryReportServiceTests.cs
│ │ ├── NonDeliveryReportTests.cs
│ │ ├── OAuthCacheTestHelper.cs
│ │ ├── OAuthHelpersCachedTokenTests.cs
│ │ ├── OAuthHelpersGoogleCachedTokenTests.cs
│ │ ├── OAuthTokenCacheProtectionTests.cs
│ │ ├── Pop3AttachmentPayloadBuilderTests.cs
│ │ ├── Pop3ConnectionTests.cs
│ │ ├── Pop3MailboxBrowserTests.cs
│ │ ├── Pop3PollListenerTests.cs
│ │ ├── ProtocolAuthTests.cs
│ │ ├── QueryLanguageParserTests.cs
│ │ ├── RecordingHandler.cs
│ │ ├── RetryAlwaysTests.cs
│ │ ├── SearchDmarcReportsTests.cs
│ │ ├── SearchNonDeliveryReportsTests.cs
│ │ ├── SecureStringHelperAsyncTests.cs
│ │ ├── SendEmailBasicTests.cs
│ │ ├── SendGridAttachmentTests.cs
│ │ ├── SendGridClientDisposeTests.cs
│ │ ├── SendGridConvertToEmailObjectTests.cs
│ │ ├── SendGridCreateMessageTests.cs
│ │ ├── SendLogResolverTests.cs
│ │ ├── SentMessageRepositoryTests.cs
│ │ ├── SentMessages/
│ │ │ ├── GmailPendingMessageSenderTests.cs
│ │ │ ├── GraphPendingMessageSenderTests.cs
│ │ │ ├── MailgunPendingMessageSenderTests.cs
│ │ │ ├── PendingMessageProcessorFileRepositoryTests.cs
│ │ │ ├── PendingMessageProcessorTests.cs
│ │ │ ├── PendingMessageRecordSerializationTests.cs
│ │ │ ├── PendingMessageSenderFactoryTests.cs
│ │ │ ├── ProviderPendingMessageTests.cs
│ │ │ ├── SendGridPendingMessageSenderTests.cs
│ │ │ ├── SesPendingMessageSenderTests.cs
│ │ │ ├── SmtpPendingMessageEncryptionTests.cs
│ │ │ ├── SmtpPendingMessageProcessorIntegrationTests.cs
│ │ │ └── SmtpPendingMessageSenderTests.cs
│ │ ├── SerializationContextTests.cs
│ │ ├── SesClientSendEmailAsyncTests.cs
│ │ ├── SesClientSendTemplatedEmailAsyncTests.cs
│ │ ├── SesClientTests.cs
│ │ ├── SmtpAsyncWrappersTests.cs
│ │ ├── SmtpAttachmentTests.cs
│ │ ├── SmtpAuthenticationMechanismTests.cs
│ │ ├── SmtpConcurrencyTests.cs
│ │ ├── SmtpConnectionPoolConcurrencyTests.cs
│ │ ├── SmtpConnectionPoolMetricsTests.cs
│ │ ├── SmtpConnectionPoolTests.cs
│ │ ├── SmtpHeadersTests.cs
│ │ ├── SmtpInlineAttachmentTests.cs
│ │ ├── SmtpPendingMessageTests.cs
│ │ ├── SmtpSendAsyncTests.cs
│ │ ├── SmtpSendPipelineTests.cs
│ │ ├── SmtpSentFolderSessionPipelineTests.cs
│ │ ├── SmtpSessionServiceTests.cs
│ │ ├── SmtpSignTests.cs
│ │ ├── SmtpSslOptionTests.cs
│ │ ├── SmtpValidationTests.cs
│ │ ├── TemporaryPgpKeyPairTests.cs
│ │ ├── TemporarySmimeCertificateTests.cs
│ │ ├── TestParallelization.cs
│ │ ├── TokenCacheHelperTests.cs
│ │ └── ValidatorTests.cs
│ ├── Mailozaurr.sln
│ └── Mailozaurr.sln.DotSettings
├── Tests/
│ ├── Add-GraphMailboxPermission.Tests.ps1
│ ├── Clear-GraphJunk.Tests.ps1
│ ├── Clear-IMAPJunk.Tests.ps1
│ ├── Clear-SmtpConnectionPool.Tests.ps1
│ ├── Connect-EmailGraph.Tests.ps1
│ ├── Connect-OAuthGoogle.Tests.ps1
│ ├── Connect-OAuthO365.Tests.ps1
│ ├── Connect-POP3.Tests.ps1
│ ├── ConvertFromGraphCredential.Tests.ps1
│ ├── ConvertTo-GraphCertificateCredential.Tests.ps1
│ ├── ConvertTo-GraphCredential.Tests.ps1
│ ├── ConvertTo-MailgunCredential.Tests.ps1
│ ├── ConvertTo-OAuth2Credential.Tests.ps1
│ ├── ConvertTo-SendGridCredential.Tests.ps1
│ ├── Get-DmarcReport.Tests.ps1
│ ├── Get-EmailDeliveryMatch.Tests.ps1
│ ├── Get-EmailDeliveryStatus.Tests.ps1
│ ├── Get-EmailPendingMessage.Tests.ps1
│ ├── Get-GmailMessage.Tests.ps1
│ ├── Get-GmailThread.Tests.ps1
│ ├── Get-GraphEvent.Tests.ps1
│ ├── Get-GraphInboxRule.Tests.ps1
│ ├── Get-GraphMailboxPermission.Tests.ps1
│ ├── Get-GraphMailboxStatistics.Tests.ps1
│ ├── Get-IMAPFolderRoot.Tests.ps1
│ ├── Get-IMAPMessage.Tests.ps1
│ ├── Get-IMAPMessage.WhatIf.Tests.ps1
│ ├── Get-MimeMessageContent.Tests.ps1
│ ├── Get-POP3Message.Tests.ps1
│ ├── Get-SmtpConnectionPool.Tests.ps1
│ ├── GraphApiErrorParser.Tests.ps1
│ ├── GraphSendPolicy.Tests.ps1
│ ├── GraphUploadSessionResult.Tests.ps1
│ ├── Import-Module.Tests.ps1
│ ├── Mailozaurr.Pester/
│ │ └── Send-EmailPendingMessage.Filters.Tests.ps1
│ ├── MaxConcurrentRequests.Tests.ps1
│ ├── MessageEncryption.Tests.ps1
│ ├── MessageTypes.Tests.ps1
│ ├── Move-GraphMessage.Tests.ps1
│ ├── Move-IMAPMessage.Tests.ps1
│ ├── New-GraphEvent.Tests.ps1
│ ├── New-GraphInboxRule.Tests.ps1
│ ├── New-GraphInboxRuleObjectBuilder.Tests.ps1
│ ├── New-GraphMailboxPermissionObjectBuilder.Tests.ps1
│ ├── New-TemporaryMailCrypto.Tests.ps1
│ ├── Pop3Connector.Dispose.Tests.ps1
│ ├── Remove-EmailPendingMessage.Tests.ps1
│ ├── Remove-GmailMessage.Tests.ps1
│ ├── Remove-GraphEvent.Tests.ps1
│ ├── Remove-GraphInboxRule.Tests.ps1
│ ├── Remove-GraphMailboxPermission.Tests.ps1
│ ├── Remove-GraphMessage.Tests.ps1
│ ├── Remove-GraphMessageAttachment.Tests.ps1
│ ├── Remove-IMAPMessage.Tests.ps1
│ ├── Remove-IMAPMessageAttachment.Tests.ps1
│ ├── Remove-POP3Message.Tests.ps1
│ ├── Remove-POP3MessageAttachment.Tests.ps1
│ ├── Save-GmailMessageAttachment.Tests.ps1
│ ├── Save-IMAPMessage.Tests.ps1
│ ├── Save-MimeMessage.Tests.ps1
│ ├── Save-POP3Message.Tests.ps1
│ ├── Search-IMAPMailbox.Tests.ps1
│ ├── Search-POP3Mailbox.Tests.ps1
│ ├── Send-EmailMessage.AsyncLogging.Tests.ps1
│ ├── Send-EmailMessage.Attachments.Tests.ps1
│ ├── Send-EmailMessage.GmailProvider.Tests.ps1
│ ├── Send-EmailMessage.GraphLimit.Tests.ps1
│ ├── Send-EmailMessage.Headers.Tests.ps1
│ ├── Send-EmailMessage.LoggerScope.Tests.ps1
│ ├── Send-EmailMessage.Pgp.Tests.ps1
│ ├── Send-EmailMessage.SentLogPath.Tests.ps1
│ ├── Send-EmailMessage.SkipAuth.Tests.ps1
│ ├── Send-EmailMessage.Tests.ps1
│ ├── Send-EmailMessage.WildcardAttachment.Tests.ps1
│ ├── Send-EmailMessageConnectionPool.Tests.ps1
│ ├── Send-EmailPendingMessage.Tests.ps1
│ ├── Send-GmailMessage.Tests.ps1
│ ├── SendLogResolver.Tests.ps1
│ ├── Set-GraphEvent.Tests.ps1
│ ├── Set-GraphInboxRule.Tests.ps1
│ ├── Test-MimeMessageSignature.Tests.ps1
│ ├── Test-SmtpConnection.Tests.ps1
│ ├── Unprotect-MimeMessage.Tests.ps1
│ ├── Wait-GraphMessage.Tests.ps1
│ ├── Wait-IMAPMessage.Tests.ps1
│ ├── Wait-POP3Message.Tests.ps1
│ └── Watch-SmtpConnectionPool.Tests.ps1
├── Website/
│ ├── README.md
│ └── content/
│ ├── examples/
│ │ ├── _index.md
│ │ ├── test-smtp-connection-before-sending.md
│ │ └── validate-email-addresses.md
│ └── project-docs/
│ └── docs/
│ ├── _index.md
│ ├── install.md
│ ├── overview.md
│ └── toc.yml
└── codecov.yml
================================================
FILE CONTENTS
================================================
================================================
FILE: .editorconfig
================================================
# Remove the line below if you want to inherit .editorconfig settings from higher directories
root = true
# Default settings for all files
[*]
end_of_line = lf
# C# files
[*.cs]
#### Core EditorConfig Options ####
# Indentation and spacing
indent_size = 4
indent_style = space
tab_width = 4
# New line preferences
end_of_line = lf
insert_final_newline = false
#### .NET Code Actions ####
# Type members
dotnet_hide_advanced_members = false
dotnet_member_insertion_location = with_other_members_of_the_same_kind
dotnet_property_generation_behavior = prefer_throwing_properties
# Symbol search
dotnet_search_reference_assemblies = true
#### .NET Coding Conventions ####
# Organize usings
dotnet_separate_import_directive_groups = false
dotnet_sort_system_directives_first = false
file_header_template = unset
# this. and Me. preferences
dotnet_style_qualification_for_event = false
dotnet_style_qualification_for_field = false
dotnet_style_qualification_for_method = false
dotnet_style_qualification_for_property = false
# Language keywords vs BCL types preferences
dotnet_style_predefined_type_for_locals_parameters_members = true
dotnet_style_predefined_type_for_member_access = true
# Parentheses preferences
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity
dotnet_style_parentheses_in_other_operators = never_if_unnecessary
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity
# Modifier preferences
dotnet_style_require_accessibility_modifiers = for_non_interface_members
# Expression-level preferences
dotnet_prefer_system_hash_code = true
dotnet_style_coalesce_expression = true
dotnet_style_collection_initializer = true
dotnet_style_explicit_tuple_names = true
dotnet_style_namespace_match_folder = true
dotnet_style_null_propagation = true
dotnet_style_object_initializer = true
dotnet_style_operator_placement_when_wrapping = beginning_of_line
dotnet_style_prefer_auto_properties = true
dotnet_style_prefer_collection_expression = when_types_loosely_match
dotnet_style_prefer_compound_assignment = true
dotnet_style_prefer_conditional_expression_over_assignment = true
dotnet_style_prefer_conditional_expression_over_return = true
dotnet_style_prefer_foreach_explicit_cast_in_source = when_strongly_typed
dotnet_style_prefer_inferred_anonymous_type_member_names = true
dotnet_style_prefer_inferred_tuple_names = true
dotnet_style_prefer_is_null_check_over_reference_equality_method = true
dotnet_style_prefer_simplified_boolean_expressions = true
dotnet_style_prefer_simplified_interpolation = true
# Field preferences
dotnet_style_readonly_field = true
# Parameter preferences
dotnet_code_quality_unused_parameters = all
# Suppression preferences
dotnet_remove_unnecessary_suppression_exclusions = none
# New line preferences
dotnet_style_allow_multiple_blank_lines_experimental = true
dotnet_style_allow_statement_immediately_after_block_experimental = true
#### C# Coding Conventions ####
# var preferences
csharp_style_var_elsewhere = false
csharp_style_var_for_built_in_types = false
csharp_style_var_when_type_is_apparent = false
# Expression-bodied members
csharp_style_expression_bodied_accessors = true
csharp_style_expression_bodied_constructors = false
csharp_style_expression_bodied_indexers = true
csharp_style_expression_bodied_lambdas = true
csharp_style_expression_bodied_local_functions = false
csharp_style_expression_bodied_methods = false
csharp_style_expression_bodied_operators = false
csharp_style_expression_bodied_properties = true
# Pattern matching preferences
csharp_style_pattern_matching_over_as_with_null_check = true
csharp_style_pattern_matching_over_is_with_cast_check = true
csharp_style_prefer_extended_property_pattern = true
csharp_style_prefer_not_pattern = true
csharp_style_prefer_pattern_matching = true
csharp_style_prefer_switch_expression = true
# Null-checking preferences
csharp_style_conditional_delegate_call = true
# Modifier preferences
csharp_prefer_static_anonymous_function = true
csharp_prefer_static_local_function = true
csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async
csharp_style_prefer_readonly_struct = true
csharp_style_prefer_readonly_struct_member = true
# Code-block preferences
csharp_prefer_braces = true
csharp_prefer_simple_using_statement = true
csharp_prefer_system_threading_lock = true
csharp_style_namespace_declarations = block_scoped
csharp_style_prefer_method_group_conversion = true
csharp_style_prefer_primary_constructors = true
csharp_style_prefer_top_level_statements = true
# Expression-level preferences
csharp_prefer_simple_default_expression = true
csharp_style_deconstructed_variable_declaration = true
csharp_style_implicit_object_creation_when_type_is_apparent = true
csharp_style_inlined_variable_declaration = true
csharp_style_prefer_index_operator = true
csharp_style_prefer_local_over_anonymous_function = true
csharp_style_prefer_null_check_over_type_check = true
csharp_style_prefer_range_operator = true
csharp_style_prefer_tuple_swap = true
csharp_style_prefer_utf8_string_literals = true
csharp_style_throw_expression = true
csharp_style_unused_value_assignment_preference = discard_variable
csharp_style_unused_value_expression_statement_preference = discard_variable
# 'using' directive preferences
csharp_using_directive_placement = outside_namespace
# New line preferences
csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true
csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = true
csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = true
csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true
csharp_style_allow_embedded_statements_on_same_line_experimental = true
#### C# Formatting Rules ####
# New line preferences
csharp_new_line_before_catch = false
csharp_new_line_before_else = false
csharp_new_line_before_finally = false
csharp_new_line_before_members_in_anonymous_types = true
csharp_new_line_before_members_in_object_initializers = true
csharp_new_line_before_open_brace = none
csharp_new_line_between_query_expression_clauses = true
# Indentation preferences
csharp_indent_block_contents = true
csharp_indent_braces = false
csharp_indent_case_contents = true
csharp_indent_case_contents_when_block = true
csharp_indent_labels = one_less_than_current
csharp_indent_switch_labels = true
# Space preferences
csharp_space_after_cast = false
csharp_space_after_colon_in_inheritance_clause = true
csharp_space_after_comma = true
csharp_space_after_dot = false
csharp_space_after_keywords_in_control_flow_statements = true
csharp_space_after_semicolon_in_for_statement = true
csharp_space_around_binary_operators = before_and_after
csharp_space_around_declaration_statements = false
csharp_space_before_colon_in_inheritance_clause = true
csharp_space_before_comma = false
csharp_space_before_dot = false
csharp_space_before_open_square_brackets = false
csharp_space_before_semicolon_in_for_statement = false
csharp_space_between_empty_square_brackets = false
csharp_space_between_method_call_empty_parameter_list_parentheses = false
csharp_space_between_method_call_name_and_opening_parenthesis = false
csharp_space_between_method_call_parameter_list_parentheses = false
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
csharp_space_between_method_declaration_name_and_open_parenthesis = false
csharp_space_between_method_declaration_parameter_list_parentheses = false
csharp_space_between_parentheses = false
csharp_space_between_square_brackets = false
# Wrapping preferences
csharp_preserve_single_line_blocks = true
csharp_preserve_single_line_statements = true
#### Naming styles ####
# Naming rules
dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion
dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i
dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.types_should_be_pascal_case.symbols = types
dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case
dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case
# Symbol specifications
dotnet_naming_symbols.interface.applicable_kinds = interface
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.interface.required_modifiers =
dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.types.required_modifiers =
dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.non_field_members.required_modifiers =
# Naming styles
dotnet_naming_style.pascal_case.required_prefix =
dotnet_naming_style.pascal_case.required_suffix =
dotnet_naming_style.pascal_case.word_separator =
dotnet_naming_style.pascal_case.capitalization = pascal_case
dotnet_naming_style.begins_with_i.required_prefix = I
dotnet_naming_style.begins_with_i.required_suffix =
dotnet_naming_style.begins_with_i.word_separator =
dotnet_naming_style.begins_with_i.capitalization = pascal_case
dotnet_diagnostic.CA1416.severity = none
================================================
FILE: .gitattributes
================================================
* text=auto eol=lf
*.png binary
*.psd binary
*.jpg binary
*.jpeg binary
*.gif binary
*.bmp binary
*.ico binary
*.pdf binary
*.zip binary
*.7z binary
*.dll binary
*.exe binary
*.pfx binary
*.snk binary
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
github: PrzemyslawKlys
custom: https://paypal.me/PrzemyslawKlys
================================================
FILE: .github/workflows/claude-code-review.yml
================================================
name: Claude Code Review
on:
pull_request:
types: [opened, synchronize]
# Optional: Only run on specific file changes
# paths:
# - "src/**/*.ts"
# - "src/**/*.tsx"
# - "src/**/*.js"
# - "src/**/*.jsx"
jobs:
claude-review:
# Optional: Filter by PR author
# if: |
# github.event.pull_request.user.login == 'external-contributor' ||
# github.event.pull_request.user.login == 'new-developer' ||
# github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR'
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: read
issues: read
id-token: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 1
- name: Run Claude Code Review
id: claude-review
uses: anthropics/claude-code-action@beta
with:
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
# Optional: Specify model (defaults to Claude Sonnet 4, uncomment for Claude Opus 4.1)
# model: "claude-opus-4-1-20250805"
# Direct prompt for automated review (no @claude mention needed)
direct_prompt: |
Please review this pull request and provide feedback on:
- Code quality and best practices
- Potential bugs or issues
- Performance considerations
- Security concerns
- Test coverage
Be constructive and helpful in your feedback.
# Optional: Use sticky comments to make Claude reuse the same comment on subsequent pushes to the same PR
# use_sticky_comment: true
# Optional: Customize review based on file types
# direct_prompt: |
# Review this PR focusing on:
# - For TypeScript files: Type safety and proper interface usage
# - For API endpoints: Security, input validation, and error handling
# - For React components: Performance, accessibility, and best practices
# - For tests: Coverage, edge cases, and test quality
# Optional: Different prompts for different authors
# direct_prompt: |
# ${{ github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR' &&
# 'Welcome! Please review this PR from a first-time contributor. Be encouraging and provide detailed explanations for any suggestions.' ||
# 'Please provide a thorough code review focusing on our coding standards and best practices.' }}
# Optional: Add specific tools for running tests or linting
# allowed_tools: "Bash(npm run test),Bash(npm run lint),Bash(npm run typecheck)"
# Optional: Skip review for certain conditions
# if: |
# !contains(github.event.pull_request.title, '[skip-review]') &&
# !contains(github.event.pull_request.title, '[WIP]')
================================================
FILE: .github/workflows/claude.yml
================================================
name: Claude Code
on:
issue_comment:
types: [created]
pull_request_review_comment:
types: [created]
issues:
types: [opened, assigned]
pull_request_review:
types: [submitted]
jobs:
claude:
if: |
(github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
(github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||
(github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
(github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: read
issues: read
id-token: write
actions: read # Required for Claude to read CI results on PRs
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 1
- name: Run Claude Code
id: claude
uses: anthropics/claude-code-action@beta
with:
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
# This is an optional setting that allows Claude to read CI results on PRs
additional_permissions: |
actions: read
# Optional: Specify model (defaults to Claude Sonnet 4, uncomment for Claude Opus 4.1)
# model: "claude-opus-4-1-20250805"
# Optional: Customize the trigger phrase (default: @claude)
# trigger_phrase: "/claude"
# Optional: Trigger when specific user is assigned to an issue
# assignee_trigger: "claude-bot"
# Optional: Allow Claude to run specific commands
# allowed_tools: "Bash(npm install),Bash(npm run build),Bash(npm run test:*),Bash(npm run lint:*)"
# Optional: Add custom instructions for Claude to customize its behavior for your project
# custom_instructions: |
# Follow our coding standards
# Ensure all new code has tests
# Use TypeScript for new files
# Optional: Custom environment variables for Claude
# claude_env: |
# NODE_ENV: test
================================================
FILE: .github/workflows/dotnet-tests.yml
================================================
# .NET Testing Workflow
name: Test .NET Libraries
on:
push:
branches:
- v2-speedygonzales
paths-ignore:
- 'README.md'
- 'CHANGELOG.md'
- 'Docs/**'
pull_request:
branches:
- v2-speedygonzales
workflow_dispatch: # Manual trigger only
env:
DOTNET_VERSION: '8.x'
BUILD_CONFIGURATION: 'Debug'
TEST_VERBOSITY: minimal # set to 'detailed' to restore full test output
SUMMARIZE_FAILURES: true # set to 'false' to disable summarizing failing tests
jobs:
test-windows:
name: 'Windows'
runs-on: windows-latest
timeout-minutes: 10
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
- name: Restore dependencies
run: dotnet restore Sources/Mailozaurr.sln
- name: Build solution
run: dotnet build Sources/Mailozaurr.sln --configuration ${{ env.BUILD_CONFIGURATION }} --no-restore
- name: Run tests
run: dotnet test Sources/Mailozaurr.sln --configuration ${{ env.BUILD_CONFIGURATION }} --no-build --verbosity ${{ env.TEST_VERBOSITY }} --logger "console;verbosity=${{ env.TEST_VERBOSITY }}" --logger trx --collect:"XPlat Code Coverage"
- name: Summarize failing tests
if: failure() && env.SUMMARIZE_FAILURES == 'true'
shell: pwsh
run: |
$trxFiles = Get-ChildItem -Recurse -Filter *.trx
if ($trxFiles.Count -eq 0) {
Write-Host "No TRX files found for failure analysis"
exit 0
}
Write-Host "=== Failed Tests Summary ==="
$failureCount = 0
$trxFiles | ForEach-Object {
try {
Select-Xml -Path $_.FullName -XPath "//UnitTestResult[@outcome='Failed']" |
ForEach-Object {
$name = $_.Node.testName
$msg = $_.Node.Output.ErrorInfo.Message ?? "No error message available"
Write-Host "❌ $name"
Write-Host " $msg"
$failureCount++
}
} catch {
Write-Host "Warning: Could not parse TRX file $($_.Name): $($_.Exception.Message)"
}
}
if ($failureCount -eq 0) {
Write-Host "No failed tests found in TRX files"
} else {
Write-Host "=== Total failed tests: $failureCount ==="
}
- name: Upload test results
uses: actions/upload-artifact@v4
if: always()
with:
name: test-results-windows
path: '**/*.trx'
- name: Upload coverage reports
uses: actions/upload-artifact@v4
if: always()
with:
name: coverage-reports-windows
path: '**/coverage.cobertura.xml'
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
with:
files: '**/coverage.cobertura.xml'
fail_ci_if_error: false
test-ubuntu:
name: 'Ubuntu'
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
- name: Install Mono for .NET Framework tests
run: |
sudo apt-get update
sudo apt-get install -y mono-complete
- name: Restore dependencies
run: dotnet restore Sources/Mailozaurr.sln
- name: Build solution
run: dotnet build Sources/Mailozaurr.sln --configuration ${{ env.BUILD_CONFIGURATION }} --no-restore
- name: Run tests
run: dotnet test Sources/Mailozaurr.sln --configuration ${{ env.BUILD_CONFIGURATION }} --no-build --verbosity ${{ env.TEST_VERBOSITY }} --logger "console;verbosity=${{ env.TEST_VERBOSITY }}" --logger trx --collect:"XPlat Code Coverage"
- name: Summarize failing tests
if: failure() && env.SUMMARIZE_FAILURES == 'true'
shell: pwsh
run: |
$trxFiles = Get-ChildItem -Recurse -Filter *.trx
if ($trxFiles.Count -eq 0) {
Write-Host "No TRX files found for failure analysis"
exit 0
}
Write-Host "=== Failed Tests Summary ==="
$failureCount = 0
$trxFiles | ForEach-Object {
try {
Select-Xml -Path $_.FullName -XPath "//UnitTestResult[@outcome='Failed']" |
ForEach-Object {
$name = $_.Node.testName
$msg = $_.Node.Output.ErrorInfo.Message ?? "No error message available"
Write-Host "❌ $name"
Write-Host " $msg"
$failureCount++
}
} catch {
Write-Host "Warning: Could not parse TRX file $($_.Name): $($_.Exception.Message)"
}
}
if ($failureCount -eq 0) {
Write-Host "No failed tests found in TRX files"
} else {
Write-Host "=== Total failed tests: $failureCount ==="
}
- name: Upload test results
uses: actions/upload-artifact@v4
if: always()
with:
name: test-results-ubuntu
path: '**/*.trx'
- name: Upload coverage reports
uses: actions/upload-artifact@v4
if: always()
with:
name: coverage-reports-ubuntu
path: '**/coverage.cobertura.xml'
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
with:
files: '**/coverage.cobertura.xml'
fail_ci_if_error: false
test-macos:
name: 'macOS'
runs-on: macos-latest
timeout-minutes: 10
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
- name: Install Mono for .NET Framework tests
run: brew install mono
- name: Restore dependencies
run: dotnet restore Sources/Mailozaurr.sln
- name: Build solution
run: dotnet build Sources/Mailozaurr.sln --configuration ${{ env.BUILD_CONFIGURATION }} --no-restore
- name: Run tests
run: dotnet test Sources/Mailozaurr.sln --configuration ${{ env.BUILD_CONFIGURATION }} --no-build --verbosity ${{ env.TEST_VERBOSITY }} --logger "console;verbosity=${{ env.TEST_VERBOSITY }}" --logger trx --collect:"XPlat Code Coverage"
- name: Summarize failing tests
if: failure() && env.SUMMARIZE_FAILURES == 'true'
shell: pwsh
run: |
$trxFiles = Get-ChildItem -Recurse -Filter *.trx
if ($trxFiles.Count -eq 0) {
Write-Host "No TRX files found for failure analysis"
exit 0
}
Write-Host "=== Failed Tests Summary ==="
$failureCount = 0
$trxFiles | ForEach-Object {
try {
Select-Xml -Path $_.FullName -XPath "//UnitTestResult[@outcome='Failed']" |
ForEach-Object {
$name = $_.Node.testName
$msg = $_.Node.Output.ErrorInfo.Message ?? "No error message available"
Write-Host "❌ $name"
Write-Host " $msg"
$failureCount++
}
} catch {
Write-Host "Warning: Could not parse TRX file $($_.Name): $($_.Exception.Message)"
}
}
if ($failureCount -eq 0) {
Write-Host "No failed tests found in TRX files"
} else {
Write-Host "=== Total failed tests: $failureCount ==="
}
- name: Upload test results
uses: actions/upload-artifact@v4
if: always()
with:
name: test-results-macos
path: '**/*.trx'
- name: Upload coverage reports
uses: actions/upload-artifact@v4
if: always()
with:
name: coverage-reports-macos
path: '**/coverage.cobertura.xml'
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
with:
files: '**/coverage.cobertura.xml'
fail_ci_if_error: false
================================================
FILE: .github/workflows/powershell-tests-all.yml
================================================
name: Test PowerShell Module (All)
# This workflow is disabled but ready for use
on:
workflow_dispatch: # Manual trigger only
# To enable, replace above with push/pull_request triggers
env:
DOTNET_VERSION: '8.x'
BUILD_CONFIGURATION: 'Debug'
jobs:
refresh-psd1:
name: 'Refresh PSD1'
runs-on: windows-latest
timeout-minutes: 10
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup PowerShell modules
run: |
Install-Module PSPublishModule -Force -Scope CurrentUser -AllowClobber
shell: pwsh
- name: Refresh module manifest
env:
RefreshPSD1Only: 'true'
run: ./Build/Manage-Mailozaurr.ps1
shell: pwsh
- name: Commit refreshed PSD1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
HEAD_BRANCH: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || github.ref_name }}
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add Mailozaurr.psd1
git commit -m "chore: regenerate psd1" || echo "No changes to commit"
git push origin HEAD:$Env:HEAD_BRANCH
shell: pwsh
- name: Upload refreshed manifest
uses: actions/upload-artifact@v4
with:
name: psd1
path: Mailozaurr.psd1
test-windows-ps5:
needs: refresh-psd1
name: 'Windows PowerShell 5.1'
runs-on: windows-latest
timeout-minutes: 10
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Download manifest
uses: actions/download-artifact@v4
with:
name: psd1
path: .
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
- name: Install PowerShell modules
shell: powershell
run: |
Write-Host "PowerShell Version: $($PSVersionTable.PSVersion)"
Install-Module -Name Pester -Repository PSGallery -Force -SkipPublisherCheck -AllowClobber
Install-Module -Name PSWriteColor -Repository PSGallery -Force -SkipPublisherCheck -AllowClobber
- name: Build .NET solution
run: |
dotnet restore Sources/Mailozaurr.sln
dotnet build Sources/Mailozaurr.sln --configuration ${{ env.BUILD_CONFIGURATION }} --no-restore
- name: Run PowerShell tests
shell: powershell
run: .\Mailozaurr.Tests.ps1
test-windows-ps7:
needs: refresh-psd1
name: 'Windows PowerShell 7'
runs-on: windows-latest
timeout-minutes: 10
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Download manifest
uses: actions/download-artifact@v4
with:
name: psd1
path: .
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
- name: Install PowerShell modules
shell: pwsh
run: |
Write-Host "PowerShell Version: $($PSVersionTable.PSVersion)"
Install-Module -Name Pester -Repository PSGallery -Force -SkipPublisherCheck -AllowClobber
Install-Module -Name PSWriteColor -Repository PSGallery -Force -SkipPublisherCheck -AllowClobber
- name: Build .NET solution
run: |
dotnet restore Sources/Mailozaurr.sln
dotnet build Sources/Mailozaurr.sln --configuration ${{ env.BUILD_CONFIGURATION }} --no-restore
- name: Run PowerShell tests
shell: pwsh
run: .\Mailozaurr.Tests.ps1
test-ubuntu:
needs: refresh-psd1
name: 'Ubuntu PowerShell 7'
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Download manifest
uses: actions/download-artifact@v4
with:
name: psd1
path: .
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
- name: Install PowerShell
run: |
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list | sudo tee /etc/apt/sources.list.d/microsoft.list
sudo apt-get update
sudo apt-get install -y powershell
- name: Install Mono for .NET Framework tests
run: sudo apt-get install -y mono-complete
- name: Install PowerShell modules
shell: pwsh
run: |
Write-Host "PowerShell Version: $($PSVersionTable.PSVersion)"
Install-Module -Name Pester -Repository PSGallery -Force -SkipPublisherCheck -AllowClobber
Install-Module -Name PSWriteColor -Repository PSGallery -Force -SkipPublisherCheck -AllowClobber
- name: Build .NET solution
run: |
dotnet restore Sources/Mailozaurr.sln
dotnet build Sources/Mailozaurr.sln --configuration ${{ env.BUILD_CONFIGURATION }} --no-restore
- name: Run PowerShell tests
shell: pwsh
run: ./Mailozaurr.Tests.ps1
test-macos:
needs: refresh-psd1
name: 'macOS PowerShell 7'
runs-on: macos-latest
timeout-minutes: 10
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Download manifest
uses: actions/download-artifact@v4
with:
name: psd1
path: .
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
- name: Install PowerShell
run: brew install --cask powershell
- name: Install Mono for .NET Framework tests
run: brew install mono
- name: Install PowerShell modules
shell: pwsh
run: |
Write-Host "PowerShell Version: $($PSVersionTable.PSVersion)"
Install-Module -Name Pester -Repository PSGallery -Force -SkipPublisherCheck -AllowClobber
Install-Module -Name PSWriteColor -Repository PSGallery -Force -SkipPublisherCheck -AllowClobber
- name: Build .NET solution
run: |
dotnet restore Sources/Mailozaurr.sln
dotnet build Sources/Mailozaurr.sln --configuration ${{ env.BUILD_CONFIGURATION }} --no-restore
- name: Run PowerShell tests
shell: pwsh
run: ./Mailozaurr.Tests.ps1
================================================
FILE: .gitignore
================================================
Ignore/*
.vs/*
.vscode/*
Examples/Output/*
Examples/Input/*
Examples/Documents/*
Releases/*
Artefacts/*
ReleasedUnpacked/*
Sources/.vs
Sources/*/.vs
Sources/*/obj
Sources/*/bin
Sources/*/*/obj
Sources/*/*/bin
Sources/packages/*
Lib/Default/*
Lib/Standard/*
Lib/Core/*
dotnet-install.sh
packages-microsoft-prod.deb
Sources/*/TestResults/
.nuget
================================================
FILE: Build/Artefacts/ProjectBuild/project.build.plan.json
================================================
{
"Success": true,
"ResolvedVersion": "2.0.5",
"ResolvedVersionsByProject": {
"Mailozaurr.Msg": "2.0.5",
"Mailozaurr": "2.0.5"
},
"Projects": [
{
"ProjectName": "Mailozaurr.Msg",
"CsprojPath": "C:\\Support\\GitHub\\Mailozaurr\\Sources\\Mailozaurr.Msg\\Mailozaurr.Msg.csproj",
"IsPackable": true,
"OldVersion": "2.0.4",
"NewVersion": "2.0.5",
"Packages": [
"C:\\Support\\GitHub\\Mailozaurr\\Artefacts\\ProjectBuild\\packages\\Mailozaurr.Msg.2.0.5.nupkg"
]
},
{
"ProjectName": "Mailozaurr",
"CsprojPath": "C:\\Support\\GitHub\\Mailozaurr\\Sources\\Mailozaurr\\Mailozaurr.csproj",
"IsPackable": true,
"OldVersion": "2.0.4",
"NewVersion": "2.0.5",
"Packages": [
"C:\\Support\\GitHub\\Mailozaurr\\Artefacts\\ProjectBuild\\packages\\Mailozaurr.2.0.5.nupkg"
]
}
],
"PublishedPackages": []
}
================================================
FILE: Build/Build-Module.ps1
================================================
# Install-Module PSPublishModule -Force
Import-Module PSPublishModule -Force
Build-Module -ModuleName 'Mailozaurr' {
# Usual defaults as per standard module
$Manifest = [ordered] @{
ModuleVersion = '2.0.1'
# Supported PSEditions
CompatiblePSEditions = @('Desktop', 'Core')
# ID used to uniquely identify this module
GUID = '2b0ea9f1-3ff1-4300-b939-106d5da608fa'
# Author of this module
Author = 'Przemyslaw Klys'
# Company or vendor of this module
CompanyName = 'Evotec'
# Copyright statement for this module
Copyright = "(c) 2011 - $((Get-Date).Year) Przemyslaw Klys @ Evotec. All rights reserved."
# Description of the functionality provided by this module
Description = 'Mailozaurr is a PowerShell module that aims to provide SMTP, POP3, IMAP and few other ways to interact with Email. Underneath it uses MimeKit and MailKit and EmailValidation libraries written by Jeffrey Stedfast. '
# Minimum version of the Windows PowerShell engine required by this module
PowerShellVersion = '5.1'
# Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell.
Tags = @('Windows', 'MacOS', 'Linux', 'Mail', 'Email', 'MX', 'SPF', 'DMARC', 'DKIM', 'GraphApi', 'SendGrid', 'Graph', 'IMAP', 'POP3')
IconUri = 'https://evotec.xyz/wp-content/uploads/2020/07/MailoZaurr.png'
ProjectUri = 'https://github.com/EvotecIT/MailoZaurr'
PreReleaseTag = 'Preview4'
}
New-ConfigurationManifest @Manifest
$ConfigurationFormat = [ordered] @{
RemoveComments = $false
PlaceOpenBraceEnable = $true
PlaceOpenBraceOnSameLine = $true
PlaceOpenBraceNewLineAfter = $true
PlaceOpenBraceIgnoreOneLineBlock = $false
PlaceCloseBraceEnable = $true
PlaceCloseBraceNewLineAfter = $false
PlaceCloseBraceIgnoreOneLineBlock = $false
PlaceCloseBraceNoEmptyLineBefore = $true
UseConsistentIndentationEnable = $true
UseConsistentIndentationKind = 'space'
UseConsistentIndentationPipelineIndentation = 'IncreaseIndentationAfterEveryPipeline'
UseConsistentIndentationIndentationSize = 4
UseConsistentWhitespaceEnable = $true
UseConsistentWhitespaceCheckInnerBrace = $true
UseConsistentWhitespaceCheckOpenBrace = $true
UseConsistentWhitespaceCheckOpenParen = $true
UseConsistentWhitespaceCheckOperator = $true
UseConsistentWhitespaceCheckPipe = $true
UseConsistentWhitespaceCheckSeparator = $true
AlignAssignmentStatementEnable = $true
AlignAssignmentStatementCheckHashtable = $true
UseCorrectCasingEnable = $true
}
# format PSD1 and PSM1 files when merging into a single file
# enable formatting is not required as Configuration is provided
New-ConfigurationFormat -ApplyTo 'OnMergePSM1', 'OnMergePSD1' -Sort None @ConfigurationFormat
# format PSD1 and PSM1 files within the module
# enable formatting is required to make sure that formatting is applied (with default settings)
New-ConfigurationFormat -ApplyTo 'DefaultPSD1', 'DefaultPSM1' -EnableFormatting -Sort None
# when creating PSD1 use special style without comments and with only required parameters
New-ConfigurationFormat -ApplyTo 'DefaultPSD1', 'OnMergePSD1' -PSD1Style 'Minimal'
# configuration for documentation, at the same time it enables documentation processing
New-ConfigurationDocumentation -Enable:$false -StartClean -UpdateWhenNew -PathReadme 'Docs\Readme.md' -Path 'Docs'
New-ConfigurationImportModule -ImportSelf #-ImportRequiredModules
$newConfigurationBuildSplat = @{
Enable = $true
SignModule = $true
MergeModuleOnBuild = $true
MergeFunctionsFromApprovedModules = $true
CertificateThumbprint = '483292C9E317AA13B07BB7A96AE9D1A5ED9E7703'
ResolveBinaryConflicts = $true
ResolveBinaryConflictsName = 'Mailozaurr.PowerShell'
NETProjectPath = "$PSScriptRoot\..\Sources\Mailozaurr.PowerShell"
NETProjectName = 'Mailozaurr.PowerShell'
NETConfiguration = 'Release'
NETFramework = 'net8.0', 'net472'
NETHandleAssemblyWithSameName = $true
#NETMergeLibraryDebugging = $true
DotSourceLibraries = $true
DotSourceClasses = $true
DeleteTargetModuleBeforeBuild = $true
NETBinaryModuleDocumenation = $true
RefreshPSD1Only = $true
}
New-ConfigurationBuild @newConfigurationBuildSplat #-DotSourceLibraries -DotSourceClasses -MergeModuleOnBuild -Enable -SignModule -DeleteTargetModuleBeforeBuild -CertificateThumbprint '483292C9E317AA13B07BB7A96AE9D1A5ED9E7703' -MergeFunctionsFromApprovedModules
New-ConfigurationArtefact -Type Unpacked -Enable -Path "$PSScriptRoot\..\Artefacts" -RequiredModulesPath "$PSScriptRoot\..\Artefacts\Modules"
New-ConfigurationArtefact -Type Packed -Enable -Path "$PSScriptRoot\..\Releases" -IncludeTagName
#New-ConfigurationTest -TestsPath "$PSScriptRoot\..\Tests" -Enable
# global options for publishing to github/psgallery
#New-ConfigurationPublish -Type PowerShellGallery -FilePath 'C:\Support\Important\PowerShellGalleryAPI.txt' -Enabled:$true
#New-ConfigurationPublish -Type GitHub -FilePath 'C:\Support\Important\GitHubAPI.txt' -UserName 'EvotecIT' -Enabled:$true -GenerateReleaseNotes -OverwriteTagName '{ModuleName}-v{ModuleVersionWithPreRelease}'
} -ExitCode
================================================
FILE: Build/Build-Project.ps1
================================================
param(
[string] $ConfigPath = "$PSScriptRoot\project.build.json",
[Nullable[bool]] $UpdateVersions,
[Nullable[bool]] $Build,
[Nullable[bool]] $PublishNuget = $false,
[Nullable[bool]] $PublishGitHub = $false,
[Nullable[bool]] $Plan,
[string] $PlanPath
)
Import-Module PSPublishModule -Force -ErrorAction Stop
$invokeParams = @{
ConfigPath = $ConfigPath
}
if ($null -ne $UpdateVersions) { $invokeParams.UpdateVersions = $UpdateVersions }
if ($null -ne $Build) { $invokeParams.Build = $Build }
if ($null -ne $PublishNuget) { $invokeParams.PublishNuget = $PublishNuget }
if ($null -ne $PublishGitHub) { $invokeParams.PublishGitHub = $PublishGitHub }
if ($null -ne $Plan) { $invokeParams.Plan = $Plan }
if ($PlanPath) { $invokeParams.PlanPath = $PlanPath }
Invoke-ProjectBuild @invokeParams
================================================
FILE: Build/Refresh-DisposableDomains.ps1
================================================
[CmdletBinding()]
param(
[string]$OutputPath = (Join-Path $PSScriptRoot '..\Sources\Mailozaurr\Resources')
)
$lists = @{
'disposable_email_blocklist.conf' = 'https://raw.githubusercontent.com/disposable-email-domains/disposable-email-domains/refs/heads/main/disposable_email_blocklist.conf'
'allowlist.conf' = 'https://raw.githubusercontent.com/disposable-email-domains/disposable-email-domains/refs/heads/main/allowlist.conf'
}
foreach ($list in $lists.GetEnumerator()) {
$target = Join-Path $OutputPath $list.Key
Write-Host "Checking $($list.Key)..."
$remoteContent = (Invoke-WebRequest -Uri $list.Value -UseBasicParsing).Content -replace "`r`n", "`n" -split "`n" | Where-Object { $_ -and -not $_.StartsWith('#') }
if (Test-Path $target) {
$localContent = Get-Content $target
$diff = Compare-Object -ReferenceObject $localContent -DifferenceObject $remoteContent
if ($diff) {
Write-Host "Changes for $($list.Key):"
foreach ($d in $diff) {
if ($d.SideIndicator -eq '=>') { Write-Host "Added: $($d.InputObject)" }
elseif ($d.SideIndicator -eq '<=') { Write-Host "Removed: $($d.InputObject)" }
}
} else {
Write-Host "No changes for $($list.Key)."
}
} else {
Write-Host "Local file for $($list.Key) not found. Creating new."
foreach ($line in $remoteContent) { Write-Host "Added: $line" }
}
$remoteContent | Set-Content $target -Encoding UTF8
}
================================================
FILE: Build/project.build.json
================================================
{
"$schema": "https://raw.githubusercontent.com/EvotecIT/PSPublishModule/main/Schemas/project.build.schema.json",
"RootPath": "..",
"ExpectedVersion": null,
"ExpectedVersionMap": {
"Mailozaurr": "2.0.X",
"Mailozaurr.Msg": "2.0.X"
},
"ExpectedVersionMapAsInclude": true,
"ExpectedVersionMapUseWildcards": false,
"NugetSource": [],
"IncludePrerelease": false,
"Configuration": "Release",
"OutputPath": null,
"StagingPath": "Artefacts/ProjectBuild",
"CleanStaging": true,
"PlanOutputPath": null,
"UpdateVersions": true,
"Build": true,
"PublishNuget": false,
"PublishGitHub": false,
"CreateReleaseZip": true,
"CertificateThumbprint": "483292C9E317AA13B07BB7A96AE9D1A5ED9E7703",
"CertificateStore": "CurrentUser",
"TimeStampServer": "http://timestamp.digicert.com",
"PublishSource": "https://api.nuget.org/v3/index.json",
"PublishApiKeyFilePath": "C:\\Support\\Important\\NugetOrgEvotec.txt",
"SkipDuplicate": true,
"PublishFailFast": true,
"GitHubAccessTokenFilePath": "C:\\Support\\Important\\GithubAPI.txt",
"GitHubUsername": "EvotecIT",
"GitHubRepositoryName": "Mailozaurr",
"GitHubIsPreRelease": false,
"GitHubIncludeProjectNameInTag": true,
"GitHubGenerateReleaseNotes": true,
"GitHubReleaseMode": "Single",
"GitHubPrimaryProject": "Mailozaurr",
"GitHubTagTemplate": "{Repo}-v{UtcTimestamp}",
"GitHubReleaseName": "{Repo} {UtcDateTime}"
}
================================================
FILE: CHANGELOG.MD
================================================
#### 2.0.0 - Preview 6
##### What's Changed
* docs: fix permissions typo in README by @PrzemyslawKlys in https://github.com/EvotecIT/Mailozaurr/pull/66
* fix: correct verbose message for Get-IMAPFolder by @PrzemyslawKlys in https://github.com/EvotecIT/Mailozaurr/pull/67
* Update POP message retrieval by @PrzemyslawKlys in https://github.com/EvotecIT/Mailozaurr/pull/69
* test: define sample body content for Send-EmailMessage by @PrzemyslawKlys in https://github.com/EvotecIT/Mailozaurr/pull/68
* docs: fix spelling mistakes by @PrzemyslawKlys in https://github.com/EvotecIT/Mailozaurr/pull/72
* Add tests for ConvertFromGraphCredential by @PrzemyslawKlys in https://github.com/EvotecIT/Mailozaurr/pull/71
* Add GetEmailAddress unit tests by @PrzemyslawKlys in https://github.com/EvotecIT/Mailozaurr/pull/70
* Futher improvements by @PrzemyslawKlys in https://github.com/EvotecIT/Mailozaurr/pull/73
* Fix SMTP auth optional by @PrzemyslawKlys in https://github.com/EvotecIT/Mailozaurr/pull/76
* feat: add `RetryCount` parameter to `Send-EmailMessage` allowing optional retries
* feat: support configurable delay and exponential backoff via `RetryDelayMilliseconds` and `RetryDelayBackoff`
**Full Changelog**: https://github.com/EvotecIT/Mailozaurr/compare/v2.0.0-Preview5...v2.0.0-Preview6
#### 2.0.0 - Preview 5
- Removed `Resolve-DnsQuery` => moved to DnsClientX, which uses it's own library
- Removed `Resolve-DnsRequestRest` => moved to DnsClientX, which uses it's own library
- Removed all functions related to DNS (will be moved to DomainDetective module)
- `Find-MXRecord`
- `Find-SPFRecord`
- `Find-DKIMRecord`
- `Find-DMARCRecord`
- `Find-DNSBL`
- `Find-DNSSECRecord`
- `Find-CAARecord`
- `Find-BIMIRecord`
- `Find-MTASTSRecord`
- `Find-O365OpenIDRecord`
- `Find-SecurityTxtRecord`
- `Find-TLSRPTRecord`
- `Find-IPGeolocation`
- `Find-DANERecord`
- `Find-CAARecord`
- `Find-DNSSECRecord`
- Replaced `Test-EmailAddress` function with `Test-EmailAddress` binary cmdlet
- Improvements to `Send-EmailMessage`
- Removed `Email`/`EmailParameters` parameters as they are not needed, and legacy
- Added `DeliveryNotificationOption` as an enum instead of strings
- Internal improvements
- Dispose() of SmtpClient in the end
- Replaced PowerShell classes with C# version
- Moved some PowerShell code to C# for better performance and simpler logic
#### 2.0.0 - Preview 4 - 2024.03.04
- Update to DLLs to latest versions
- Removes some unnecessary DLLs
- Different way to build module and load dependencies
- Removal of DLLs from source codes
- Small updates to DLLs
- Add new DLLs
- Added `ConvertFrom-EmlToMsg` to convert EML files to MSG files
- Added `Import-MailFile` to import MSG/EML files to PowerShell Object
- Added `Get-MailMessage`
- Added `Get-MailMessageAttachment`
- Added `Find-BIMIRecord`
- Added `Find-CAARecord`
- Added `Find-DANERecord`
- Added `Find-MTASTSRecord`
- Added `Find-O365OpenIDRecord`
- Added `Find-SecurityTxtRecord`
- Added `Find-TLSRPTRecord`
- Added `Find-DNSSECRecord`
- Improve `Find-DMARCRecord` to return more data
- Added `Get-DMARCData` to read DMARC data from XML files
- Added `Find-IPGeolocation` to get IP Geolocation data
- Small improvements to error handling
#### 1.0.2 - 2023.08.05
- Rename `SkipCertificateValidatation` to `SkipCertificateValidation` in `Send-EmailMessage` (typo fix)
- Added `SkipCertificateValidation` to `Connect-IMAP`
- Added `SkipCertificateValidation` to `Connect-POP3`
- Added `SkipCertificateRevocation` to `Connect-IMAP`
- Added `SkipCertificateRevocation` to `Connect-POP3`
- Use simpler certificate validation callback by @jborean93 in https://github.com/EvotecIT/Mailozaurr/pull/42
#### 1.0.1 - 2023.07.19
- Updated `Microsoft.Identity.Client.dll` to 4.44 to match `ExchangeOnlineManagement` module
#### 1.0.0 - 2022.12.20
- Add support for sending emails with graph using Delegated permissions. It uses Microsoft.Graph.Authentication module and `MgGraphRequest` switch on `Send-EmailMessage`.
```powershell
Import-Module Mailozaurr
Import-Module Microsoft.Graph.Authentication -Force
# this shows how to send email using combination of Mailozaurr and Microsoft.Graph to use Connect-MgGraph to authorize
$Body = EmailBody {
New-HTMLText -Text "This is test of Connect-MGGraph functionality"
}
# authorize via Connect-MgGraph with delegated rights or any other supported method
Connect-MgGraph -Scopes Mail.Send
# sending email
$sendEmailMessageSplat = @{
From = 'przemyslaw.klys@test.pl'
To = 'przemyslaw.klys@test.pl'
HTML = $Body
Subject = 'This tests email as delegated'
MgGraphRequest = $true
Verbose = $true
}
Send-EmailMessage @sendEmailMessageSplat
```
#### 0.9.0 - 2022.10.02
- Fix `Suppress` for sending emails via SendGrid
- Fix `Suppress` for sending emails via Microsoft Graph
- Add support to `Send-EmailMessage` for attachments **4MB** to **150MB** in size for Microsoft Graph. Before it would only send attachments up to **4MB** in size. Detects size automatically and uses the appropriate API endpoint.
- Add `RequestReadReceipt` support to `Send-EmailMessage` for Microsoft Graph to request a read receipt from the recipient.
- Add `RequestDeliveryReceipt` switch to `Send-EmailMessage` for Microsoft Graph to request a delivery receipt. SMTP uses `DeliveryNotificationOption` and `DeliveryStatusNotificationType`.
- Require `Send-EmailMessage` to have From field [#33](https://github.com/EvotecIT/Mailozaurr/issues/33)
- Warn if attachment in `Send-EmailMessage` doesn't exists, no error is thrown [#34](https://github.com/EvotecIT/Mailozaurr/issues/34)
- Fixes special chars issue in file names [#26](https://github.com/EvotecIT/Mailozaurr/issues/26)
-
#### 0.0.25 - 2022.06.07
- Updated `MailKit`
- Updated `MimeKit`
- Added missing libraries so that the project can work on more systems without installing higher version of .NET Framework
- Added tests for SMTP with Auth and Graph API
#### 0.0.24 - 2021.01.24
- Improved logging logic for `Send-EmailMessage`
#### 0.0.23 - 2021.01.22
- Added option to `Send-EmailMessage` to specify the `LocalDomain` to be able to troubleshoot issue [#1314](https://github.com/jstedfast/MailKit/issues/1314)
- Added option to `Send-EmailMessage` - `LogConsole` and `LogObject` which joins `LogPath` in saving whole conversation to console, or to final object as Message property
#### 0.0.22 - 2021.01.21
- Upgraded `MailKit\MimeKit` to 3.1.0
- Added support to save MimeMessage in `Send-EmailMessage` using `MimeMessagePath`
- Fixed `Cloudflare DNS calls` for `Find-DMARCRecord`,`Find-DKIMRecord`, `Find-MXRecord`, `Find-SPFRecord`, `Find-DNSBNL`
- Updated docs
- More output fields on `Send-EmailMessage`
#### 0.0.21 - 2022.01.07
- Added support for logging in the `Send-EmailMessage` for SMTP to allow for debugging.
- By adding `LogPath $PSScriptRoot\Output\Log1.txt` log file will be created with full information
- Parameters such as `LogSecrets`, `LogTimeStamps`, `LogTimeStampsFormat` and `LogClientPrefix`,`LogServerPrefix` are available
#### 0.0.20 - 2022.01.02
- Added support for using `Get-MsalToken` instead of built-in token creation for GraphApi
```powershell
# creating body for HTML using PSWriteHTML
$Body = EmailBody {
New-HTMLText -Text "this is my test"
New-HTMLText -Text "Łączy nas piłka"
}
# Generating token using Get-MsalToken
$getMsalTokenSplat = @{
ClientId = '0fb383f1'
ClientSecret = 'VKDM_' | ConvertTo-SecureString -AsPlainText
Authority = 'https://login.microsoftonline.com/ceb371f6'
}
$MsalToken = Get-MsalToken @getMsalTokenSplat
# Converting it to Credentials object (so that Send-EmailMessage can use it)
$Credential = ConvertTo-GraphCredential -MsalToken $MsalToken.AccessToken
# sending email
Send-EmailMessage -From 'przemyslaw.klys@something.pl' -To 'przemyslaw.klys@something.else' -Credential $Credential -HTML $Body -Subject 'This is another test email 2' -Graph -Verbose -Priority Low -DoNotSaveToSentItems
```
#### 0.0.19 - 2021.12.25
- Fixes encoding for Send-EmailMessage wen using GraphApi (forces UTF8)
#### 0.0.18 - 2021.09.23
- Improved error handling of `Send-EmailMessage` when sending with GraphApi
#### 0.0.17 - 2021.09.19
- Upgraded `MailKit/Mimekit` `2.15.0`
- Upgraded `DNSClient` to `1.5.0`
- Fixes `oAuth2` [#17](https://github.com/EvotecIT/Mailozaurr/issues/17)
- Removed wrong parameterset from `Send-EmailMessage`
- Improved `ConvertTo-GraphCredential` to support encrypted graph client secret.
#### 0.0.16 - 2021.07.23
- Moved Class.MySmtpClient to be loaded from separate file via dot sourcing - hopefully fixes [#16](https://github.com/EvotecIT/Mailozaurr/issues/16)
#### 0.0.15 - 2021.07.18
- Moved Class.MySmtpClient to be loaded as last in PSM1. This should make it load when loaded by other modules - hopefully!
#### 0.0.14 - 2021.06.28
- Added missing library `System.Buffers`
#### 0.0.13 - 2021.06.27
- Added `SkipCertificateValidatation` to `Send-EmailMessage`
- Downgraded `MailKit/MimeKit 2.12.0`
#### 0.0.12 - 2021.06.20
- Added `AsSecureString` to `Send-EmailMessage` which allows to provide `-AsSecureString -Username 'przemyslaw.klys@domain.pl' -Password $secStringPassword`
#### 0.0.11 - 2021.06.18
- Added `SkipCertificateRevocation` to `Send-EmailMessage` [#13](https://github.com/EvotecIT/Mailozaurr/issues/13)
- 🐛 Fixed PTR records in `Find-MXRecord` when using HTTPS
- Small improvement to `Send-EmailMessage` returning object when using `WhatIf`
#### 0.0.10 - 2020.10.25
- `Send-EmailMessage` - fix for Graph where attachments where not attached and nobody reported
- `Send-EmailMessage` - updated error messages with tips what could be wrong
- `Send-EmailMessage` - updated ErrorAction Stop in few places for those that prefer errors
- `Send-EmailMessage` - added basic support for SendGrid with parameter `-SendGrid`
- `Find-MXRecord` - updated with `DNSProvider` (`Cloudflare`/`Google`) for calls over HTTPS
- `Find-SPFRecord` - updated with `DNSProvider` (`Cloudflare`/`Google`) for calls over HTTPS
- `Find-DKIMRecord` - updated with `DNSProvider` (`Cloudflare`/`Google`) for calls over HTTPS
- `Find-DMARCRecord` - updated with `DNSProvider` (`Cloudflare`/`Google`) for calls over HTTPS
- `Find-DNSBL` - added, same options as above
- `Resolve-DNSRequestRest` - Added just in case
#### 0.0.9 - 2020.08.11
- DNS Records
- Fixed `DNSServer` parameter usage [#5](https://github.com/EvotecIT/Mailozaurr/issues/5)
#### 0.0.8 - 2020.08.06
- MS Graph API
- Added `Get-MailFolder` - work in progress
- Added `Get-MailMessage` - work in progress
- Added `Save-MailMessage` - work in progress
- Added check for attachments/message body less than 10 characters. - by andrew0wells [#3](https://github.com/EvotecIT/Mailozaurr/issues/3)
- SMTP
- Updated `Send-EmailMessage` error handling
#### 0.0.7 - 2020.08.04
- More updates making it better toolkit
#### 0.0.6 - 2020.08.03
- Public release
- Added GraphAPI support for Send-EmailMessage
- Added oAuth2 support for Send-EmailMessage
- Added oAuth2 support for POP3
- Added oAuth2 support for IMAP4
- Fixed lots of stuff
#### 0.0.3 - 2020.07.26
- Added `Test-EmailAddress`
- Added `Connect-OAuthGoogle`
- Added `Connect-OAuthO365`
- Added `Resolve-DNSQuery`
#### 0.0.2 - 2020.07.25
- Added `Find-MXRecord`
- Added `Find-DMARCRecord`
- Added `Find-DKIMRecord`
- Added `Find-SPFRecord`
#### 0.0.1 - 2020.06.13
- Initial release
================================================
FILE: Docs/Configuration-and-Usage.md
================================================
# Mailozaurr Configuration and Usage
This document collects the practical configuration model for Mailozaurr across its reusable application layer, the `mailozaurr` executable, and MCP usage.
It is meant to answer:
- how Mailozaurr models accounts and providers
- what settings and secrets belong to a profile
- which providers support which kinds of operations
- how to configure CLI storage and run common flows
- where PowerShell still fits today
## Core idea: profiles
Mailozaurr uses reusable `MailProfile` definitions for mailbox and send configuration.
A profile contains:
- `Id`: stable identifier such as `work-imap` or `alerts-smtp`
- `DisplayName`: human-friendly name
- `Kind`: provider/technology such as `imap`, `graph`, `gmail`, or `smtp`
- `DefaultSender`: default sender for send-capable profiles
- `DefaultMailbox`: default mailbox or principal for read-capable profiles
- `Settings`: non-secret provider settings
- secrets stored separately from the profile document
The shared model is implemented in:
- [MailProfile.cs](../Sources/Mailozaurr.Application/MailProfile.cs)
- [MailProfileKind.cs](../Sources/Mailozaurr.Application/MailProfileKind.cs)
- [MailProfileSettingsKeys.cs](../Sources/Mailozaurr.Application/MailProfileSettingsKeys.cs)
- [MailSecretNames.cs](../Sources/Mailozaurr.Application/MailSecretNames.cs)
## Supported profile kinds
Current shared profile kinds are:
- `imap`
- `pop3`
- `graph`
- `gmail`
- `smtp`
- `sendgrid`
- `mailgun`
- `ses`
## Capability model
Mailozaurr does not pretend every provider supports the same operations.
Default capabilities are defined in [MailCapabilityCatalog.cs](../Sources/Mailozaurr.Application/MailCapabilityCatalog.cs).
In practice:
| Kind | Read/Search | Folders | Move/Mark/Delete | Send | Notes |
|---|---|---|---|---|---|
| `imap` | Yes | Yes | Yes | No | strong mailbox model |
| `pop3` | Yes | No real folder model | Delete only style workflows | No | limited mailbox model |
| `graph` | Yes | Yes | Yes | Yes | also supports rules/events/permissions |
| `gmail` | Yes | Yes | Yes | Yes | Gmail-specific threads/labels |
| `smtp` | No | No | No | Yes | send only |
| `sendgrid` | No | No | No | Yes | send only |
| `mailgun` | No | No | No | Yes | send only |
| `ses` | No | No | No | Yes | send only |
## Common settings and secrets
Common non-secret setting keys include:
- `server`
- `port`
- `userName`
- `folder`
- `mailbox`
- `clientId`
- `tenantId`
- `certificatePath`
- `redirectUri`
- `authFlow`
- `loginHint`
- `tokenExpiresOn`
- `authMode`
- `secureSocketOptions`
- `useSsl`
Common secret names include:
- `password`
- `clientSecret`
- `accessToken`
- `refreshToken`
- `certificatePassword`
## Minimum provider guidance
The shared validator lives in [MailProfileValidator.cs](../Sources/Mailozaurr.Application/MailProfileValidator.cs).
The practical minimum shape by provider is:
### IMAP / POP3 / SMTP
Usually define:
- `kind`
- `server`
- optional `port`
- optional `userName`
- `password` secret when using username/password auth
Recommended:
- `defaultMailbox` for read profiles
- `defaultSender` for send profiles
### Graph
Usually define:
- `kind=graph`
- mailbox through `defaultMailbox` or `mailbox`
Then choose one auth story:
- interactive login and saved tokens
- access token
- `clientId` + `tenantId` + `clientSecret`
- `clientId` + `tenantId` + `certificatePath`
### Gmail
Usually define:
- `kind=gmail`
- mailbox through `defaultMailbox` or `mailbox`
Then choose one auth story:
- interactive login and saved tokens
- access token
- `clientId` + `clientSecret` + `refreshToken`
### SendGrid / Mailgun / SES
These are send-only profiles. The exact provider-specific settings are still best treated as provider-specific recipes, but they fit the same profile model and shared send surface.
## Storage locations
By default, the application layer stores reusable state under a `Mailozaurr` directory inside local application data.
The path resolver is implemented in [MailApplicationPaths.cs](../Sources/Mailozaurr.Application/MailApplicationPaths.cs).
Default subdirectories are:
- `Profiles`
- `Secrets`
- `Drafts`
- `ActionPlanBatches`
Environment variable overrides:
- `MAILOZAURR_PROFILE_DIRECTORY`
- `MAILOZAURR_SECRET_DIRECTORY`
- `MAILOZAURR_DRAFT_DIRECTORY`
- `MAILOZAURR_ACTION_PLAN_DIRECTORY`
The CLI also supports per-run overrides:
- `--profiles-dir`
- `--secrets-dir`
- `--drafts-dir`
- `--plan-batches-dir`
## CLI usage overview
The executable is built from [Mailozaurr.Cli](../Sources/Mailozaurr.Cli).
To inspect current commands:
```powershell
dotnet run --project Sources/Mailozaurr.Cli -- --help
```
Main command groups:
- `profile ...`
- `draft ...`
- `send ...`
- `queue ...`
- `mail ...`
- `mcp serve`
Most commands support `--json`, which is the preferred mode for automation.
## Common CLI recipes
### Generic IMAP profile
```powershell
mailozaurr profile create --profile work-imap --kind imap --name "Work IMAP" `
--default-mailbox user@example.com `
--setting server=imap.example.com `
--setting port=993 `
--setting userName=user@example.com `
--json
mailozaurr profile set-secret --profile work-imap --name password --value "secret" --json
mailozaurr profile test --profile work-imap --scope mailbox --json
```
### Generic SMTP profile
```powershell
mailozaurr profile create --profile alerts-smtp --kind smtp --name "Alerts SMTP" `
--default-sender alerts@example.com `
--setting server=smtp.example.com `
--setting port=587 `
--setting userName=alerts@example.com `
--setting useSsl=true `
--json
mailozaurr profile set-secret --profile alerts-smtp --name password --value "secret" --json
mailozaurr profile test --profile alerts-smtp --scope send --json
```
### Microsoft Graph profile
```powershell
mailozaurr profile graph-bootstrap --profile work-graph --name "Work Graph" `
--mailbox user@example.com `
--client-id <app-id> `
--tenant-id <tenant-id> `
--client-secret <secret> `
--json
mailozaurr profile auth-status --profile work-graph --json
mailozaurr profile test --profile work-graph --scope mailbox --json
```
### Gmail profile
```powershell
mailozaurr profile gmail-bootstrap --profile personal-gmail --name "Personal Gmail" `
--mailbox user@gmail.com `
--client-id <client-id> `
--client-secret <secret> `
--refresh-token <token> `
--json
mailozaurr profile auth-status --profile personal-gmail --json
mailozaurr profile test --profile personal-gmail --scope mailbox --json
```
### Search and retrieve mail
```powershell
mailozaurr mail folders --profile work-imap --compact --json
mailozaurr mail search --profile work-imap --folder Inbox --query Invoice --compact --json
mailozaurr mail get --profile work-imap --folder Inbox --message-id 123 --compact --json
mailozaurr mail attachments --profile work-imap --folder Inbox --message-id 123 --json
```
### Save drafts and queue sends
```powershell
mailozaurr draft save --draft weekly-update --name "Weekly update" --profile alerts-smtp `
--to team@example.com --subject "Weekly update" --text "Status attached." --json
mailozaurr send --draft weekly-update --json
mailozaurr queue list --compact --json
mailozaurr queue process --json
```
### Preview before destructive actions
```powershell
mailozaurr mail preview-delete --profile work-imap --folder Inbox --message-id 123 --json
mailozaurr mail delete --profile work-imap --folder Inbox --message-id 123 --confirm-token <token> --json
```
## MCP usage overview
The MCP server is hosted by the same executable:
```powershell
mailozaurr mcp serve
```
The MCP tool surface is implemented in [MailMcpTools.cs](../Sources/Mailozaurr.Cli/Mcp/MailMcpTools.cs).
Current tool areas include:
- profile listing, save, delete, bootstrap, login, auth status, and live tests
- folder listing and folder-alias discovery
- search, get, batch get, and attachment save
- drafts, send, and queue operations
- preview and execution for read/flag/move/archive/trash/delete actions
- action-plan import/export, execution, and stored batch management
A minimal MCP client entry looks like:
```json
{
"command": "mailozaurr",
"args": ["mcp", "serve"]
}
```
## PowerShell usage today
PowerShell remains a first-class surface, but it does not use the same profile-oriented headless workflow yet in the same way as the CLI and MCP layers.
Today the best PowerShell references are:
- [README.MD](../README.MD) for module usage and examples
- [OAuthFlows.md](./OAuthFlows.md) for OAuth flows
- [PGP.md](./PGP.md) for PGP support
- the scripts under [Examples](../Examples)
## Recipes and provider-specific guidance
Because Mailozaurr supports many providers and auth stories, examples matter.
When adding a new provider recipe:
- document the minimum profile shape
- show both settings and secrets
- include a live verification command such as `profile test`
- keep reusable logic in shared layers and keep wrapper-specific steps in wrapper docs
If a feature is reusable across CLI, MCP, GUI, or PowerShell, it should follow the placement rules in [Platform-Architecture.md](./Platform-Architecture.md).
================================================
FILE: Docs/OAuthFlows.md
================================================
# OAuth device code and on-behalf-of flows
Mailozaurr can acquire delegated Microsoft Graph tokens using additional OAuth flows.
## Device code authentication
Use `Connect-EmailGraph` with the `-DeviceCode` switch to sign in with a device code. Provide the application ID, tenant ID and scopes.
```powershell
$scopes = @('Mail.ReadWrite','Mail.Send')
$graph = Connect-EmailGraph -ClientId '<app id>' -DirectoryId '<tenant id>' -DeviceCode -Scopes $scopes
```
Follow the instructions printed on the console to complete authentication.
## On-behalf-of token exchange
If you already have a user access token, exchange it for Microsoft Graph scopes using `-OnBehalfOfToken`.
```powershell
$token = Get-Content -Raw '.\UserToken.txt'
$graph = Connect-EmailGraph -ClientId '<app id>' -ClientSecret '<secret>' -DirectoryId '<tenant id>' `
-OnBehalfOfToken $token -Scopes $scopes
```
Both methods return a `GraphConnectionInfo` object with the OAuth credential available in the `OAuthCredential` property.
================================================
FILE: Docs/PGP.md
================================================
# PGP Support in Mailozaurr
Mailozaurr is able to sign and encrypt messages using OpenPGP. The implementation relies on [`MimeKit`](https://github.com/jstedfast/MimeKit) and a temporary key store so that no permanent changes are made to the user's environment.
## Ephemeral key store
The `EphemeralOpenPgpContext` class creates a temporary directory that is removed when the context is disposed. It inherits from `GnuPGContext` and is used internally by the SMTP helper methods when signing or encrypting with PGP.
```csharp
using var ctx = new EphemeralOpenPgpContext();
// import keys and use ctx for signing or encryption
```
## Sending a PGP encrypted message
Use `Send-EmailMessage` with the `PgpSignAndEncrypt` option. Provide paths to the public and private key files and the password protecting the private key:
```powershell
$pub = 'Examples/PGPKeys/mimekit.gpg.pub'
$sec = 'Examples/PGPKeys/mimekit.gpg.sec'
Send-EmailMessage -From 'mimekit@example.com' -To 'mimekit@example.com' \
-Server 'smtp.example.com' -Port 25 -Body 'Test' -Subject 'Test' \
-SignOrEncrypt PgpSignAndEncrypt -PublicKeyPath $pub -PrivateKeyPath $sec \
-PrivateKeyPassword 'no.secret'
```
The message will be signed and encrypted before being sent.
================================================
FILE: Docs/Platform-Architecture.md
================================================
# Mailozaurr Platform Architecture
This document defines how Mailozaurr should evolve across its library, PowerShell, CLI, MCP, and GUI surfaces.
The main goal is reuse. If a new capability can be shared by more than one surface, it should not be implemented only in a wrapper. It should live in the reusable layer and be consumed by wrappers.
## Goals
- Keep one canonical implementation of reusable mail behavior.
- Avoid duplicating business logic across PowerShell, CLI, MCP, GUI, and ad hoc examples.
- Support provider differences without forcing a fake one-size-fits-all abstraction.
- Make new work easier to place correctly.
- Keep public surfaces consistent in naming, behavior, and safety rules.
## Product Surfaces
Mailozaurr should be treated as one platform with multiple front doors:
- `Mailozaurr`: reusable .NET library and provider engine
- `Mailozaurr.PowerShell`: PowerShell adapter
- `mailozaurr`: cross-platform CLI
- `mailozaurr mcp serve`: MCP server mode
- Desktop/GUI apps built on the same core concepts
These are not separate products with separate logic. They are adapters over shared capabilities.
## Target Layering
The preferred long-term structure is:
- `Mailozaurr`
- `Mailozaurr.Application`
- `Mailozaurr.PowerShell`
- `Mailozaurr.Cli`
- `Mailozaurr.Mcp`
- Desktop/GUI app projects
### Layer Responsibilities
`Mailozaurr`
- Provider and protocol implementations
- SMTP, IMAP, POP3, Graph, Gmail, SendGrid, Mailgun, SES support
- Authentication primitives and provider clients
- Message parsing, conversion, attachments, transport rules
- Reusable send, search, fetch, save, move, mark, delete logic
- Reusable queue and pending-message primitives
- Provider-specific models and helpers
`Mailozaurr.Application`
- Cross-surface workflows and orchestration
- Profile store and profile validation
- Secret and token orchestration
- Session management
- Capability discovery
- Normalized DTOs used by CLI, MCP, GUI, and optionally PowerShell
- Safe send, queue, draft, delete, and move workflows
- Audit and operation result models
`Mailozaurr.PowerShell`
- Cmdlet binding and parameter mapping
- PowerShell pipeline and `ShouldProcess` integration
- Formatting and help metadata
- PowerShell-only compatibility behaviors
`Mailozaurr.Cli`
- Command parsing
- Human-readable output
- JSON output
- Exit codes
`Mailozaurr.Mcp`
- MCP transport and tool registration
- Tool schema definitions
- Mapping tool calls to application services
GUI projects
- View models, UI state, platform integration
- Human-first flows for accounts, mailbox browsing, drafts, and queue review
## Reuse Rules
These rules should be used when deciding where new work belongs.
### Rule 1
If logic is reusable by more than one surface, it should not be implemented only in PowerShell, CLI, MCP, or GUI code.
It should be placed in:
- `Mailozaurr` when it is protocol/provider behavior or reusable low-level mail functionality
- `Mailozaurr.Application` when it is a cross-surface workflow, orchestration rule, normalized DTO, or policy
### Rule 2
Wrappers should adapt, not own business logic.
PowerShell, CLI, MCP, and GUI layers should translate user intent into calls to shared services. They should not each reinvent send/search/profile behavior.
### Rule 3
Provider-neutral concepts should be shared. Provider-specific concepts should remain explicit.
Do not force every provider to look identical. Instead:
- share common operations such as search, get message, save attachment, draft, queue, send, mark, move, delete
- keep provider-specific operations explicit, such as Graph inbox rules, Graph events, Gmail threads, Gmail labels, IMAP IDLE behavior, and POP3 limitations
### Rule 4
A wrapper-only implementation is acceptable only when the behavior is genuinely wrapper-specific.
Examples:
- PowerShell parameter sets and pipeline binding belong in `Mailozaurr.PowerShell`
- CLI help text and shell-friendly formatting belong in `Mailozaurr.Cli`
- MCP tool schemas belong in `Mailozaurr.Mcp`
- GUI dialogs, views, and local UX behavior belong in the GUI project
## Feature Placement Guide
Use this checklist when adding a new feature.
Place it in `Mailozaurr` if it is:
- a provider client enhancement
- a reusable transport or mailbox operation
- message parsing, attachment, MIME, cryptography, or auth logic
- reusable folder/message/provider helpers
- reusable pending-message or send pipeline logic
Place it in `Mailozaurr.Application` if it is:
- a profile concept shared by multiple front ends
- a cross-provider workflow
- a capability model
- a normalized DTO for message summaries/details
- a queue or draft workflow shared by CLI, MCP, GUI, or PowerShell
- a safety policy for destructive operations or sending
- an operation result or audit event that more than one surface should use
Place it in `Mailozaurr.PowerShell` if it is:
- cmdlet syntax
- PowerShell-specific validation and parameter shaping
- `ShouldProcess`, verbose output, pipeline behavior, and formatting
Place it in `Mailozaurr.Cli` if it is:
- command syntax
- argument parsing
- console output formatting
- shell completion and exit code concerns
Place it in `Mailozaurr.Mcp` if it is:
- MCP server bootstrapping
- tool declaration and transport behavior
- mapping between tool requests and application services
Place it in the GUI project if it is:
- view logic
- window/dialog composition
- UI state management
- platform-specific desktop integration
## Canonical Shared Concepts
The following concepts should use consistent naming across all surfaces:
- `Profile`
- `ProfileCapabilities`
- `FolderRef`
- `MailboxRef`
- `MessageSummary`
- `MessageDetail`
- `AttachmentSummary`
- `DraftMessage`
- `QueuedMessage`
- `SendResult`
- `OperationResult`
The same concept should not have different names in different surfaces unless there is a compelling reason.
## Provider Capability Model
Mailozaurr should be designed around capabilities, not around the assumption that every provider supports the same things.
### Common Capability Areas
- read/search messages
- list folders or mailbox containers
- get message details
- save attachments
- mark/move/delete messages
- send messages
- wait/listen for new messages
### Provider Notes
- IMAP: strong mailbox support, folders, flags, move, search, and wait/idle patterns
- POP3: limited mailbox model, fetch/search/delete style workflows, no real folder story
- Graph: rich mailbox and send support, plus rules, events, and permissions
- Gmail API: mailbox and send support with Gmail-specific thread and label behavior
- SMTP: send only, not mailbox browsing
- SendGrid/Mailgun/SES: send only, provider-specific sending features
The shared layers should expose common operations where they exist and explicit provider extensions where they do not.
## Profiles and Sessions
Future work should prefer explicit profiles over implicit global sessions.
Profiles should store:
- provider type
- display name
- server or tenant settings
- auth mode
- sender defaults where relevant
- mailbox defaults where relevant
- non-secret metadata in config
- secrets in secure OS-backed storage where possible
Wrappers should not rely on hidden global state when a profile or explicit handle can be used instead.
## Safety Rules
Safety behavior should be shared, not reimplemented separately in each surface.
Preferred defaults:
- drafts before send when practical
- queue-first sending for automation and agents
- explicit confirmation for destructive actions
- provider-limit validation before send
- dry-run support where possible
- reusable audit and logging models
## CLI and MCP Design Direction
The CLI and MCP server should be thin adapters over shared services.
The recommended shape is:
- CLI for human and automation use
- MCP as a structured tool surface over the same workflows
- one executable host eventually able to run both normal CLI commands and `mcp serve`
This avoids duplicating logic and gives one headless contract for the ecosystem.
## Skills
Skills should be treated as reusable agent guidance, not as a replacement for shared Mailozaurr capabilities.
The preferred split is:
- `MCP` exposes executable tools over shared Mailozaurr services
- `skills` teach agents how to use those tools safely and consistently
Examples of skill responsibilities:
- when to prefer drafts over immediate send
- when to use queue-first sending
- how to summarize before delete/move
- how to select compact versus rich read surfaces
Examples of non-skill responsibilities:
- mailbox search logic
- message retrieval
- attachment saving
- queue processing
- provider auth/session behavior
Those belong in shared code, not only in prompt guidance.
## HTML Body Projection Roadmap
Mailozaurr should eventually support reusable HTML body projection for non-PowerShell headless surfaces, especially CLI and MCP.
The recommended split is:
- keep raw provider body retrieval in `Mailozaurr`
- place body projection abstractions and policies in `Mailozaurr.Application`
- keep PowerShell dependency-light by default
- document PowerShell recipes for richer HTML handling instead of forcing heavy dependencies into the module
### Recommended integration model
- `CLI` / `MCP`
Add optional shared HTML-to-Markdown projection via `OfficeIMO.Markdown.Html`
- `PowerShell`
Keep raw body access in the Mailozaurr module
Show examples using `PSWriteOffice` / `OfficeIMO.Markdown.Html` for Markdown projection
Show examples using `PSParseHTML` for DOM-style extraction and structured data recovery
### Placement rule
If HTML-to-Markdown projection becomes reusable across CLI, MCP, GUI, or plain C# consumers, the abstraction belongs in shared Mailozaurr layers.
If a PowerShell workflow only demonstrates how to pipe a retrieved HTML body into another module, that belongs in documentation/examples, not in the core Mailozaurr PowerShell adapter by default.
## Migration Guidance
Not every existing area must be refactored immediately.
When touching an existing feature:
1. Keep behavior working.
2. Extract reusable logic into `Mailozaurr` or `Mailozaurr.Application` when the change naturally allows it.
3. Leave only surface-specific adaptation in PowerShell, CLI, MCP, or GUI code.
Incremental improvement is preferred over a disruptive rewrite.
## Decision Rule for New Work
Before adding code, ask:
1. Is this reusable outside the current wrapper?
2. Is it protocol/provider logic or workflow/orchestration logic?
3. Will CLI, MCP, GUI, PowerShell, or plain C# users eventually want the same behavior?
If the answer to reuse is yes, the default destination should be a shared layer, not the wrapper.
## Working Principle
Mailozaurr should have one core behavior model with many adapters, not many implementations with similar names.
That principle should guide future CLI, MCP, GUI, PowerShell, and library work.
================================================
FILE: Examples/Example-AcquireGoogleTokenInteractive.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$GmailAccount = 'user@gmail.com'
$ClientID = 'Your-Client-ID'
$ClientSecret = Read-Host 'Google client secret' -AsSecureString
$Scopes = @('https://mail.google.com/')
$Credential = Connect-OAuthGoogle -GmailAccount $GmailAccount -ClientID $ClientID -ClientSecretSecureString $ClientSecret -Scope $Scopes
$CredInfo = ConvertFrom-OAuth2Credential -Credential $Credential
$CredInfo | Format-List
# Send a test email using the token
Send-EmailMessage -From $GmailAccount -To 'recipient@example.com' `
-Server 'smtp.gmail.com' -Subject 'Test OAuth email' -Text 'Hello' `
-SecureSocketOptions Auto -Credential $Credential -OAuth2
# Connect to Gmail via IMAP
$ImapClient = Connect-IMAP -Server 'imap.gmail.com' -Port 993 -Options Auto `
-Credential $Credential -OAuth2
Get-IMAPFolder -Client $ImapClient -Verbose
Disconnect-IMAP -Client $ImapClient
# And POP3
$PopClient = Connect-POP3 -Server 'pop.gmail.com' -Port 995 -Options Auto `
-Credential $Credential -OAuth2
Disconnect-POP3 -Client $PopClient
================================================
FILE: Examples/Example-AcquireO365TokenInteractive.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$Login = 'user@example.com'
$ClientID = 'Your-Application-ID'
$TenantID = 'Your-Tenant-ID'
$RedirectUri = 'https://login.microsoftonline.com/common/oauth2/nativeclient'
$Scopes = @(
'email',
'offline_access',
'https://outlook.office.com/IMAP.AccessAsUser.All',
'https://outlook.office.com/POP.AccessAsUser.All',
'https://outlook.office.com/SMTP.Send'
)
$Credential = Connect-OAuthO365 -Login $Login -ClientID $ClientID -TenantID $TenantID -RedirectUri $RedirectUri -Scopes $Scopes
$CredInfo = ConvertFrom-OAuth2Credential -Credential $Credential
$CredInfo | Format-List
# Use the OAuth token to send mail via SMTP
Send-EmailMessage -From $Login -To 'recipient@example.com' `
-Server 'smtp.office365.com' -Subject 'Test OAuth email' -Text 'Hello' `
-SecureSocketOptions Auto -Credential $Credential -OAuth2
# Use the same credential with IMAP
$ImapClient = Connect-IMAP -Server 'outlook.office365.com' -Port 993 -Options Auto `
-Credential $Credential -OAuth2
Get-IMAPFolder -Client $ImapClient -Verbose
Disconnect-IMAP -Client $ImapClient
# And with POP3
$PopClient = Connect-POP3 -Server 'outlook.office365.com' -Port 995 -Options Auto `
-Credential $Credential -OAuth2
Disconnect-POP3 -Client $PopClient
================================================
FILE: Examples/Example-ClearGraphJunk.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$graph = Connect-EmailGraph -ClientId 'id' -DirectoryId 'tenant' -ClientSecretSecretName 'graph-client-secret' -ClientSecretVaultName 'MailSecrets'
$graph | Out-Null
# Example 1: remove everything from junk
Clear-GraphJunk -UserPrincipalName 'user@example.com' -Connection $graph
# Example 2: preview cleanup using -Preview
Clear-GraphJunk -UserPrincipalName 'user@example.com' -Connection $graph -Preview
# Example 3: simulate cleanup with -WhatIf
Clear-GraphJunk -UserPrincipalName 'user@example.com' -Connection $graph -WhatIf
# Example 4: skip messages from a sender
Clear-GraphJunk -UserPrincipalName 'user@example.com' -Connection $graph -SkipFrom 'boss@example.com'
# Example 5: skip messages sent to a specific recipient
Clear-GraphJunk -UserPrincipalName 'user@example.com' -Connection $graph -SkipTo 'reports@example.com'
# Example 6: skip messages containing a subject keyword
Clear-GraphJunk -UserPrincipalName 'user@example.com' -Connection $graph -SkipSubjectContains 'VIP'
# Example 7: skip specific message IDs
Clear-GraphJunk -UserPrincipalName 'user@example.com' -Connection $graph -SkipId '1','2','3'
# Example 8: combine multiple skip filters
Clear-GraphJunk -UserPrincipalName 'user@example.com' -Connection $graph -SkipFrom 'boss@example.com' -SkipSubjectContains 'Important'
# Example 9: skip messages that have any attachment
Clear-GraphJunk -UserPrincipalName 'user@example.com' -Connection $graph -SkipHasAttachment
# Example 10: skip messages containing PDF attachments
Clear-GraphJunk -UserPrincipalName 'user@example.com' -Connection $graph -SkipAttachmentExtension 'pdf'
# Example 11: preview with additional properties
Clear-GraphJunk -UserPrincipalName 'user@example.com' -Connection $graph -Preview -Property subject,from
# Example 12: clean junk via raw Graph requests
Clear-GraphJunk -UserPrincipalName 'user@example.com' -MgGraphRequest
Disconnect-EmailGraph
================================================
FILE: Examples/Example-ClearImapJunk.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$cred = Get-Credential
$imap = Connect-IMAP -Server 'imap.example.com' -Credential $cred -Port 993 -Options Auto
# Example 1: clear default junk folder
Clear-IMAPJunk -Client $imap
# Example 2: preview messages instead of removing them
Clear-IMAPJunk -Client $imap -Preview
# Example 3: simulate cleanup with -WhatIf
Clear-IMAPJunk -Client $imap -WhatIf
# Example 4: skip messages from specific sender
Clear-IMAPJunk -Client $imap -SkipFrom 'boss@example.com'
# Example 5: skip messages sent to a recipient
Clear-IMAPJunk -Client $imap -SkipTo 'reports@example.com'
# Example 6: skip messages containing subject keyword
Clear-IMAPJunk -Client $imap -SkipSubjectContains 'Important'
# Example 7: skip messages with given IDs
Clear-IMAPJunk -Client $imap -SkipMessageId '<id1@example.com>','<id2@example.com>'
# Example 8: skip messages with given UIDs
Clear-IMAPJunk -Client $imap -SkipUid 1000,1001
# Example 9: skip messages that have attachments
Clear-IMAPJunk -Client $imap -SkipHasAttachment
# Example 10: skip messages containing ZIP attachments
Clear-IMAPJunk -Client $imap -SkipAttachmentExtension 'zip'
# Example 11: combine multiple skip options
Clear-IMAPJunk -Client $imap -SkipFrom 'boss@example.com' -SkipSubjectContains 'Internal'
# Example 12: clear a custom junk folder
Clear-IMAPJunk -Client $imap -Folder 'Spam/Junk'
Disconnect-IMAP -Client $imap
================================================
FILE: Examples/Example-ConnecToImap-01.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$UserName = 'email@gmail.com'
$Password = ''
$Client = Connect-IMAP -Server 'imap.gmail.com' -Password $Password -UserName $UserName -Port 993 -Options Auto
Get-IMAPFolder -Client $Client -Verbose
Get-IMAPMessage -Client $Client -FromContains 'contoso.com' -HasAttachment
Disconnect-IMAP -Client $Client
================================================
FILE: Examples/Example-ConnecToImap-02.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$Credential = Get-Credential
$Client = Connect-IMAP -Server 'imap.gmail.com' -Credential $Credential -Port 993 -Options Auto
Get-IMAPFolder -Client $Client -Verbose
Get-IMAPMessage -Client $Client -Subject 'Alert' -Since (Get-Date).AddDays(-1)
Disconnect-IMAP -Client $Client
================================================
FILE: Examples/Example-ConnecToImap-03-oAuth.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$ClientID = '9393330741'
$ClientSecret = 'gk2ztAGU'
$oAuth2 = Connect-OAuthGoogle -ClientID $ClientID -ClientSecret $ClientSecret -GmailAccount 'evotectest@gmail.com' -Scope https://mail.google.com/
$Client = Connect-IMAP -Server 'imap.gmail.com' -Port 993 -Options Auto -Credential $oAuth2 -OAuth2
Get-IMAPFolder -Client $Client -Verbose
# Delete messages from a specific sender using OAuth authentication
Get-IMAPMessage -Client $Client -FromContains 'alerts@example.com' -Since (Get-Date).AddDays(-7) -Delete
Disconnect-IMAP -Client $Client -Verbose
================================================
FILE: Examples/Example-ConnecToPop3-01.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$UserName = 'Test@gmail.com'
$Password = 'TextPassword'
$Client = Connect-POP3 -Server 'pop.gmail.com' -Password $Password -UserName $UserName -Port 995 -Options Auto
Get-POP3Message -Client $Client -Subject 'Report' -Since (Get-Date).AddDays(-7)
Save-POP3Message -Client $Client -Index 6 -Path "$Env:UserProfile\Desktop\mail.eml"
Save-POP3Message -Client $Client -Index 6 -Path "$Env:UserProfile\Desktop\mail.msg"
Disconnect-POP3 -Client $Client
================================================
FILE: Examples/Example-ConnecToPop3-02.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$Credentials = Get-Credential
$Client = Connect-POP3 -Server 'pop.gmail.com' -Credential $Credentials -Port 995 -Options Auto
Get-POP3Message -Client $Client -FromContains 'contoso.com' -Priority High | Format-Table
Save-POP3Message -Client $Client -Index 6 -Path "$Env:UserProfile\Desktop\mail.eml"
Save-POP3Message -Client $Client -Index 6 -Path "$Env:UserProfile\Desktop\mail.msg"
Disconnect-POP3 -Client $Client
================================================
FILE: Examples/Example-ConnecToPop3-03-oAuth.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$ClientID = '93933307418'
$ClientSecret = 'gk2ztAG'
$oAuth2 = Connect-OAuthGoogle -ClientID $ClientID -ClientSecret $ClientSecret -GmailAccount 'email@gmail.com' -Scope https://mail.google.com/
$Client = Connect-POP3 -Server 'pop.gmail.com' -Credential $oAuth2 -Port 995 -Options Auto -OAuth2
Get-POP3Message -Client $Client -ToContains 'sales@example.com' -HasAttachment | Format-Table
Save-POP3Message -Client $Client -Index 7 -Path "$Env:UserProfile\Desktop\mail7.eml"
Save-POP3Message -Client $Client -Index 7 -Path "$Env:UserProfile\Desktop\mail7.msg"
Disconnect-POP3 -Client $Client -Verbose
================================================
FILE: Examples/Example-ConnectEmailGraph-DeviceCode.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$ClientId = 'Your-Application-ID'
$TenantId = 'Your-Tenant-ID'
$Scopes = @('Mail.ReadWrite','Mail.Send')
# Authenticate using device code flow
$graph = Connect-EmailGraph -ClientId $ClientId -DirectoryId $TenantId -DeviceCode -Scopes $Scopes -MaxConcurrentRequests 10
$graph
================================================
FILE: Examples/Example-ConnectEmailGraph-OnBehalfOf.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$ClientId = 'Your-Application-ID'
$TenantId = 'Your-Tenant-ID'
$ClientSecret = 'Your-Client-Secret'
$UserToken = Get-Content -Raw -Path './UserToken.txt'
$Scopes = @('Mail.ReadWrite','Mail.Send')
# Exchange existing token for Graph access
$graph = Connect-EmailGraph -ClientId $ClientId -ClientSecret $ClientSecret -DirectoryId $TenantId `
-OnBehalfOfToken $UserToken -Scopes $Scopes
$graph
================================================
FILE: Examples/Example-ConvertFromEmlToMsg.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$Conversion = ConvertFrom-EmlToMsg -InputPath "$PSScriptRoot\Input\Sample.eml" -OutputFolder "$PSScriptRoot\Output" -Verbose -Force
$Conversion | Format-Table
if ($Conversion.Status) {
$Msg = Import-MailFile -FilePath $Conversion.MsgFile
$Msg | Format-Table
$Msg.Dispose()
}
================================================
FILE: Examples/Example-DeleteImapMessages.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$Credential = Get-Credential
$Client = Connect-IMAP -Server 'imap.example.com' -Credential $Credential -Port 993 -Options Auto
# Delete messages from the last week containing "Report" in the subject
Get-IMAPMessage -Client $Client -Subject 'Report' -Since (Get-Date).AddDays(-7) -Delete
Disconnect-IMAP -Client $Client
================================================
FILE: Examples/Example-DeletePop3Messages.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$credential = Get-Credential
$client = Connect-POP3 -Server 'pop.example.com' -Credential $credential -Port 995 -Options Auto
# Delete messages older than 30 days that contain "Report" in the subject
Get-POP3Message -Client $client -Subject 'Report' -Before (Get-Date).AddDays(-30) -Delete
Disconnect-POP3 -Client $client
================================================
FILE: Examples/Example-EmailPendingMessages.ps1
================================================
$pending = Join-Path $PSScriptRoot 'pending'
# Existing pending queues created prior to credential protection will still replay,
# and the entries will be re-encrypted with the new protector the next time they are
# saved by the module (for example, after another delivery attempt).
# Review queued messages
Get-EmailPendingMessage -PendingMessagesPath $pending
# Replay messages. Server details and credentials are taken from
# the pending log so each message is sent using its original
# configuration, allowing mixed servers in a single file.
Send-EmailPendingMessage -PendingMessagesPath $pending
# Replay a specific message (and optionally restrict to a provider)
# $id = 'message-id'
# Send-EmailPendingMessage -PendingMessagesPath $pending -MessageId $id -Provider None
# Remove a specific message by ID
# Remove-EmailPendingMessage -PendingMessagesPath $pending -MessageId $id
================================================
FILE: Examples/Example-ExtractLocalImagePaths.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$tmp = New-TemporaryFile
Set-Content -Path $tmp -Value "data"
$html = "<img src='$tmp'><p>$tmp</p>"
$result = [Mailozaurr.HtmlUtils]::ExtractLocalImagePaths($html)
$result.Html
$result.Paths
Remove-Item $tmp
================================================
FILE: Examples/Example-ForwardMessageAttachmentFiltered.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
# Forward IMAP messages without attachments
$imapCred = Get-Credential
$imap = Connect-IMAP -Server 'imap.example.com' -Credential $imapCred -Port 993 -Options Auto
Get-IMAPMessage -Client $imap -FromContains 'reports@example.com' -HasAttachment |
ForEach-Object {
$forward = $_.MimeMessage | Remove-IMAPMessageAttachment
Send-EmailMessage -From 'forwarder@example.com' -To 'team@example.com' -Subject $_.MimeMessage.Subject -Message $forward -Server 'smtp.example.com' -Port 25 -WhatIf
}
Disconnect-IMAP -Client $imap
# Forward POP3 messages without attachments
$popCred = Get-Credential
$pop = Connect-POP3 -Server 'pop.example.com' -Credential $popCred -Port 995 -Options Auto
Get-POP3Message -Client $pop -Subject 'Alert' -HasAttachment |
ForEach-Object {
$forward = $_.MimeMessage | Remove-POP3MessageAttachment
Send-EmailMessage -From 'forwarder@example.com' -To 'team@example.com' -Subject $_.MimeMessage.Subject -Message $forward -Server 'smtp.example.com' -Port 25 -WhatIf
}
Disconnect-POP3 -Client $pop
# Forward Microsoft Graph messages without attachments
$ClientId = 'your-client-id'
$ClientSecret = 'your-client-secret'
$TenantId = 'your-tenant-id'
$graphCred = ConvertTo-GraphCredential -ClientId $ClientId -ClientSecret $ClientSecret -DirectoryId $TenantId
Connect-EmailGraph -Credential $graphCred | Out-Null
Get-EmailGraphMessage -UserPrincipalName 'user@example.com' -Filter "hasAttachments eq true" -Limit 5 |
ForEach-Object {
$forward = Remove-GraphMessageAttachment -Message $_
Send-EmailMessage -From 'forwarder@example.com' -To 'team@example.com' `
-Subject $forward.Subject -Body $forward.Body.Content -Graph -Credential $graphCred -WhatIf
}
Disconnect-EmailGraph
================================================
FILE: Examples/Example-GetEmailDeliveryMatch.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
# Correlate non-delivery reports with sent messages
$repo = [Mailozaurr.FileSentMessageRepository]::new("$env:TEMP\sendlog.json")
$resolver = [Mailozaurr.SendLogResolver]::new($repo)
Connect-IMAP -Server 'imap.example.com' -Credential (Get-Credential) | Out-Null
Get-EmailDeliveryMatch -Protocol Imap -Resolver $resolver -Recipient 'user@contoso.com'
Disconnect-IMAP
================================================
FILE: Examples/Example-GetEmailDeliveryStatus.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
# Search recent non-delivery reports via IMAP
Connect-IMAP -Server 'imap.example.com' -Credential (Get-Credential) | Out-Null
Get-EmailDeliveryStatus -Protocol Imap -Recipient 'user@contoso.com' -Since (Get-Date).AddDays(-7) -ParallelDownloadLimit 8
Disconnect-IMAP
================================================
FILE: Examples/Example-GetGraphDmarcReport.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$ClientId = 'Your-Application-ID'
$TenantId = 'Your-Tenant-ID'
$Scopes = @('Mail.Read')
Connect-EmailGraph -ClientId $ClientId -DirectoryId $TenantId -DeviceCode -Scopes $Scopes | Out-Null
Get-DmarcReport -Protocol Graph -UserPrincipalName 'user@example.com' -Since (Get-Date).AddDays(-7) |
ForEach-Object {
foreach ($att in $_.Attachments) {
# Pass the zipped XML stream to Domain Detective for analysis
# Invoke-DomainDetective -InputStream $att.Content -Name $att.Name
}
}
Disconnect-EmailGraph
================================================
FILE: Examples/Example-GetGraphEvent.ps1
================================================
# Retrieve upcoming events for a user
$cred = Connect-EmailGraph -ClientId 'client' -TenantId 'tenant' -ClientSecret 'secret'
Get-GraphEvent -UserPrincipalName 'user@example.com' -Connection $cred -Limit 5
================================================
FILE: Examples/Example-GetGraphMailboxStatistics-Console.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$graph = Connect-EmailGraph -ClientId 'id' -DirectoryId 'tenant' -ClientSecretSecretName 'graph-client-secret' -ClientSecretVaultName 'MailSecrets'
$stats = Get-GraphMailboxStatistics -UserPrincipalName 'user@example.com' -Connection $graph
$stats | Format-List
foreach ($folder in $stats.FolderStatistics) {
"{0,-30} {1,5} unread: {2,5}" -f $folder.DisplayName, $folder.TotalItemCount, $folder.UnreadItemCount
}
================================================
FILE: Examples/Example-GetGraphMailboxStatistics.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$graph = Connect-EmailGraph -ClientId 'id' -DirectoryId 'tenant' -ClientSecretSecretName 'graph-client-secret' -ClientSecretVaultName 'MailSecrets'
Get-GraphMailboxStatistics -UserPrincipalName 'user@example.com' -Connection $graph |
Select-Object UserPrincipalName, MessageCount, MessagesWithAttachments, TotalAttachmentSize, TotalFolders, FolderStatistics |
Export-Csv -NoTypeInformation 'mailbox-stats.csv'
================================================
FILE: Examples/Example-GetImapDmarcReport.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
Connect-IMAP -Server 'imap.example.com' -Credential (Get-Credential) | Out-Null
Get-DmarcReport -Protocol Imap -Folder 'INBOX' -Since (Get-Date).AddDays(-7) |
ForEach-Object {
foreach ($att in $_.Attachments) {
# Pass the zipped XML stream to Domain Detective for analysis
# Invoke-DomainDetective -InputStream $att.Content -Name $att.Name
}
}
Disconnect-IMAP
================================================
FILE: Examples/Example-GetMailFolder.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
# using application permissions
$ClientId = 'your-client-id'
$ClientSecret = 'your-client-secret'
$TenantId = 'your-tenant-id'
$cred = ConvertTo-GraphCredential -ClientId $ClientId -ClientSecret $ClientSecret -DirectoryId $TenantId
Connect-EmailGraph -Credential $cred | Out-Null
Get-EmailGraphFolder -UserPrincipalName 'user@example.com'
Disconnect-EmailGraph
# using Connect-MgGraph
Import-Module Microsoft.Graph.Authentication -Force
Connect-MgGraph -Scopes Mail.Read -NoWelcome
Get-EmailGraphFolder -UserPrincipalName 'user@example.com' -MgGraphRequest
================================================
FILE: Examples/Example-GetPop3DmarcReport.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
Connect-POP3 -Server 'pop3.example.com' -Credential (Get-Credential) | Out-Null
Get-DmarcReport -Protocol Pop3 -Since (Get-Date).AddDays(-7) |
ForEach-Object {
foreach ($att in $_.Attachments) {
# Pass the zipped XML stream to Domain Detective for analysis
# Invoke-DomainDetective -InputStream $att.Content -Name $att.Name
}
}
Disconnect-POP3
================================================
FILE: Examples/Example-GmailApi-01-OAuth.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
# Connect-OAuthGoogle launches a browser sign-in flow and returns a credential with the acquired token
$clientSecret = Read-Host 'Google client secret' -AsSecureString
$oauthCred = Connect-OAuthGoogle -GmailAccount 'user@gmail.com' -ClientID 'id' -ClientSecretSecureString $clientSecret -Scope https://mail.google.com/
# If you already obtained an access token elsewhere, ConvertTo-OAuth2Credential wraps it as a PSCredential
$accessToken = Read-Host 'OAuth access token' -AsSecureString
$tokenCred = ConvertTo-OAuth2Credential -UserName 'user@gmail.com' -TokenSecureString $accessToken
$oauthCred
$tokenCred
================================================
FILE: Examples/Example-GmailApi-02-SendMessage.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$cred = ConvertTo-OAuth2Credential -UserName 'user@gmail.com' -Token 'access_token'
Send-GmailMessage -GmailAccount 'user@gmail.com' -Credential $cred `
-From 'user@gmail.com' -To 'recipient@example.com' `
-Subject 'Test API message' -TextBody 'Hello from Gmail API'
================================================
FILE: Examples/Example-GmailApi-03-SendEmailMessageProvider.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$cred = ConvertTo-OAuth2Credential -UserName 'user@gmail.com' -Token 'access_token'
Send-EmailMessage -EmailProvider Gmail -GmailAccount 'user@gmail.com' `
-From 'user@gmail.com' -To 'recipient@example.com' -Credential $cred \
-Subject 'Provider example' -Body 'Sent via Send-EmailMessage'
================================================
FILE: Examples/Example-GmailApi-04-ListMessages.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$cred = ConvertTo-OAuth2Credential -UserName 'user@gmail.com' -Token 'access_token'
# List last 5 unread alerts
Get-GmailMessage -GmailAccount 'user@gmail.com' -Credential $cred `
-Query 'from:alerts@example.com is:unread' -MaxResults 5
================================================
FILE: Examples/Example-GmailApi-05-GetMessage.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$cred = ConvertTo-OAuth2Credential -UserName 'user@gmail.com' -Token 'access_token'
# Retrieve a single message by id and save it
$msg = Get-GmailMessage -GmailAccount 'user@gmail.com' -Credential $cred -Id 'abcd1234'
$msg.Raw | Out-File "$Env:TEMP/message.eml"
================================================
FILE: Examples/Example-GmailApi-06-SaveAttachments.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$cred = ConvertTo-OAuth2Credential -UserName 'user@gmail.com' -Token 'access_token'
Save-GmailMessageAttachment -GmailAccount 'user@gmail.com' -Credential $cred -Id 'abcd1234' -Path $Env:TEMP
================================================
FILE: Examples/Example-GmailApi-07-DeleteMessage.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$cred = ConvertTo-OAuth2Credential -UserName 'user@gmail.com' -Token 'access_token'
Remove-GmailMessage -GmailAccount 'user@gmail.com' -Credential $cred -Id 'abcd1234' -Confirm:$false
================================================
FILE: Examples/Example-GmailApi-08-FilterAndDelete.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$cred = ConvertTo-OAuth2Credential -UserName 'user@gmail.com' -Token 'access_token'
$messages = Get-GmailMessage -GmailAccount 'user@gmail.com' -Credential $cred `
-Query 'subject:"Report" older_than:7d'
foreach ($m in $messages) {
Remove-GmailMessage -GmailAccount 'user@gmail.com' -Credential $cred -Id $m.Id
}
================================================
FILE: Examples/Example-GmailApi-09-DownloadAttachments.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$cred = ConvertTo-OAuth2Credential -UserName 'user@gmail.com' -Token 'access_token'
$messages = Get-GmailMessage -GmailAccount 'user@gmail.com' -Credential $cred `
-Query 'has:attachment newer_than:1d'
foreach ($m in $messages) {
Save-GmailMessageAttachment -GmailAccount 'user@gmail.com' -Credential $cred -Id $m.Id -Path $Env:TEMP
}
================================================
FILE: Examples/Example-GmailApi-10-SendWithAttachment.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$cred = ConvertTo-OAuth2Credential -UserName 'user@gmail.com' -Token 'access_token'
Send-GmailMessage -GmailAccount 'user@gmail.com' -Credential $cred `
-From 'user@gmail.com' -To 'recipient@example.com' `
-Subject 'Report' -TextBody 'See attached file' -Attachment 'C:\Temp\report.txt'
================================================
FILE: Examples/Example-GmailApi-11-ListThreads.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$cred = ConvertTo-OAuth2Credential -UserName 'user@gmail.com' -Token 'access_token'
# List last 5 threads with alerts
Get-GmailThread -GmailAccount 'user@gmail.com' -Credential $cred `
-Query 'from:alerts@example.com' -MaxResults 5
================================================
FILE: Examples/Example-GmailApi-12-GetThread.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$cred = ConvertTo-OAuth2Credential -UserName 'user@gmail.com' -Token 'access_token'
# Retrieve a thread and output snippets
$thread = Get-GmailThread -GmailAccount 'user@gmail.com' -Credential $cred -Id 'threadId'
$thread.Messages | ForEach-Object { $_.Snippet }
================================================
FILE: Examples/Example-GmailApi-13-SendWithHeaders.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$cred = ConvertTo-OAuth2Credential -UserName 'user@gmail.com' -Token 'access_token'
Send-GmailMessage -GmailAccount 'user@gmail.com' -Credential $cred \
-From 'user@gmail.com' -To 'recipient@example.com' \
-Subject 'Test API message with headers' -TextBody 'Hello from Gmail API' \
-Headers @{ 'X-Custom-Header' = 'Value' }
================================================
FILE: Examples/Example-GmailApi-14-SearchNonDeliveryReports.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$cred = ConvertTo-OAuth2Credential -UserName 'user@gmail.com' -Token 'access_token'
# Search for non-delivery reports in Gmail
$reports = Get-EmailDeliveryStatus -Protocol GmailApi -GmailAccount 'user@gmail.com' -Credential $cred -Since (Get-Date).AddDays(-7)
$reports | Format-Table FinalRecipient, OriginalMessageId, Type
================================================
FILE: Examples/Example-GmailApi-15-GetDmarcReport.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$clientSecret = Read-Host 'Google client secret' -AsSecureString
$cred = Connect-OAuthGoogle -GmailAccount 'user@gmail.com' -ClientID 'id' -ClientSecretSecureString $clientSecret -Scope https://mail.google.com/
Get-DmarcReport -Protocol GmailApi -GmailAccount 'user@gmail.com' -Credential $cred -Since (Get-Date).AddDays(-7) |
ForEach-Object {
foreach ($att in $_.Attachments) {
# Pass the zipped XML stream to Domain Detective for analysis
# Invoke-DomainDetective -InputStream $att.Content -Name $att.Name
}
}
================================================
FILE: Examples/Example-GraphMailboxPermissions.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
# Graph application credentials
$ClientId = 'your-client-id'
$ClientSecret = 'your-client-secret'
$TenantId = 'your-tenant-id'
$cred = ConvertTo-GraphCredential -ClientId $ClientId -ClientSecret $ClientSecret -DirectoryId $TenantId
$graph = Connect-EmailGraph -Credential $cred
# Display existing permissions for the mailbox
$perms = Get-GraphMailboxPermission -Connection $graph -UserPrincipalName 'user@example.com'
$perms | Format-Table Id, GrantedTo, Roles
# Grant permissions using typed objects and enum roles
$permissions = @(
New-GraphMailboxPermissionObject -Roles Owner -GrantedToUser 'julia@example.com' -UserPrincipalName 'user@example.com',
New-GraphMailboxPermissionObject -Roles Read -GrantedToUser 'ken@example.com' -UserPrincipalName 'user@example.com'
)
Add-GraphMailboxPermission -Connection $graph -UserPrincipalName 'user@example.com' -MailboxPermission $permissions
# Alternatively build permissions using a builder object
$builder = New-GraphMailboxPermissionBuilder -GrantedToUser 'melanie@example.com' -Roles Write
$permObj = New-GraphMailboxPermissionObject -Builder $builder -UserPrincipalName 'user@example.com'
# Bulk add permissions from CSV (columns should map to Graph permission properties)
Add-GraphMailboxPermission -Connection $graph -UserPrincipalName 'user@example.com' -CsvPath '.\permissions.csv'
# Review permissions after additions
Get-GraphMailboxPermission -Connection $graph -UserPrincipalName 'user@example.com'
# Remove a single permission by id
Remove-GraphMailboxPermission -Connection $graph -UserPrincipalName 'user@example.com' -PermissionId 'permission-id'
# Remove permissions granted to a specific user
Remove-GraphMailboxPermission -Connection $graph -UserPrincipalName 'user@example.com' -GrantedToUser 'ken@example.com'
# Remove all owner permissions
Remove-GraphMailboxPermission -Connection $graph -UserPrincipalName 'user@example.com' -Role Owner
# Advanced: remove using a permission object
($perms)[0].RemoveAsync($graph.Credential) | Out-Null
# Remove multiple permissions from CSV (file requires PermissionId column)
Remove-GraphMailboxPermission -Connection $graph -UserPrincipalName 'user@example.com' -CsvPath '.\permissionsToRemove.csv'
# Using Microsoft.Graph commands directly
Import-Module Microsoft.Graph.Authentication -Force
Connect-MgGraph -Scopes 'Mail.ReadWrite' -NoWelcome
Get-GraphMailboxPermission -UserPrincipalName 'user@example.com' -MgGraphRequest
Disconnect-EmailGraph -Connection $graph
================================================
FILE: Examples/Example-GraphManageMessages.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
# Example: Download attachments and archive the message
$ClientId = 'your-client-id'
$ClientSecret = 'your-client-secret'
$TenantId = 'your-tenant-id'
$cred = ConvertTo-GraphCredential -ClientId $ClientId -ClientSecret $ClientSecret -DirectoryId $TenantId
Connect-EmailGraph -Credential $cred | Out-Null
$messages = Get-EmailGraphMessage -UserPrincipalName 'user@example.com' -Filter "hasAttachments eq true" -Limit 5
foreach ($m in $messages) {
Get-EmailGraphMessageAttachment -UserPrincipalName 'user@example.com' -MessageId $m.Id |
Save-GraphMessageAttachment -Path 'C:\Temp\Attachments'
Set-GraphMessage -UserPrincipalName 'user@example.com' -MessageId $m.Id -Read
Move-GraphMessage -UserPrincipalName 'user@example.com' -MessageId $m.Id -DestinationFolderId 'Archive'
}
Disconnect-EmailGraph
================================================
FILE: Examples/Example-ImapFilterScenarios.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$cred = Get-Credential
$client = Connect-IMAP -Server 'imap.example.com' -Credential $cred -Port 993 -Options Auto
# 1. Find messages with a specific subject
Get-IMAPMessage -Client $client -Subject 'Invoice'
# 2. Messages from a sender in the last 7 days
Get-IMAPMessage -Client $client -FromContains 'alerts@example.com' -Since (Get-Date).AddDays(-7)
# 3. Messages sent to a department mailbox
Get-IMAPMessage -Client $client -ToContains 'sales@example.com'
# 4. High priority messages only
Get-IMAPMessage -Client $client -Priority High
# 5. Messages that have attachments
Get-IMAPMessage -Client $client -HasAttachment
# 6. Delete old reports older than 30 days
Get-IMAPMessage -Client $client -Subject 'Report' -Before (Get-Date).AddDays(-30) -Delete
# 7. Fetch messages by UID range
Get-IMAPMessage -Client $client -UidStart 1 -UidEnd 20
# 8. Fetch messages by sequence numbers
Get-IMAPMessage -Client $client -SequenceStart 1 -SequenceEnd 5
# 9. Messages from the last 24 hours that include attachments
Get-IMAPMessage -Client $client -Since (Get-Date).AddDays(-1) -HasAttachment
# 10. Delete high priority messages from a specific sender
Get-IMAPMessage -Client $client -FromContains 'alerts@example.com' -Priority High -Delete
Disconnect-IMAP -Client $client
================================================
FILE: Examples/Example-ImportMSG.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$Msg = Import-MailFile -FilePath "$PSScriptRoot\Input\TestMessage.msg"
$Msg | Format-Table
$Eml = Import-MailFile -FilePath "$PSScriptRoot\Input\Sample.eml"
$Eml | Format-Table
================================================
FILE: Examples/Example-ListImapFolderContents.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
# Authenticate however you like
$cred = Get-Credential
$client = Connect-IMAP -Server 'imap.example.com' -Credential $cred -Port 993 -Options Auto
# list inbox messages
Get-IMAPFolder -Client $client
Get-IMAPMessage -Client $client | Select-Object -First 10
# open a nested folder
Get-IMAPFolder -Client $client -Path 'Inbox/Reports/2024'
Get-IMAPMessage -Client $client | Select-Object -First 10
# sent items
Get-IMAPFolder -Client $client -Path 'Sent'
Get-IMAPMessage -Client $client | Select-Object -First 10
# deleted items
Get-IMAPFolder -Client $client -Path 'Deleted Items'
Get-IMAPMessage -Client $client | Select-Object -First 10
Disconnect-IMAP -Client $client
================================================
FILE: Examples/Example-ListImapRootFolders.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
# Acquire credentials using your preferred method
$credential = Get-Credential
# Connect and list root folders
$client = Connect-IMAP -Server 'imap.example.com' -Credential $credential -Port 993 -Options Auto
Get-IMAPFolder -Client $client -Root
Disconnect-IMAP -Client $client
================================================
FILE: Examples/Example-ListImapRootFoldersOAuth.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
# Acquire OAuth token first
$clientSecret = Read-Host 'Google client secret' -AsSecureString
$token = Connect-OAuthGoogle -ClientId 'id' -ClientSecretSecureString $clientSecret -GmailAccount 'user@example.com' -Scope https://mail.google.com/
# Connect using the OAuth token and list folders
$client = Connect-IMAP -Server 'imap.gmail.com' -Port 993 -Credential $token -OAuth2
Get-IMAPFolder -Client $client -Root
Disconnect-IMAP -Client $client
================================================
FILE: Examples/Example-MoveMailFolder.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
# ----------------------
# Move IMAP folder
# ----------------------
$cred = Get-Credential
$imap = Connect-IMAP -Server 'imap.example.com' -Credential $cred -Port 993 -Options Auto
# verify folders exist before moving
Get-IMAPFolder -Client $imap -Root | Select-Object FullName
Get-IMAPFolder -Client $imap -Path 'Archive'
Move-IMAPFolder -Client $imap -Folder 'OldFolder' -DestinationFolder 'Archive' -WhatIf
# confirm destination folder after move
Get-IMAPFolder -Client $imap -Path 'Archive'
Move-IMAPFolder -Client $imap -Folder 'Sent/Reports' -DestinationFolder 'Inbox' -WhatIf
Move-IMAPFolder -Client $imap -Folder 'Drafts/Sub' -Root -WhatIf
Disconnect-IMAP -Client $imap
# ----------------------
# Move Microsoft Graph folder
# ----------------------
$graphCred = ConvertTo-GraphCredential -ClientId 'id' -ClientSecret 'secret' -DirectoryId 'tenant'
Connect-EmailGraph -Credential $graphCred | Out-Null
# verify folders before move
Get-EmailGraphFolder -UserPrincipalName 'user@example.com' | Select-Object displayName,id
Move-GraphFolder -UserPrincipalName 'user@example.com' -FolderId 'folder-id' -DestinationFolderId 'archive-id' -WhatIf
# confirm destination after move
Get-EmailGraphFolder -UserPrincipalName 'user@example.com' -Connection $graphCred | Where-Object id -EQ 'archive-id'
Move-GraphFolder -UserPrincipalName 'user@example.com' -FolderId 'sent-id' -DestinationFolderId 'inbox-id' -WhatIf
Move-GraphFolder -UserPrincipalName 'user@example.com' -FolderId 'draft-id' -Root -WhatIf
Disconnect-EmailGraph
================================================
FILE: Examples/Example-NewGraphEvent.ps1
================================================
# Create a simple event
$cred = Connect-EmailGraph -ClientId 'client' -TenantId 'tenant' -ClientSecret 'secret'
$builder = New-GraphEventBuilder -Subject 'Demo Meeting' -Start (Get-Date).AddHours(1) -End (Get-Date).AddHours(2) -Attendees 'user@example.com'
New-GraphEvent -UserPrincipalName 'user@example.com' -EventBuilder $builder -Connection $cred
================================================
FILE: Examples/Example-ParseGraphError.ps1
================================================
$sample = @'
POST https://graph.microsoft.com/v1.0/users/przemyslaw.klys@company.pl/sendMail
HTTP/2.0 404 Not Found
request-id: 2ff18766-1395-4fb9-abd1-162774d4b063
client-request-id: 6c57f9e6-3cad-48ee-8f7a-d566dc92aca3
x-ms-ags-diagnostic: {"ServerInfo":{"DataCenter":"Poland Central","Slice":"E","Ring":"2","ScaleUnit":"002","RoleInstance":"WA3PEPF000004A2"}}
Date: Sun, 24 Aug 2025 12:55:18 GMT
Content-Type: application/json; odata.metadata=minimal; odata.streaming=true; IEEE754Compatible=false; charset=utf-8
{"error":{"code":"ErrorInvalidUser","message":"The requested user 'przemyslaw.klys@company.pl' is invalid."}}
'
$parsed = [Mailozaurr.GraphApiErrorParser]::Parse($sample)
$parsed.Headers.Diagnostic.ServerInfo
$parsed.Error
================================================
FILE: Examples/Example-Pop3FilterScenarios.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$cred = Get-Credential
$client = Connect-POP3 -Server 'pop.example.com' -Credential $cred -Port 995 -Options Auto
# 1. Retrieve messages with subject 'Invoice'
Get-POP3Message -Client $client -Subject 'Invoice'
# 2. Messages from a sender in the past week
Get-POP3Message -Client $client -FromContains 'alerts@example.com' -Since (Get-Date).AddDays(-7)
# 3. Messages sent to the sales team
Get-POP3Message -Client $client -ToContains 'sales@example.com'
# 4. High priority messages
Get-POP3Message -Client $client -Priority High
# 5. Messages that include attachments
Get-POP3Message -Client $client -HasAttachment
# 6. Delete old reports older than 30 days
Get-POP3Message -Client $client -Subject 'Report' -Before (Get-Date).AddDays(-30) -Delete
# 7. Retrieve all messages and remove them
Get-POP3Message -Client $client -All -Delete
# 8. Fetch messages delivered after a date
Get-POP3Message -Client $client -Since (Get-Date).AddDays(-14)
# 9. Fetch messages delivered before a date
Get-POP3Message -Client $client -Before (Get-Date).AddDays(-60)
# 10. Delete messages from a specific sender with attachments
Get-POP3Message -Client $client -FromContains 'newsletter@example.com' -HasAttachment -Delete
Disconnect-POP3 -Client $client
================================================
FILE: Examples/Example-ProcessPendingMessages.ps1
================================================
$pending = Join-Path $PSScriptRoot 'pending'
$sent = Join-Path $PSScriptRoot 'sentlog.json'
$smtp = [Mailozaurr.Smtp]::new()
$smtp.Server = 'smtp.server'
$smtp.PendingMessagesPath = $pending
$smtp.SentMessageRepository = [Mailozaurr.FileSentMessageRepository]::new($sent)
$smtp.ProcessPendingMessagesAsync().GetAwaiter().GetResult()
================================================
FILE: Examples/Example-QueryLanguageSearch.ps1
================================================
# Demonstrates searching an IMAP mailbox using query language
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$imap = Connect-IMAP -Server 'imap.example.com' -Credential (Get-Credential)
# search using query string for messages from boss with subject containing "report"
$result = Search-IMAPMailbox -Client $imap -Query 'from:boss subject:"report"'
$result | ForEach-Object {
Write-Host "Found message $($_.Message.Subject)"
}
Disconnect-IMAP -Client $imap
================================================
FILE: Examples/Example-ReadGraphEncryption.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$cred = ConvertTo-GraphCredential -ClientId 'clientId' -ClientSecret 'secret' -DirectoryId 'tenantId'
Connect-EmailGraph -Credential $cred | Out-Null
$msg = Get-EmailGraphMessage -UserPrincipalName 'user@example.com' -First 1
$mime = $msg | Get-EmailGraphMessageMime
Write-Host "Message $($msg.Id) encryption: $($mime.Encryption)"
$decrypted = $mime
if ($mime.Encryption -eq [Mailozaurr.EmailEncryption]::PgpEncrypted) {
$decrypted = $mime | Unprotect-MimeMessage -PrivateKeyPath 'C:\Keys\private.asc' -PrivateKeyPassword 'passphrase'
} elseif ($mime.Encryption -eq [Mailozaurr.EmailEncryption]::SmimeEncrypted) {
$cert = Get-PfxCertificate -FilePath 'C:\Keys\email.pfx' -Password (ConvertTo-SecureString 'pfx-pass' -AsPlainText -Force)
$decrypted = $mime | Unprotect-MimeMessage -Certificate $cert
}
$decrypted | Save-MimeMessage -Path "$Env:TEMP\graph.eml"
$content = $decrypted | Get-MimeMessageContent
$content.TextBody
$content.HtmlBody
Disconnect-EmailGraph
================================================
FILE: Examples/Example-ReadImapEncryption.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$cred = Get-Credential
$client = Connect-IMAP -Server 'imap.example.com' -Credential $cred -Port 993 -Options Auto
# Fetch messages and detect encryption
Get-IMAPMessage -Client $client -All |
ForEach-Object {
Write-Host "Message $($_.Uid.Id) encryption: $($_.Encryption)"
$decrypted = $_
if ($_.Encryption -eq [Mailozaurr.EmailEncryption]::PgpEncrypted) {
$decrypted = $_ | Unprotect-MimeMessage -PrivateKeyPath 'C:\Keys\private.asc' -PrivateKeyPassword 'passphrase'
} elseif ($_.Encryption -eq [Mailozaurr.EmailEncryption]::SmimeEncrypted) {
$cert = Get-PfxCertificate -FilePath 'C:\Keys\email.pfx' -Password (ConvertTo-SecureString 'pfx-pass' -AsPlainText -Force)
$decrypted = $_ | Unprotect-MimeMessage -Certificate $cert
}
$decrypted | Save-MimeMessage -Path "$Env:TEMP\$($_.Uid.Id).eml"
$content = $decrypted | Get-MimeMessageContent
$content.TextBody
$content.HtmlBody
}
Disconnect-IMAP -Client $client
================================================
FILE: Examples/Example-ReadPop3Encryption.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$cred = Get-Credential
$client = Connect-POP3 -Server 'pop.example.com' -Credential $cred -Port 995 -UseSsl
Get-POP3Message -Client $client -All |
ForEach-Object {
Write-Host "Message $($_.Index) encryption: $($_.Encryption)"
$decrypted = $_
if ($_.Encryption -eq [Mailozaurr.EmailEncryption]::PgpEncrypted) {
$decrypted = $_ | Unprotect-MimeMessage -PrivateKeyPath 'C:\Keys\private.asc' -PrivateKeyPassword 'passphrase'
} elseif ($_.Encryption -eq [Mailozaurr.EmailEncryption]::SmimeEncrypted) {
$cert = Get-PfxCertificate -FilePath 'C:\Keys\email.pfx' -Password (ConvertTo-SecureString 'pfx-pass' -AsPlainText -Force)
$decrypted = $_ | Unprotect-MimeMessage -Certificate $cert
}
$decrypted | Save-MimeMessage -Path "$Env:TEMP\$($_.Index).eml"
$content = $decrypted | Get-MimeMessageContent
$content.TextBody
$content.HtmlBody
}
Disconnect-POP3 -Client $client
================================================
FILE: Examples/Example-RemoveGmailMessage.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
# Acquire OAuth2 credential using Connect-OAuthGoogle
# $cred = Connect-OAuthGoogle -GmailAccount 'user@gmail.com' -ClientID 'id' -ClientSecret 'secret'
$cred = ConvertTo-OAuth2Credential -UserName 'user@gmail.com' -Token 'access_token'
Remove-GmailMessage -GmailAccount 'user@gmail.com' -Credential $cred -Id 'abcd1234' -WhatIf
================================================
FILE: Examples/Example-RemoveMailFolder.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
# ----------------------
# Remove IMAP folder
# ----------------------
$cred = Get-Credential
$imap = Connect-IMAP -Server 'imap.example.com' -Credential $cred -Port 993 -Options Auto
# confirm folder presence before deletion
Get-IMAPFolder -Client $imap -Path 'OldFolder'
Remove-IMAPFolder -Client $imap -Folder 'OldFolder' -WhatIf
Remove-IMAPFolder -Client $imap -Folder 'Archive/Reports' -Recursive -WhatIf
# list archive folder after removal attempt
Get-IMAPFolder -Client $imap -Path 'Archive'
Disconnect-IMAP -Client $imap
# ----------------------
# Remove Microsoft Graph folder
# ----------------------
$graphCred = ConvertTo-GraphCredential -ClientId 'id' -ClientSecret 'secret' -DirectoryId 'tenant'
Connect-EmailGraph -Credential $graphCred | Out-Null
# check folder before deletion
Get-EmailGraphFolder -UserPrincipalName 'user@example.com' | Select-Object displayName,id
Remove-GraphFolder -UserPrincipalName 'user@example.com' -FolderId 'folder-id' -WhatIf
# confirm folder removed
Get-EmailGraphFolder -UserPrincipalName 'user@example.com' -Connection $graphCred | Where-Object id -EQ 'folder-id'
Remove-GraphFolder -UserPrincipalName 'user@example.com' -FolderId 'nested-id' -WhatIf
Disconnect-EmailGraph
================================================
FILE: Examples/Example-RemoveMessageAttachment.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
# Create a MIME message and strip attachments before forwarding
$builder = [MimeKit.BodyBuilder]::new()
$builder.TextBody = 'Forwarding without attachments'
$path = Join-Path $PSScriptRoot 'sample.txt'
'content' | Set-Content -Path $path
$builder.Attachments.Add($path) | Out-Null
$msg = [MimeKit.MimeMessage]::new()
$msg.From.Add([MimeKit.MailboxAddress]::new('Sender','sender@example.com'))
$msg.To.Add([MimeKit.MailboxAddress]::new('Recipient','recipient@example.com'))
$msg.Subject = 'Sample'
$msg.Body = $builder.ToMessageBody()
$msg = Remove-IMAPMessageAttachment -Message $msg
Send-EmailMessage -From 'sender@example.com' -To 'recipient@example.com' -Subject $msg.Subject -Body $builder.TextBody -Server 'smtp.example.com' -Port 25 -Message $msg -WhatIf
# For Graph messages
$file = Join-Path $PSScriptRoot 'sample2.txt'
'content2' | Set-Content -Path $file
$graphMsg = [Mailozaurr.GraphMessage]::new()
$graphMsg.Subject = 'Graph sample'
$graphMsg.Body = [Mailozaurr.GraphContent]::new()
$graphMsg.Attachments = @([Mailozaurr.GraphAttachment]::FromFile($file))
$graphMsg = Remove-GraphMessageAttachment -Message $graphMsg
# Forward $graphMsg using your preferred method
# For POP3 messages (after retrieval)
$popMsg = [MimeKit.MimeMessage]::new()
$popMsg.Body = $builder.ToMessageBody()
$popMsg = Remove-POP3MessageAttachment -Message $popMsg
================================================
FILE: Examples/Example-RemoveMessageAttachmentFiltered.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
# Strip attachments from IMAP messages sent by alerts@example.com in the last week
$cred = Get-Credential
$imap = Connect-IMAP -Server 'imap.example.com' -Credential $cred -Port 993 -Options Auto
Get-IMAPMessage -Client $imap -FromContains 'alerts@example.com' -Since (Get-Date).AddDays(-7) -HasAttachment |
ForEach-Object {
$updated = $_.MimeMessage | Remove-IMAPMessageAttachment
$path = Join-Path $PSScriptRoot "IMAP-$($_.Uid.Id).eml"
$updated.WriteTo($path)
}
Disconnect-IMAP -Client $imap
# Strip attachments from POP3 messages with subject 'Report'
$popCred = Get-Credential
$pop = Connect-POP3 -Server 'pop.example.com' -Credential $popCred -Port 995 -Options Auto
Get-POP3Message -Client $pop -Subject 'Report' -HasAttachment |
ForEach-Object {
$updated = $_.MimeMessage | Remove-POP3MessageAttachment
$path = Join-Path $PSScriptRoot "POP3-$($_.Index).eml"
$updated.WriteTo($path)
}
Disconnect-POP3 -Client $pop
# Strip attachments from Graph messages from the same sender
$ClientId = 'your-client-id'
$ClientSecret = 'your-client-secret'
$TenantId = 'your-tenant-id'
$graphCred = ConvertTo-GraphCredential -ClientId $ClientId -ClientSecret $ClientSecret -DirectoryId $TenantId
Connect-EmailGraph -Credential $graphCred | Out-Null
Get-EmailGraphMessage -UserPrincipalName 'user@example.com' -Filter "from/emailAddress/address eq 'alerts@example.com' and hasAttachments eq true" -Limit 5 |
ForEach-Object {
$updated = Remove-GraphMessageAttachment -Message $_
Save-GraphMessage -Message $updated -Path (Join-Path $PSScriptRoot 'Graph')
}
Disconnect-EmailGraph
================================================
FILE: Examples/Example-RemoveMessages-01.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
# ----------------------
# Basic IMAP deletion
# ----------------------
$imap = Connect-IMAP -Server 'imap.example.com' -UserName 'user' -Password 'pass'
# Delete a single message by UID. -WhatIf previews the action.
Remove-IMAPMessage -Client $imap -Uid 1 -WhatIf
Disconnect-IMAP -Client $imap
# ----------------------
# Basic POP3 deletion
# ----------------------
$pop = Connect-POP3 -Server 'pop.example.com' -UserName 'user' -Password 'pass'
# Remove multiple messages by index
Remove-POP3Message -Client $pop -Index 0,2 -Confirm:$false
Disconnect-POP3 -Client $pop
# ----------------------
# Basic Microsoft Graph deletion
# ----------------------
$cred = ConvertTo-GraphCredential -ClientId 'id' -ClientSecret 'secret' -DirectoryId 'tenant'
Connect-EmailGraph -Credential $cred | Out-Null
Remove-GraphMessage -UserPrincipalName 'user@example.com' -MessageId 'id' -WhatIf
Disconnect-EmailGraph
================================================
FILE: Examples/Example-RemoveMessages-02.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
# ------------------------------------
# Advanced IMAP and POP3 clean-up
# ------------------------------------
$imap = Connect-IMAP -Server 'imap.example.com' -UserName 'user' -Password 'pass'
$uids = Get-IMAPMessage -Client $imap -Subject 'Spam' -Limit 10 | Select-Object -ExpandProperty Uid
Remove-IMAPMessage -Client $imap -Uid $uids -Confirm:$false
Disconnect-IMAP -Client $imap
$pop = Connect-POP3 -Server 'pop.example.com' -UserName 'user' -Password 'pass'
$idx = Get-POP3Message -Client $pop -Before (Get-Date).AddDays(-7) | Select-Object -ExpandProperty Index
Remove-POP3Message -Client $pop -Index $idx -Confirm:$false
Disconnect-POP3 -Client $pop
# ------------------------------------
# Advanced Microsoft Graph deletion
# ------------------------------------
$cred = ConvertTo-GraphCredential -ClientId 'id' -ClientSecret 'secret' -DirectoryId 'tenant'
Connect-EmailGraph -Credential $cred | Out-Null
$m = Get-EmailGraphMessage -UserPrincipalName 'user@example.com' -Limit 1
Remove-GraphMessage -UserPrincipalName 'user@example.com' -MessageId $m.Id -MgGraphRequest -Confirm:$false
Disconnect-EmailGraph
================================================
FILE: Examples/Example-RenameMailFolder.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
# ----------------------
# Rename IMAP folder
# ----------------------
$cred = Get-Credential
$imap = Connect-IMAP -Server 'imap.example.com' -Credential $cred -Port 993 -Options Auto
# verify current folder names before renaming
Get-IMAPFolder -Client $imap -Path 'OldFolder'
Rename-IMAPFolder -Client $imap -Folder 'OldFolder' -NewName 'NewFolder' -WhatIf
# confirm new folder name
Get-IMAPFolder -Client $imap -Path 'NewFolder'
Rename-IMAPFolder -Client $imap -Folder 'Inbox/Report' -NewName 'Report-2024' -WhatIf
Disconnect-IMAP -Client $imap
# ----------------------
# Rename Microsoft Graph folder
# ----------------------
$graphCred = ConvertTo-GraphCredential -ClientId 'id' -ClientSecret 'secret' -DirectoryId 'tenant'
Connect-EmailGraph -Credential $graphCred | Out-Null
# list folders before renaming
Get-EmailGraphFolder -UserPrincipalName 'user@example.com' | Select-Object displayName,id
Rename-GraphFolder -UserPrincipalName 'user@example.com' -FolderId 'folder-id' -NewName 'New Folder' -WhatIf
# verify new name
Get-EmailGraphFolder -UserPrincipalName 'user@example.com' -Connection $graphCred | Where-Object id -EQ 'folder-id'
Rename-GraphFolder -UserPrincipalName 'user@example.com' -FolderId 'report-id' -NewName 'Report-2024' -WhatIf
Disconnect-EmailGraph
================================================
FILE: Examples/Example-RetrieveAndCorrelateNdr.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
# Retrieve recent non-delivery reports and correlate with sent messages
$repo = [Mailozaurr.FileSentMessageRepository]::new("$env:TEMP\sendlog.json")
$resolver = [Mailozaurr.SendLogResolver]::new($repo)
Connect-IMAP -Server 'imap.example.com' -Credential (Get-Credential) | Out-Null
$ndrs = Get-EmailDeliveryStatus -Protocol Imap -Since (Get-Date).AddDays(-7) -ParallelDownloadLimit 8
Get-EmailDeliveryMatch -Protocol Imap -Resolver $resolver -Since (Get-Date).AddDays(-7) | ForEach-Object {
Write-Host "NDR for $($_.Report.FinalRecipient) matches message '$($_.SentMessage.Subject)'"
}
Disconnect-IMAP
================================================
FILE: Examples/Example-RetryAlways.Tests.ps1
================================================
Describe 'RetryAlways example' {
It 'Uses RetryAlways switch' {
$params = @{
From = 'test@contoso.com'
To = 'recipient@contoso.com'
Server = 'smtp.example.com'
Subject = 'Test'
Text = 'Hello'
RetryAlways = $true
RetryCount = 2
WhatIf = $true
}
$result = Send-EmailMessage @params -ErrorAction Stop
$result.Error | Should -Be 'Email not sent (WhatIf)'
}
}
================================================
FILE: Examples/Example-RetryAlways.cs
================================================
using Mailozaurr;
using System.Net;
// Example demonstrating RetryAlways
var smtp = new Smtp();
smtp.From = "sender@example.com";
smtp.To = new object[] { "recipient@example.com" };
smtp.Subject = "Retry demo";
smtp.TextBody = "Hello";
smtp.RetryAlways = true;
smtp.RetryCount = 5;
smtp.RetryDelayMilliseconds = 500;
smtp.RetryDelayBackoff = 1.5;
// Replace with real credentials and server
smtp.Connect("smtp.example.com", 587);
var result = smtp.Send();
System.Console.WriteLine($"Status: {result.Status}, Error: {result.Error}");
================================================
FILE: Examples/Example-SaveGmailMessageAttachment.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
# Acquire OAuth2 credential using Connect-OAuthGoogle
# $cred = Connect-OAuthGoogle -GmailAccount 'user@gmail.com' -ClientID 'id' -ClientSecret 'secret'
$cred = ConvertTo-OAuth2Credential -UserName 'user@gmail.com' -Token 'access_token'
Save-GmailMessageAttachment -GmailAccount 'user@gmail.com' -Credential $cred -Id 'abcd1234' -Path $Env:TEMP -WhatIf
================================================
FILE: Examples/Example-SaveImapMessageAttachment.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$credential = Get-Credential
$client = Connect-IMAP -Server 'imap.example.com' -Credential $credential -Port 993 -Options Auto
# Download attachments from the newest message
Get-IMAPMessage -Client $client -SequenceStart 0 -SequenceEnd 0 -HasAttachment |
ForEach-Object { Save-IMAPMessageAttachment -Client $client -Uid $_.Uid.Id -Path "$Env:UserProfile\Downloads\MailAttachments" }
Disconnect-IMAP -Client $client
================================================
FILE: Examples/Example-SaveImapMessageAttachmentFiltered.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$credential = Get-Credential
$client = Connect-IMAP -Server 'imap.example.com' -Credential $credential -Port 993 -Options Auto
# Fetch recent messages with attachments matching a subject filter
Get-IMAPMessage -Client $client -Subject 'Report' -Since (Get-Date).AddDays(-7) -HasAttachment |
ForEach-Object { Save-IMAPMessageAttachment -Client $client -Uid $_.Uid.Id -Path "$Env:UserProfile\Downloads\MailAttachments" }
Disconnect-IMAP -Client $client
================================================
FILE: Examples/Example-SaveMimeMessage.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$cred = Get-Credential
$client = Connect-IMAP -Server 'imap.example.com' -Credential $cred -Port 993 -Options Auto
$msg = Get-IMAPMessage -Client $client -SequenceStart 0 -SequenceEnd 0
$mime = $msg
if ($msg.Encryption -eq [Mailozaurr.EmailEncryption]::PgpEncrypted) {
$mime = $msg | Unprotect-MimeMessage -PrivateKeyPath 'C:\Keys\private.asc' -PrivateKeyPassword 'passphrase'
} elseif ($msg.Encryption -eq [Mailozaurr.EmailEncryption]::SmimeEncrypted) {
$cert = Get-PfxCertificate -FilePath 'C:\Keys\email.pfx' -Password (ConvertTo-SecureString 'pfx-pass' -AsPlainText -Force)
$mime = $msg | Unprotect-MimeMessage -Certificate $cert
}
# Save to disk in EML format
$mime | Save-MimeMessage -Path "$Env:TEMP\latest.eml"
# Extract plain text and HTML bodies
$content = $mime | Get-MimeMessageContent
$content.TextBody
$content.HtmlBody
Disconnect-IMAP -Client $client
================================================
FILE: Examples/Example-SavePop3MessageAttachment.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$credential = Get-Credential
$client = Connect-POP3 -Server 'pop.example.com' -Credential $credential -Port 995 -Options Auto
# Download attachments from the first message
Save-POP3MessageAttachment -Client $client -Index 0 -Path "$Env:UserProfile\Downloads\MailAttachments"
Disconnect-POP3 -Client $client
================================================
FILE: Examples/Example-SavePop3MessageAttachmentFiltered.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$credential = Get-Credential
$client = Connect-POP3 -Server 'pop.example.com' -Credential $credential -Port 995 -Options Auto
# Search for recent messages with attachments matching subject
Get-POP3Message -Client $client -Subject 'Report' -Since (Get-Date).AddDays(-7) -HasAttachment |
ForEach-Object { Save-POP3MessageAttachment -Client $client -Index $_.Index -Path "$Env:UserProfile\Downloads\MailAttachments" }
Disconnect-POP3 -Client $client
================================================
FILE: Examples/Example-SearchAndFind.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
# Search an IMAP mailbox
$imap = Connect-IMAP -Server 'imap.example.com' -Credential (Get-Credential)
$imapMsgs = Search-IMAPMailbox -Client $imap -Subject 'Invoice'
$imapMsgs | ForEach-Object { Write-Host "Found IMAP message $($_.Message.Subject)" }
# Limit results directly with -Count to stop searching after the first match
$firstImap = Search-IMAPMailbox -Client $imap -Subject 'Invoice' -Count 1
# Alternatively search all messages then pick the first
$firstImapAlt = ($imapMsgs | Select-Object -First 1)
Disconnect-IMAP -Client $imap
# Search a POP3 mailbox
$pop = Connect-POP3 -Server 'pop.example.com' -Credential (Get-Credential)
$popMsgs = Search-POP3Mailbox -Client $pop -FromContains 'contoso.com' -Count 1
$popMsgs | ForEach-Object { Write-Host "Found POP3 message $($_.Message.Subject)" }
Disconnect-POP3 -Client $pop
# Search a Graph mailbox for a message
$cred = ConvertTo-GraphCredential -ClientId 'id' -ClientSecret 'secret' -DirectoryId 'tenant'
$graph = Connect-EmailGraph -Credential $cred
$gm = Search-GraphMailbox -Connection $graph -UserPrincipalName 'user@example.com' -Query 'subject:Report' -Count 1
================================================
FILE: Examples/Example-SearchMessageBody.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
# Search IMAP mailbox body
$imap = Connect-IMAP -Server 'imap.example.com' -Credential (Get-Credential)
$imapMsgs = Search-IMAPMailbox -Client $imap -BodyContains 'invoice'
$imapMsgs | ForEach-Object { Write-Host "IMAP found $($_.Message.Subject)" }
Disconnect-IMAP -Client $imap
# Search POP3 mailbox body
$pop = Connect-POP3 -Server 'pop.example.com' -Credential (Get-Credential)
$popMsgs = Search-POP3Mailbox -Client $pop -BodyContains 'invoice'
$popMsgs | ForEach-Object { Write-Host "POP3 found $($_.Message.Subject)" }
Disconnect-POP3 -Client $pop
================================================
FILE: Examples/Example-SendEmail-01-Text.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
if (-not $MailCredentials) {
$MailCredentials = Get-Credential
}
$Text = Get-Content -Path "$PSScriptRoot\Input\Test.txt" -Raw
# this is simple replacement (drag & drop to Send-MailMessage)
Send-EmailMessage -To 'przemyslaw.klys@test.pl' -Subject 'Test' -Text $Text -SmtpServer 'smtp.office365.com' -From 'przemyslaw.klys@test.pl' -Priority High -Credential $MailCredentials -UseSsl -Port 587 -Verbose
================================================
FILE: Examples/Example-SendEmail-01.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
if (-not $MailCredentials) {
$MailCredentials = Get-Credential
}
# this is simple replacement (drag & drop to Send-MailMessage)
Send-EmailMessage -To 'przemyslaw.klys@test.pl' -Subject 'Test' -Body 'test me' -SmtpServer 'smtp.office365.com' -From 'przemyslaw.klys@test.pl' `
-Attachments "$PSScriptRoot\..\README.MD", "$PSScriptRoot\..\Mailozaurr.psm1" -Encoding UTF8 -Cc 'przemyslaw.klys@test.pl' -Priority High -Credential $MailCredentials `
-UseSsl -Port 587 -Verbose
$Body = EmailBody {
EmailText -Text 'This is my text'
EmailTable -DataTable (Get-Process | Select-Object -First 5 -Property Name, Id, PriorityClass, CPU, Product)
}
$Text = 'This is my text'
Send-EmailMessage -From @{ Name = 'Przemysław Kłys'; Email = 'przemyslaw.klys@test.pl' } -To 'przemyslaw.klys@test.pl' `
-Server 'smtp.office365.com' -Credential $MailCredentials -HTML $Body -Text $Text -DeliveryNotificationOption OnSuccess -Priority High `
-Subject 'This is another test email' -SecureSocketOptions Auto
================================================
FILE: Examples/Example-SendEmail-02.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$UserNotify = 'Przemyslaw'
$Body = EmailBody -FontFamily 'Calibri' -Size 15 {
EmailText -Text 'Hello ', $UserNotify, ',' -Color None, Blue, None -Verbose -LineBreak
EmailText -Text 'Your password is due to expire in ', $PasswordExpiryDays, 'days.' -Color None, Green, None
EmailText -LineBreak
EmailText -Text 'To change your password: '
EmailText -Text '- press ', 'CTRL+ALT+DEL', ' -> ', 'Change a password...' -Color None, BlueViolet, None, Red
EmailText -LineBreak
EmailTextBox {
'If you have forgotten your password and need to reset it, you can do this by clicking here. '
'In case of problems please contact the HelpDesk by visiting [Evotec Website](https://evotec.xyz) or by sending an email to Help Desk.'
}
EmailText -LineBreak
EmailText -Text 'Alternatively you can always call ', 'Help Desk', ' at ', '+48 22 00 00 00' `
-Color None, LightSkyBlue, None, LightSkyBlue -TextDecoration none, underline, none, underline -FontWeight normal, bold, normal, bold
EmailText -LineBreak
EmailTextBox {
'Kind regards,'
'Evotec IT'
}
}
if (-not $MailCredentials) {
$MailCredentials = Get-Credential
}
Send-EmailMessage -From @{ Name = 'Przemysław Kłys'; Email = 'przemyslaw.klys@test.pl' } -To 'przemyslaw.klys@test.pl' `
-Server 'smtp.office365.com' -SecureSocketOptions Auto -Credential $MailCredentials -HTML $Body -DeliveryNotificationOption OnSuccess -Priority High `
-Subject 'This is another test email'
Send-MailMessage -To 'przemyslaw.klys@test.pl' -Subject 'Test' -Body 'test me' -SmtpServer 'smtp.office365.com' -From 'przemyslaw.klys@test.pl' `
-Attachments "$PSScriptRoot\..\Mailozaurr.psd1" -Cc 'przemyslaw.klys@test.pl' -DeliveryNotificationOption OnSuccess -Priority High -Credential $MailCredentials -UseSsl -Port 587 -Verbose # -Encoding UTF8
================================================
FILE: Examples/Example-SendEmail-Attachments.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
# Custom attachment built from memory
$bytes = [System.Text.Encoding]::UTF8.GetBytes('Hello from memory')
$memoryStream = [System.IO.MemoryStream]::new($bytes)
$mimePart = [MimeKit.MimePart]::new('text/plain')
$mimePart.Content = [MimeKit.MimeContent]::new($memoryStream)
$mimePart.FileName = 'Memory.txt'
Send-EmailMessage -From 'sender@example.com' -To 'recipient@example.com' \
-Server 'smtp.example.com' -Port 25 -Subject 'Attachment Demo' -Body 'Check attachments' \
-Attachment 'C:\\Temp\\report.pdf', $mimePart \
-InlineAttachment 'C:\\Temp\\logo.png' -WhatIf -Verbose
================================================
FILE: Examples/Example-SendEmail-ConnectionPool-Advanced.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$Credential = Get-Credential
$common = @{
From = 'sender@example.com'
Server = 'smtp.example.com'
Credential = $Credential
UseConnectionPool = $true
ConnectionPoolSize = 2
WhatIf = $true
}
# Send a plain text message
Send-EmailMessage @common -To 'user1@example.com' -Subject 'First' -Body 'First message'
# Send a high priority message with an attachment
Send-EmailMessage @common -To 'user2@example.com' -Subject 'Second' -Body 'Second message' -Priority High -Attachment "$PSScriptRoot\..\README.MD"
# Send HTML content
Send-EmailMessage @common -To 'user3@example.com' -Subject 'Third' -HTML '<b>Third message</b>'
# When done with the pool
Clear-SmtpConnectionPool
================================================
FILE: Examples/Example-SendEmail-ConnectionPool.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
# Obtain credentials for SMTP authentication
$Credential = Get-Credential
$common = @{From='sender@example.com'; To='recipient@example.com'; Subject='Test'; Server='smtp.example.com'; Credential=$Credential; WhatIf=$true}
# First send creates and pools the connection
Send-EmailMessage @common -UseConnectionPool -ConnectionPoolSize 3
# Second send reuses the connection from the pool
Send-EmailMessage @common -UseConnectionPool
================================================
FILE: Examples/Example-SendEmail-CramMd5.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$cred = Get-Credential
Send-EmailMessage -From $cred.UserName -To 'recipient@example.com' -Server 'smtp.example.com' \
-Port 587 -Username $cred.UserName -Password $cred.GetNetworkCredential().Password \
-AuthenticationMechanism CramMd5 -Verbose -WhatIf
================================================
FILE: Examples/Example-SendEmail-DeduplicateAttachments.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$path = Join-Path $PSScriptRoot 'duplicate.txt'
'data' | Set-Content -Path $path
Send-EmailMessage -From 'example@example.com' -To 'recipient@example.com' -Subject 'Dedup attachments' -Body 'Demo' -Server 'smtp.example.com' -Port 25 -Attachment $path,$path -WhatIf
Remove-Item $path
================================================
FILE: Examples/Example-SendEmail-GmailApiProvider.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
# Acquire OAuth2 credential using Connect-OAuthGoogle
# $cred = Connect-OAuthGoogle -GmailAccount 'user@gmail.com' -ClientID 'id' -ClientSecret 'secret'
# Or create a credential from an existing token
$cred = ConvertTo-OAuth2Credential -UserName 'user@gmail.com' -Token 'access_token'
Send-EmailMessage -EmailProvider Gmail -GmailAccount 'user@gmail.com' -From 'user@gmail.com' -To 'recipient@example.com' -Credential $cred -Subject 'Gmail API Test' -Body 'Hello from Gmail API' -WhatIf
================================================
FILE: Examples/Example-SendEmail-Graph-Headers.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$Credential = ConvertTo-GraphCredential -ClientID 'client-id' -ClientSecret 'secret' -DirectoryID 'tenant-id'
Send-EmailMessage -From 'sender@example.com' -To 'recipient@example.com' -Subject 'Graph Header Test' -Body 'Hello from Graph' -Graph -Credential $Credential -Headers @{ 'X-Tracking-ID' = 'abc123'; 'X-Source' = 'Mailozaurr' }
================================================
FILE: Examples/Example-SendEmail-Graph-Policy.ps1
================================================
<#
Demonstrates throttling-safe Graph sending with retry/backoff knobs from PowerShell.
Security note: Do not hardcode client secrets in scripts. Use secure storage
such as SecretManagement or environment variables and retrieve them at runtime.
#>
$ClientId = 'your-app-id'
$ClientSecret = 'your-secret'
$TenantId = 'your-tenant-id'
$cred = ConvertTo-GraphCredential -ClientId $ClientId -ClientSecret $ClientSecret -DirectoryId $TenantId
Send-EmailMessage -Graph -From 'sender@example.com' -To 'recipient@example.com' `
-Credential $cred -HTML '<b>Hello</b>' -Subject 'Graph policy demo' `
-RetryCount 4 -RetryDelayMilliseconds 1000 -JitterMilliseconds 500 -MaxDelayMilliseconds 30000 `
-GraphMaxConcurrency 2 -Verbose
================================================
FILE: Examples/Example-SendEmail-Graph-SmtpFallback.ps1
================================================
<#
Configures a global SMTP fallback factory and sends via Graph with fallback enabled.
#>
# WARNING: Do not hardcode credentials in scripts. Use Get-Credential, environment variables
# or a secure secret store (e.g., SecretManagement) for production scenarios.
# Configure once per session
[Mailozaurr.MailozaurrOptions]::SmtpFallbackFactory = {
param($graph)
$s = [Mailozaurr.Smtp]::new()
$s.Connect('smtp.office365.com', 587)
# Example only — replace with secure credential retrieval
$s.Authenticate([System.Net.NetworkCredential]::new('user@example.com','password'))
$s
}
$ClientId = 'your-app-id'
$ClientSecret = 'your-secret'
$TenantId = 'your-tenant-id'
$cred = ConvertTo-GraphCredential -ClientId $ClientId -ClientSecret $ClientSecret -DirectoryId $TenantId
Send-EmailMessage -Graph -EnableSmtpFallback -From 'sender@example.com' -To 'recipient@example.com' `
-Credential $cred -HTML '<b>Hello via fallback</b>' -Subject 'Graph+SMTP fallback' `
-RetryCount 4 -RetryDelayMilliseconds 1000 -JitterMilliseconds 500 -MaxDelayMilliseconds 30000
================================================
FILE: Examples/Example-SendEmail-Graph.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$Body = EmailBody {
EmailText -Text 'This is my text'
EmailTable -DataTable (Get-Process | Select-Object -First 5 -Property Name, Id, PriorityClass, CPU, Product)
} -Online
# Credentials for Graph
$ClientID = 'f8f134f3-78c7-48f4-a371-5d6eefa447cd'
$DirectoryID = 'ceb371f6-8745-4876-a040-69f2d10a9d1a'
$ClientSecret = Read-Host 'Graph client secret' -AsSecureString
$Credential = ConvertTo-GraphCredential -ClientID $ClientID -ClientSecretSecureString $ClientSecret -DirectoryID $DirectoryID
# Sending email
Send-EmailMessage -From @{ Name = 'Przemysław Kłys'; Email = 'przemyslaw.klys@evotec.pl' } -To 'przemyslaw.klys@evotec.pl' `
-Credential $Credential -HTML $Body -Subject 'This is another test email 1' -Graph -Verbose -Priority High
# sending email with From as string (it won't matter for Exchange )
Send-EmailMessage -From 'przemyslaw.klys@evotec.pl' -To 'przemyslaw.klys@evotec.pl' `
-Credential $Credential -HTML $Body -Subject 'This is another test email 2' -Graph -Verbose -Priority Low
================================================
FILE: Examples/Example-SendEmail-GraphCertificate.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$ClientId = 'your-client-id'
$TenantId = 'your-tenant-id'
$CertPath = 'path-to-your.pfx'
$CertPassword = 'your-cert-password'
$Credential = ConvertTo-GraphCertificateCredential -ClientId $ClientId -TenantId $TenantId -CertificatePath $CertPath -CertificatePassword $CertPassword
Send-EmailMessage -From 'sender@yourtenant.onmicrosoft.com' -To 'recipient@example.com' `
-Credential $Credential -Subject 'Certificate Graph Test' `
-HTML '<p>Hello from Graph using certificate auth!</p>' -Graph -Verbose
================================================
FILE: Examples/Example-SendEmail-GraphDeviceCode.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$ClientId = 'Your-Application-ID'
$TenantId = 'Your-Tenant-ID'
$Scopes = @('Mail.ReadWrite','Mail.Send')
# Sign in interactively using device code
$graph = Connect-EmailGraph -ClientId $ClientId -DirectoryId $TenantId -DeviceCode -Scopes $Scopes -MaxConcurrentRequests 10
$Body = EmailBody {
EmailText -Text 'Hello from device code authentication!'
} -Online
Send-EmailMessage -From 'sender@example.com' -To 'recipient@example.com' \
-Subject 'Device Code Graph Test' -HTML $Body -Graph -Verbose
================================================
FILE: Examples/Example-SendEmail-GraphWithMgRequest.ps1
================================================
Import-Module .\Mailozaurr.psd1 -Force
#Import-Module Microsoft.Graph.Authentication -Force
# this shows how to send email using combination of Mailozaurr and Microsoft.Graph to use Connect-MgGraph to authorize
$Body = EmailBody {
New-HTMLText -Text "This is test of Connect-MGGraph functionality"
}
$Path = "C:\Support\GitHub\HtmlForgeX.Emails\HtmlForgeX.Email.Examples\EmailTableAdvancedStyling.html"
$Path = "C:/Support/GitHub/HtmlForgeX.Emails/HtmlForgeX.Email.Examples/bin/Debug/net8.0/EmailProductLaunchAnnouncement.html"
$Body = Get-Content -Path $Path -Raw
# authorize via Connect-MgGraph with delegated rights or any other supported method
Connect-MgGraph -Scopes Mail.Send -NoWelcome
# sending email
$sendEmailMessageSplat = @{
From = 'przemyslaw.klys@evotec.pl'
To = 'przemyslaw.klys@evotec.pl'
HTML = $Body
Subject = 'This tests email as delegated'
MgGraphRequest = $true
Verbose = $true
}
Send-EmailMessage @sendEmailMessageSplat
================================================
FILE: Examples/Example-SendEmail-Headers.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
Send-EmailMessage -From 'sender@example.com' -To 'recipient@example.com' -Subject 'Header Test' -Body 'Hello' -Server 'smtp.example.com' -Headers @{ 'X-Tracking-ID' = 'abc123'; 'X-Custom' = 'Mailozaurr' }
================================================
FILE: Examples/Example-SendEmail-Mailgun-Headers.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$ApiKey = 'mailgun-api-key'
$Credential = ConvertTo-MailgunCredential -ApiKey $ApiKey
Send-EmailMessage -From 'sender@example.com' -To 'recipient@example.com' -Subject 'Mailgun Header Test' -Body 'Hello from Mailgun' -EmailProvider Mailgun -Credential $Credential -Headers @{ 'X-Tracking-ID' = 'abc123'; 'X-Source' = 'Mailozaurr' }
================================================
FILE: Examples/Example-SendEmail-Mailgun.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
# Use Mailgun API
$Key = Read-Host 'Mailgun API key' -AsSecureString
$Credential = ConvertTo-MailgunCredential -ApiKeySecureString $Key
$sendEmailMessageSplat = @{
From = 'postmaster@sandbox814085ede3524b939d4b7f518ef9877a.mailgun.org'
To = 'przemyslaw.klys+mailgun@xxx.pl'
Subject = 'Mailgun Test'
HTML = 'Hello from Mailgun'
Credential = $Credential
Verbose = $true
EmailProvider = 'Mailgun'
WhatIf = $false
}
Send-EmailMessage @sendEmailMessageSplat
================================================
FILE: Examples/Example-SendEmail-OAuthGmail.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$ClientID = '939333074185'
$ClientSecret = 'gk2ztAGU'
$CredentialOAuth2 = Connect-OAuthGoogle -ClientID $ClientID -ClientSecret $ClientSecret -GmailAccount 'evot@gmail.com'
Send-EmailMessage -From @{ Name = 'Przemysław Kłys'; Email = 'evot@gmail.com' } -To 'test@evotec.pl' `
-Server 'smtp.gmail.com' -HTML $Body -Text $Text -DeliveryNotificationOption OnSuccess -Priority High `
-Subject 'This is another test email' -SecureSocketOptions Auto -Credential $CredentialOAuth2 -OAuth2
================================================
FILE: Examples/Example-SendEmail-OAuthO365.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$ClientID = '4c1197dd-53'
$TenantID = 'ceb371f6-87'
$CredentialOAuth2 = Connect-OAuthO365 -ClientID $ClientID -TenantID $TenantID
Send-EmailMessage -From @{ Name = 'Przemysław Kłys'; Email = 'test@evotec.pl' } -To 'test@evotec.pl' `
-Server 'smtp.office365.com' -HTML $Body -Text $Text -DeliveryNotificationOption OnSuccess -Priority High `
-Subject 'This is another test email' -SecureSocketOptions Auto -Credential $CredentialOAuth2 -OAuth2
================================================
FILE: Examples/Example-SendEmail-Pgp.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$pub = Join-Path $PSScriptRoot 'PGPKeys/mimekit.gpg.pub'
$sec = Join-Path $PSScriptRoot 'PGPKeys/mimekit.gpg.sec'
Send-EmailMessage -From 'mimekit@example.com' -To 'mimekit@example.com' \
-Server 'smtp.example.com' -Port 25 -Subject 'PGP Test' -Body 'Hello' \
-SignOrEncrypt PgpSignAndEncrypt -PublicKeyPath $pub -PrivateKeyPath $sec \
-PrivateKeyPassword 'no.secret' -WhatIf -Verbose
================================================
FILE: Examples/Example-SendEmail-SendGrid-Headers.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$ApiKey = 'sendgrid-api-key'
$Credential = ConvertTo-SendGridCredential -ApiKey $ApiKey
Send-EmailMessage -From 'sender@example.com' -To 'recipient@example.com' -Subject 'SendGrid Header Test' -Body 'Hello from SendGrid' -SendGrid -Credential $Credential -Headers @{ 'X-Tracking-ID' = 'abc123'; 'X-Source' = 'Mailozaurr' }
================================================
FILE: Examples/Example-SendEmail-SendGrid01.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$Key = Get-Content -Raw -Path "C:\Support\Important\SendGrid.txt"
# Use SendGrid via Standard SMTP
# username needs to be named exactly apikey
Send-EmailMessage -From 'przemyslaw.klys@evo.cool' -To 'przemyslaw.klys@evotec.pl', 'evotectest@gmail.com' `
-Username 'apikey' `
-Server 'smtp.sendgrid.net' `
-Password $Key `
-Body 'test me 🤣😍😒💖✨🎁 Przemysław Kłys' -DeliveryNotificationOption OnSuccess `
-Priority High -Subject '😒💖 This is another test email 我' -UseSsl -Port 587 -Verbose #-WhatIf
================================================
FILE: Examples/Example-SendEmail-SendGrid02.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
# Use SendGrid Api
$Key = Read-Host 'SendGrid API key' -AsSecureString
$Credential = ConvertTo-SendGridCredential -ApiKeySecureString $Key
Send-EmailMessage -From 'przemyslaw.klys@evo.cool' `
-To 'przemyslaw.klys@evotec.pl', 'evotectest@gmail.com' `
-Body 'test me 🤣😍😒💖✨🎁 Przemysław Kłys' `
-Priority High `
-Subject '😒💖 This is another test email 我' `
-SendGrid `
-Credential $Credential `
-Verbose
Send-EmailMessage -From @{ Name = 'Przemysław Kłys'; Email = 'przemyslaw.klys@evo.cool' } -To 'przemyslaw.klys@evotec.pl' -Credential $Credential -Text 'MyTest' -Priority High `
-Subject 'Second test email' -SendGrid -Verbose
================================================
FILE: Examples/Example-SendEmail-SentLog.ps1
================================================
$path = Join-Path $PSScriptRoot 'sentlog.json'
# The file collects all sent message records and is appended to on each send.
Send-EmailMessage -From 'from@example.com' -To 'to@example.com' -Server 'smtp.server' -Subject 'demo' -Text 'body' -SentLogPath $path -WhatIf
# $ndr = Get-NonDeliveryReport -Path 'ndr.eml'
# $repo = [Mailozaurr.FileSentMessageRepository]::new($path)
# $resolver = [Mailozaurr.SendLogResolver]::new($repo)
# $match = $resolver.ResolveAsync($ndr).GetAwaiter().GetResult()
# $match | Format-List
================================================
FILE: Examples/Example-SendEmail-Ses-Headers.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$Credential = Get-Credential -UserName 'AKIA...' -Message 'Enter AWS Secret Key'
Send-EmailMessage -From 'sender@example.com' -To 'recipient@example.com' -Subject 'SES Header Test' -Body 'Hello from SES' -Ses -Region 'us-east-1' -Credential $Credential -Headers @{ 'X-Tracking-ID' = 'abc123'; 'X-Source' = 'Mailozaurr' }
================================================
FILE: Examples/Example-SendEmail-SignEncrypt.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$CertPath = 'C:\Certificates\email.pfx'
$CertPassword = 'pfx-password'
if (-not $SmtpCredential) {
$SmtpCredential = Get-Credential
}
Send-EmailMessage -From 'sender@example.com' -To 'recipient@example.com' \
-Server 'smtp.example.com' -Credential $SmtpCredential -Port 587 -UseSsl \
-Subject 'Signed and encrypted' -Body 'This message is signed and encrypted.' \
-CertificatePath $CertPath -CertificatePassword $CertPassword \
-SignOrEncrypt SMIMESignAndEncrypt -Verbose
================================================
FILE: Examples/Example-SendEmail-TemporaryMailCrypto.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
# Generate temporary PGP keys and keep them on disk
$out = Join-Path $env:TEMP 'pgp-keys'
$keys = New-TemporaryMailCrypto -Pgp -OutputPath $out -NoDispose
Send-EmailMessage -From 'sender@example.com' -To 'recipient@example.com' `
-Server 'smtp.example.com' -Port 25 -Subject 'Temporary PGP test' `
-Body 'Hello from temporary PGP keys' -PublicKeyPath $keys.PublicKeyPath `
-PrivateKeyPath $keys.PrivateKeyPath -PrivateKeyPassword $keys.PassPhrase `
-SignOrEncrypt PgpSignAndEncrypt -WhatIf -Verbose
# Optionally verify the encrypted message
$smtp = [Mailozaurr.Smtp]::new()
$smtp.From = 'sender@example.com'
$smtp.To = @('sender@example.com')
$smtp.Subject = 'Test message'
$smtp.TextBody = 'Secret text'
$smtp.CreateMessage()
$null = $smtp.PgpEncrypt($keys.PublicKeyPath)
$path = Join-Path $env:TEMP 'test.eml'
$smtp.Message.WriteTo($path)
$decrypted = $keys.DecryptToString($path)
Write-Verbose "Decrypted body: $decrypted"
# Dispose without deleting
$keys.Dispose()
# Generate temporary S/MIME certificate
$cert = New-TemporaryMailCrypto -Smime
Send-EmailMessage -From 'sender@example.com' -To 'recipient@example.com' `
-Server 'smtp.example.com' -Port 25 -Subject 'Temporary cert test' `
-Body 'Hello from temporary certificate' -Certificate $cert `
-SignOrEncrypt SmimeSignAndEncrypt -WhatIf -Verbose
================================================
FILE: Examples/Example-SendEmail-TemporaryPgp.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
# Create a throwaway PGP key pair using the unified cmdlet
$keys = New-TemporaryMailCrypto -Pgp
# Send an encrypted and signed message (simulation)
Send-EmailMessage -From 'sender@example.com' -To 'recipient@example.com' `
-Server 'smtp.example.com' -Port 25 -Subject 'Temporary PGP test' `
-Body 'Hello from temporary PGP keys' -PublicKeyPath $keys.PublicKeyPath `
-PrivateKeyPath $keys.PrivateKeyPath -PrivateKeyPassword $keys.PassPhrase `
-SignOrEncrypt PgpSignAndEncrypt -WhatIf -Verbose
# Demonstrate decrypting the message using the same keys
$smtp = [Mailozaurr.Smtp]::new()
$smtp.From = 'sender@example.com'
$smtp.To = @('sender@example.com')
$smtp.Subject = 'Test message'
$smtp.TextBody = 'Secret text'
$smtp.CreateMessage()
$null = $smtp.PgpEncrypt($keys.PublicKeyPath)
$path = Join-Path $env:TEMP 'test.eml'
$smtp.Message.WriteTo($path)
$plaintext = $keys.DecryptToString($path)
Write-Host "Decrypted body: $plaintext"
================================================
FILE: Examples/Example-SendEmail-TemporarySmime.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
# Generate a temporary certificate and export it
$pfx = Join-Path $env:TEMP 'tempcert.pfx'
$cert = New-TemporaryMailCrypto -Smime -OutputPath $pfx
Send-EmailMessage -From 'sender@example.com' -To 'recipient@example.com' `
-Server 'smtp.example.com' -Port 25 -Subject 'Temporary cert test' `
-Body 'Hello from temporary certificate' -Certificate $cert `
-SignOrEncrypt SmimeSignAndEncrypt -WhatIf -Verbose
================================================
FILE: Examples/Example-SendEmail-VerifyAttachment.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$missing = "$PSScriptRoot\missing-file.txt"
Send-EmailMessage -From 'sender@example.com' -To 'recipient@example.com' \
-Server 'smtp.example.com' -Port 25 -Subject 'Verify attachments demo' \
-Body 'demo body' -Attachment $missing -WhatIf -Verbose
================================================
FILE: Examples/Example-SendEmailPendingMessage-ScheduleAndNotify.ps1
================================================
$pending = Join-Path $PSScriptRoot 'pending'
$adminRecipient = 'admin@example.com'
$notificationSender = 'mailer@example.com'
$smtpServer = 'smtp.office365.com'
$notificationSubject = 'Mailozaurr pending message queue failure'
if ($NotificationCredential -and $NotificationCredential -isnot [pscredential]) {
throw 'NotificationCredential must be a PSCredential instance.'
}
if (-not $NotificationCredential) {
$NotificationCredential = Get-Credential -Message 'Provide SMTP credentials used for failure notifications'
if (-not $NotificationCredential) {
throw 'SMTP credentials are required for failure notifications'
}
}
$notificationParameters = @{
From = $notificationSender
To = $adminRecipient
Subject = $notificationSubject
SmtpServer = $smtpServer
Credential = $NotificationCredential
UseSsl = $true
Port = 587
}
try {
Send-EmailPendingMessage -PendingMessagesPath $pending -ProcessAll
} catch {
$timestamp = Get-Date -Format o
$rawMessage = if ($_.Exception) { $_.Exception.ToString() } else { $_ | Out-String }
$sanitizedMessage = $rawMessage -replace '(?i)(password|token|key|secret)=\S+', '$1=***'
$body = @"
Processing of the pending message queue failed at $timestamp.
$sanitizedMessage
"@
Send-EmailMessage @notificationParameters -Body $body
throw
}
# To automatically process the queue, register a scheduled job that reuses the
# same notification block. The example below runs every 15 minutes and alerts the
# administrator when a failure occurs.
#
# $trigger = New-JobTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Minutes 15) -RepetitionDuration ([TimeSpan]::MaxValue)
# Register-ScheduledJob -Name 'Mailozaurr-PendingMessages' -ScriptBlock {
# param(
# [string]$PendingMessagesPath,
# [hashtable]$NotificationParameters
# )
#
# try {
# Send-EmailPendingMessage -PendingMessagesPath $PendingMessagesPath -ProcessAll
# } catch {
# $errorTimestamp = Get-Date -Format o
# $errorBody = @"
# Processing of the pending message queue failed at $errorTimestamp.
#
# $($_.Exception.Message)
# "@
# Send-EmailMessage @NotificationParameters -Body $errorBody
# throw
# }
# } -ArgumentList $pending, $notificationParameters -Trigger $trigger -ScheduledJobOption (New-ScheduledJobOption -RunElevated)
================================================
FILE: Examples/Example-SendEmailPendingMessage-Scheduled.ps1
================================================
$pending = Join-Path $PSScriptRoot 'pending'
# Run once to flush all messages that are due right now.
Send-EmailPendingMessage -PendingMessagesPath $pending
# To process the queue from a scheduled task, register a job that calls the cmdlet.
# The example below runs every 15 minutes and forces processing of all messages
# (even those scheduled for the future) so that long-lived queues are cleared.
#
# $trigger = New-JobTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Minutes 15) -RepetitionDuration ([TimeSpan]::MaxValue)
# Register-ScheduledJob -Name 'Mailozaurr-PendingMessages' -ScriptBlock {
# Send-EmailPendingMessage -PendingMessagesPath '$pending' -ProcessAll
# } -Trigger $trigger -ScheduledJobOption (New-ScheduledJobOption -RunElevated)
================================================
FILE: Examples/Example-SetGraphMessage.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$ClientId = 'your-client-id'
$ClientSecret = 'your-client-secret'
$TenantId = 'your-tenant-id'
$cred = ConvertTo-GraphCredential -ClientId $ClientId -ClientSecret $ClientSecret -DirectoryId $TenantId
$graph = Connect-EmailGraph -Credential $cred
# 1. Show the first 10 messages with their IDs
Get-EmailGraphMessage -Connection $graph -UserPrincipalName 'user@example.com' -Limit 10 |
Select-Object Id, From, Subject
# 2. Display details for the newest message
$m = Get-EmailGraphMessage -Connection $graph -UserPrincipalName 'user@example.com' -Limit 1
$m.Raw | Format-List
# 3. Mark the message as read
Set-GraphMessage -UserPrincipalName 'user@example.com' -MessageId $m.Id -Read -Connection $graph
# 4. Mark it as unread again
Set-GraphMessage -UserPrincipalName 'user@example.com' -MessageId $m.Id -Read:$false -Connection $graph
# 5. Find messages from a sender with a given subject
$reports = Get-EmailGraphMessage -Connection $graph -UserPrincipalName 'user@example.com' -FromContains 'alerts@example.com' -Subject 'Report'
# 6. Mark all matching messages as read
foreach ($msg in $reports) { Set-GraphMessage -UserPrincipalName 'user@example.com' -MessageId $msg.Id -Read -Connection $graph }
# 7. Move the processed messages to Archive
foreach ($msg in $reports) { Move-GraphMessage -UserPrincipalName 'user@example.com' -MessageId $msg.Id -DestinationFolderId 'Archive' -Connection $graph }
# 8. Wait for a new message
$listener = Wait-GraphMessage -Connection $graph -UserPrincipalName 'user@example.com' -TimeoutSeconds 60
# 9. Output the subject of the arrived message
$listener.Message | Select-Object -ExpandProperty subject
# 10. Disconnect
Disconnect-EmailGraph -Connection $graph
================================================
FILE: Examples/Example-SetImapFolder.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$cred = Get-Credential
$client = Connect-IMAP -Server 'imap.example.com' -Credential $cred -Port 993 -Options Auto
# 1. Display the current folder
$client.Folder.FullName
# 2. Change the working folder to 'Archive'
Set-IMAPFolder -Client $client -Path 'Archive'
# 3. List first 10 messages from 'Archive'
Get-IMAPMessage -Client $client -All | Select-Object -First 10 Uid, Subject
# 4. Switch to a nested folder with write access
Set-IMAPFolder -Client $client -Path 'Projects/2025' -FolderAccess ReadWrite
# 5. Show message count in the new folder
$client.Count
# 6. Return to Inbox
Set-IMAPFolder -Client $client -Path 'INBOX'
# 7. Switch to Sent Items
Set-IMAPFolder -Client $client -Path '[Gmail]/Sent Mail'
# 8. Mark a message in Sent Items as read
Set-IMAPMessage -Client $client -Uid 123 -Read
# 9. Change back to 'Archive'
Set-IMAPFolder -Client $client -Path 'Archive'
# 10. Disconnect
Disconnect-IMAP -Client $client
================================================
FILE: Examples/Example-SetImapMessage.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$cred = Get-Credential
$client = Connect-IMAP -Server 'imap.example.com' -Credential $cred -Port 993 -Options Auto
# 1. Show the first 10 messages with their UIDs
Get-IMAPMessage -Client $client -All | Select-Object -First 10 Uid, From, Subject
# 2. Display which email has UID 10
Get-IMAPMessage -Client $client -Uid 10 | ForEach-Object { $_.Raw.Message }
# 3. Mark message with UID 10 as read
Set-IMAPMessage -Client $client -Uid 10 -Read
# 4. Mark message UID 5 from 'Archive' as unread
Set-IMAPMessage -Client $client -Uid 5 -Unread -Folder 'Archive'
# 5. Find messages from a sender with a matching subject
$reports = Get-IMAPMessage -Client $client -FromContains 'alerts@example.com' -Subject 'Report'
# 6. Mark all matching messages as read
foreach ($msg in $reports) { Set-IMAPMessage -Client $client -Uid $msg.Uid.Id -Read }
# 7. Change folder to 'Archive'
Set-IMAPFolder -Client $client -Path 'Archive'
# 8. List the top 5 messages from the new folder
Get-IMAPMessage -Client $client -All | Select-Object -First 5 Uid, Subject
# 9. Mark every message in the folder as read
Get-IMAPMessage -Client $client -All | ForEach-Object { Set-IMAPMessage -Client $client -Uid $_.Uid.Id -Read }
# 10. Disconnect
Disconnect-IMAP -Client $client
================================================
FILE: Examples/Example-SetPop3Message.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$cred = Get-Credential
$client = Connect-POP3 -Server 'pop.example.com' -Credential $cred -Port 995 -Options Auto
# 1. List first 10 messages with their indexes
Get-POP3Message -Client $client -All | Select-Object -First 10 Index, From, Subject
# 2. Display the message stored at index 1
Get-POP3Message -Client $client -Index 1 | ForEach-Object { $_.Raw.Message }
# 3. Mark the first message as read
Set-POP3Message -Client $client -Index 0 -Read
# 4. Mark the second message as unread
Set-POP3Message -Client $client -Index 1 -Unread
# 5. Find messages from a sender with a subject filter
$matches = Get-POP3Message -Client $client -FromContains 'alerts@example.com' -Subject 'Report'
# 6. Mark all matching messages as read
foreach ($msg in $matches) { Set-POP3Message -Client $client -Index $msg.Index -Read }
# 7. Mark every message as unread
for ($i = 0; $i -lt $client.Count; $i++) { Set-POP3Message -Client $client -Index $i -Unread }
# 8. List the top 5 messages again
Get-POP3Message -Client $client -All | Select-Object -First 5 Index, Subject
# 9. Fetch a specific message by index
$firstMsg = Get-POP3Message -Client $client -Index 0
# 10. Disconnect
Disconnect-POP3 -Client $client
================================================
FILE: Examples/Example-SmtpConnectionPoolMetrics.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
# Display pool size changes using a helper cmdlet
$watcher = Watch-SmtpConnectionPool -Action { param($s) Write-Host "Pool size: $($s.CurrentPoolSize)" }
# Reset any existing pooled connections
Clear-SmtpConnectionPool
$common = @{
From = 'sender@example.com'
To = 'recipient@example.com'
Subject = 'Test'
Server = 'smtp.example.com'
UseConnectionPool = $true
ConnectionPoolSize = 3
WhatIf = $true
}
# Send twice to show pool size events
Send-EmailMessage @common
Send-EmailMessage @common
# Clear the pool and display final size
Clear-SmtpConnectionPool
$snapshot = Get-SmtpConnectionPool
Write-Host "Current pool size: $($snapshot.CurrentPoolSize)"
[Mailozaurr.SmtpConnectionPool]::remove_PoolSizeChanged($watcher)
================================================
FILE: Examples/Example-TestSmtpConnection.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
# Examine server capabilities and check if connections stay open
$info = Test-SmtpConnection -Server 'smtp.example.com' -Port 587
if ($info.Persistent) {
Write-Host "Server keeps the connection open. Enabling pooling."
$poolSettings = @{ UseConnectionPool = $true; ConnectionPoolSize = 2 }
} else {
Write-Warning "Server closes the connection after each command. Pooling disabled."
$poolSettings = @{}
}
Send-EmailMessage -From 'sender@example.com' -To 'recipient@example.com' -Server 'smtp.example.com' @poolSettings -WhatIf
================================================
FILE: Examples/Example-ValidateEmail.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
Write-Color -Text "Testing via parameter" -Color Green
Test-EmailAddress -EmailAddress 'evotec@test', 'evotec@test.pl', 'evotec.@test.pl', 'evotec.p@test.pl.', 'olly@somewhere...com', 'olly@somewhere.', 'olly@somewhere', 'user@☎.com', '.@domain.tld' | Format-Table
Write-Color -Text "Testing via pipeline" -Color Green
'evotec@test', 'evotec@test.pl', 'evotec.@test.pl', 'evotec.p@test.pl.', 'olly@somewhere...com', 'olly@somewhere.', 'olly@somewhere', 'user@☎.com', '.@domain.tld', "testme@zumpul.com" | Test-EmailAddress -Verbose | Format-Table
================================================
FILE: Examples/Example-WaitGraphMessage.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$cred = Get-Credential
$graph = Connect-EmailGraph -Credential $cred
Write-Host 'Waiting for new Graph messages from alice@example.com or until timeout.'
Wait-GraphMessage -Connection $graph -UserPrincipalName 'user@example.com' -Until {
param($m)
$m.from.emailAddress.address -eq 'alice@example.com'
} -StopOnMatch -TimeoutSeconds 600 -Action {
param($msg)
Write-Host "New message from Alice: $($msg.subject)"
}
Disconnect-EmailGraph -Connection $graph
================================================
FILE: Examples/Example-WaitImapMessage.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$credential = Get-Credential
$client = Connect-IMAP -Server 'imap.example.com' -Credential $credential
Write-Host 'Waiting for new IMAP messages from alice@example.com.'
Wait-IMAPMessage -Client $client -Until {
param($m)
$m.Message.From.Mailboxes.Address -contains 'alice@example.com'
} -StopOnMatch -TimeoutSeconds 600 -Action {
param($msg)
Write-Host "New IMAP message from Alice: $($msg.Message.Subject)"
}
Disconnect-IMAP -Client $client
================================================
FILE: Examples/Example-WaitImapMessageSearchQuery.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$credential = Get-Credential
$client = Connect-IMAP -Server 'imap.example.com' -Credential $credential
Write-Host 'Waiting for new IMAP messages from alice@example.com.'
Wait-IMAPMessage -Client $client -SearchQuery ([MailKit.Search.SearchQuery]::FromContains('alice@example.com')) -StopOnMatch -TimeoutSeconds 600 -Action {
param($msg)
Write-Host "New IMAP message from Alice: $($msg.Message.Subject)"
}
Disconnect-IMAP -Client $client
================================================
FILE: Examples/Example-WaitPop3Message.ps1
================================================
Import-Module $PSScriptRoot\..\Mailozaurr.psd1 -Force
$cred = Get-Credential
$client = Connect-POP3 -Server 'pop.example.com' -Credential $cred
Write-Host 'Waiting for new POP3 messages from alice@example.com.'
Wait-POP3Message -Client $client -Until {
param($m)
$m.Message.From.Mailboxes.Address -contains 'alice@example.com'
} -StopOnMatch -TimeoutSeconds 600 -Action {
param($msg)
Write-Host "New POP3 message from Alice: $($msg.Message.Subject)"
}
Disconnect-POP3 -Client $client
================================================
FILE: Examples/GraphRules/Example-GetInboxRules.ps1
================================================
Import-Module $PSScriptRoot\..\..\Mailozaurr.psd1 -Force
$ClientId = 'your-client-id'
$ClientSecret = 'your-client-secret'
$TenantId = 'your-tenant-id'
$cred = ConvertTo-GraphCredential -ClientId $ClientId -ClientSecret $ClientSecret -DirectoryId $TenantId
$graph = Connect-EmailGraph -Credential $cred
# Retrieve all rules
Get-GraphInboxRule -UserPrincipalName 'user@example.com' -Connection $graph | Format-Table DisplayName, Id
# Retrieve rule by display name without using Where-Object
Get-GraphInboxRule -UserPrincipalName 'user@example.com' -Connection $graph -Filter "displayName eq 'Move Boss Mail'"
Disconnect-EmailGraph
================================================
FILE: Examples/GraphRules/Example-NewInboxRule.ps1
================================================
Import-Module $PSScriptRoot\..\..\Mailozaurr.psd1 -Force
$ClientId = 'your-client-id'
$ClientSecret = 'your-client-secret'
$TenantId = 'your-tenant-id'
$cred = ConvertTo-GraphCredential -ClientId $ClientId -ClientSecret $ClientSecret -DirectoryId $TenantId
$graph = Connect-EmailGraph -Credential $cred
# Create rule using typed parameters directly
New-GraphInboxRule -UserPrincipalName 'user@example.com' -Connection $graph `
-DisplayName 'Move Boss Mail' -Sequence 1 -SenderContains 'boss@example.com' `
-MoveToFolder 'Archive' -Enabled
# Create another rule to delete spam by subject
New-GraphInboxRule -UserPrincipalName 'user@example.com' -Connection $graph `
-DisplayName 'Delete Spam Subject' -Sequence 2 -SubjectContains 'spam' -Delete
Disconnect-EmailGraph
================================================
FILE: Examples/GraphRules/Example-RemoveInboxRule.ps1
================================================
Import-Module $PSScriptRoot\..\..\Mailozaurr.psd1 -Force
$ClientId = 'your-client-id'
$ClientSecret = 'your-client-secret'
$TenantId = 'your-tenant-id'
$cred = ConvertTo-GraphCredential -ClientId $ClientId -ClientSecret $ClientSecret -DirectoryId $TenantId
$graph = Connect-EmailGraph -Credential $cred
$rule = Get-GraphInboxRule -UserPrincipalName 'user@example.com' -Connection $graph -Filter "displayName eq 'Move Boss Mail'" | Select-Object -First 1
if ($rule) {
Remove-GraphInboxRule -UserPrincipalName 'user@example.com' -RuleId $rule.Id -Connection $graph -WhatIf
}
Disconnect-EmailGraph
================================================
FILE: Examples/GraphRules/Example-RuleBuilder.ps1
================================================
Import-Module $PSScriptRoot\..\..\Mailozaurr.psd1 -Force
$ClientId = 'your-client-id'
$ClientSecret = 'your-client-secret'
$TenantId = 'your-tenant-id'
$cred = ConvertTo-GraphCredential -ClientId $ClientId -ClientSecret $ClientSecret -DirectoryId $TenantId
$graph = Connect-EmailGraph -Credential $cred
# Build a rule that moves messages from the boss to Archive and stops processing
$builder = New-GraphInboxRuleBuilder -DisplayName 'Boss Archive' -Sequence 1 -SenderContains 'boss@example.com' -MoveToFolder 'Archive' -StopProcessing
New-GraphInboxRule -UserPrincipalName 'user@example.com' -Connection $graph -RuleBuilder $builder
# Build and create a rule that forwards urgent messages
$forward = New-GraphInboxRuleBuilder -DisplayName 'Forward Urgent' -Sequence 2 -SubjectContains 'urgent' -ForwardTo 'assistant@example.com' -Enabled
New-GraphInboxRule -UserPrincipalName 'user@example.com' -Connection $graph -RuleBuilder $forward
# Build and create a rule that deletes spam
$spam = New-GraphInboxRuleBuilder -DisplayName 'Delete Spam' -Sequence 3 -SenderContains 'spam@example.com' -Delete
New-GraphInboxRule -UserPrincipalName 'user@example.com' -Connection $graph -RuleBuilder $spam
================================================
FILE: Examples/GraphRules/Example-SetInboxRule.ps1
================================================
Import-Module $PSScriptRoot\..\..\Mailozaurr.psd1 -Force
$cred = Get-Credential
$graph = Connect-EmailGraph -Credential (ConvertTo-GraphCredential -ClientId $cred.UserName -ClientSecret $cred.GetNetworkCredential().Password -DirectoryId 'tenant')
$rule = Get-GraphInboxRule -UserPrincipalName 'user@example.com' -Connection $graph -Filter "displayName eq 'Move Boss Mail'" | Select-Object -First 1
if ($rule) {
$rule.Actions.MoveToFolder = 'Inbox'
Set-GraphInboxRule -UserPrincipalName 'user@example.com' -RuleId $rule.Id -Connection $graph -RuleObject $rule
}
Disconnect-EmailGraph
================================================
FILE: Examples/PGPKeys/mimekit.gpg.pub
================================================
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.14 (Darwin)
mQENBFJ2lrsBCADGGY9BKBt+8AuCpso1XJBxihBPyQ03WdzAO3u3jRsqyqp+e56D
OWvW/hKIlCQWnfWEtebGcqSfe/O1bHe7G+kpKbBs2imiSIZN6T2wcGtQGBmQAnqM
pBfTwi6WZyzb+yKOSfSRi1bVn1GjvgTvdzeg4d1dOdUjLsngXopjxYLE3QEb/S2+
bUE9sgp5YvQmlkgqd1GG06ggtx+T0a5iRvddvGGufKHsyncrQwfCy0FtmJ1a7zgW
DnbYMk40Il8u9jZ0UOj7qbiBr44/3lKbAp2jr++8oSLGJdqzDoUsjnH0dTzdY671
pnPuh13zrDHIjmK3X19aMWzUay2xnkWNYin9ABEBAAG0J01pbWVLaXQgVW5pdFRl
c3RzIDxtaW1la2l0QGV4YW1wbGUuY29tPokBOAQTAQIAIgUCUnaWuwIbAwYLCQgH
AwIGFQgCCQoLBBYCAwECHgECF4AACgkQUNzRB6sIIaL9UwgAma04xyO7cTp8Q52M
N5aEYr7xr9aXZmnHlMW8UIv23prRcjSxabFJaxknylH7+ekRTfcVxDXA/D9sexEm
8NYcts2t2sQVdjgAra6e8NBFc3wvLTliT/OQ60lfb+RFcYTDBCsLTecItYWbk34d
5kg0h7TScmcwTTV5pyKVyi/FkWWejVB93WlqgC35aoebaJBkFh3ePmuGeVE5jfGR
X5f32OOjy23yy8unQDsAnvcxoQWcPbgFRmt8Mlx+jBoaCLsTIhqrWSNDRmWo7vb8
YCkQMjaHwZ6zwablJveeOoTJyPlSlmLg9idewcUwwtFPcARolnXT+VdcIRUy63JY
w+buirkBDQRSdpa7AQgAwrmMqEaAFlDejEAxMiBuYhDSo5mWwUb/RfkwyxhCdsk3
BcjyNRuge4Z3KEafrzlIi76WQQqDEHJmaM8Cl62oaxv71I8KNuoh/lYHOSYxBMIS
0ZnMJo42SjQWCmS3hlEpkPDA6ffaK81VM3fIwGKvpEEnvtPMl12DMk2aaaebeWM7
MRjjtWLNuUutdjTVE3TjXoBkfOv1IfAZ15whkrvKdV1rIl3gEuQ6CAqNaQsY/nlY
efhpsQ548yueXzqUyQm4AduGGMOkSxQ0pi34C55kFiuwFnFUJzlLTc94TzWpaqv/
Ljdj2d5zM512YkVznrh1y6ZLNlsNdqjKz20DWdMmAQARAQABiQEfBBgBAgAJBQJS
dpa7AhsMAAoJEFDc0QerCCGiuvoH/AmNNLfaI3qJb2dWKS8/OGkaCOE/yVdqmIg9
6/iNhIGDiGcKCN332w6qy9BhQJmvlwLQZYn5M6c71t6U5hcsmJBHAOqrZB0WZgdy
S4/Hg6tWcBnPmfQAoojxahDeSv6C6LuyF08Bv7fiGWQcppBIIzG6rxz69R6/k5hn
l3rCHrjKoCr9JUPfPzuSJCLrGlmp73iA038R1+X3nGugJA+lFSSEBVMyE9/RUHCb
6Odjdz1ge7VcFxaVqMYfpFMgKrKUPTB98mv348TGjcUGYaR2ze509KL04Hvg7Za2
5zF93LblTVWBEeb+laC2uI8Gl0WivgMmXQa9x6BNcLA5f8uN8Xs=
=ujkw
-----END PGP PUBLIC KEY BLOCK-----
================================================
FILE: Examples/PGPKeys/mimekit.gpg.sec
================================================
-----BEGIN PGP PRIVATE KEY BLOCK-----
Version: GnuPG v1.4.14 (Darwin)
lQO+BFJ2lrsBCADGGY9BKBt+8AuCpso1XJBxihBPyQ03WdzAO3u3jRsqyqp+e56D
OWvW/hKIlCQWnfWEtebGcqSfe/O1bHe7G+kpKbBs2imiSIZN6T2wcGtQGBmQAnqM
pBfTwi6WZyzb+yKOSfSRi1bVn1GjvgTvdzeg4d1dOdUjLsngXopjxYLE3QEb/S2+
bUE9sgp5YvQmlkgqd1GG06ggtx+T0a5iRvddvGGufKHsyncrQwfCy0FtmJ1a7zgW
DnbYMk40Il8u9jZ0UOj7qbiBr44/3lKbAp2jr++8oSLGJdqzDoUsjnH0dTzdY671
pnPuh13zrDHIjmK3X19aMWzUay2xnkWNYin9ABEBAAH+AwMC5K94HuixOdZggwd0
KkaW5GBV8rBnM7o3fJ+dHgvn1J4ReqJMwRJj/PMN2nUmXhoZqxOCo5nL4oxz36js
hrJZB36AepZJfAmAQtxZAkeP5MHWAmGofLCDQnDsrHVhNfFmFO0G4XHOBznqg/N6
E0e4Mcp+ouS8woBzDYOYe9gxK5iKFYLbQFZjG5ZA1fJdM82h9aQCGXr+ZVIzWr5U
qHjEq8tcsryhCysoA87fdhoS91YdgDEmgHSyjrl5s+7BOA13lk/fOjUfqA5qjrba
cJhRGEAI19UTE6lnBrCvDg4sFoQWqzuZdXTRnv+LJrWEjVpv/BqC/8K4ZgIbp0FN
kdIRqOETl18futWbSuEHeVTsqzOHQWmrxCzd2SU+orIpvXHYCb1yvdZo3YsP4FNv
aTPZu4VCORhBAVO6rhHInARrUmSoKFIuO0j8v2nIAbLjogkDMftpDQ3DYhimbVf0
My03+4lnHk0/llLUYqBnGf7J2H5yfXOt6grhC3jYPBlFfpn3r5gU30M8cho3KcXa
Qxehu6u3u38OfHNGbKAG14Zbf5hOtztX4XpxK6oWbXFztGtpWhjsA5WovTaNw/Av
v5/3iNSTfQJYlgp6B0YpMJ9qsnLF4cMl30pxuZVNEJ1KLXTNkK74juENkVplxpgN
Ry+iYYsGXVMuWDNX9BJ54YbnzF9PFcQ9b95oLhpsH5KcPTuMkQeNSqBkXCPIbpr2
/DFcdUchJYlzJX0hxCXrTzNr1fQ48JO7jNvC/X1kOrBDCGxFzvinuAzHBuPB2prO
5xYgjXSqhuGEZL1crB9Sk7ECn7bSxywLj31rBehZ7YurhkIOEffxRUV4uGZhTMqk
rW92/fzXhZXk4sLBMnqPYWLTtzkrCdIVj5+Gw8LhLj1W6DO1LqpM8kuDFGmJB7C+
2LQnTWltZUtpdCBVbml0VGVzdHMgPG1pbWVraXRAZXhhbXBsZS5jb20+iQE4BBMB
AgAiBQJSdpa7AhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRBQ3NEHqwgh
ov1TCACZrTjHI7txOnxDnYw3loRivvGv1pdmaceUxbxQi/bemtFyNLFpsUlrGSfK
Ufv56RFN9xXENcD8P2x7ESbw1hy2za3axBV2OACtrp7w0EVzfC8tOWJP85DrSV9v
5EVxhMMEKwtN5wi1hZuTfh3mSDSHtNJyZzBNNXmnIpXKL8WRZZ6NUH3daWqALflq
h5tokGQWHd4+a4Z5UTmN8ZFfl/fY46PLbfLLy6dAOwCe9zGhBZw9uAVGa3wyXH6M
GhoIuxMiGqtZI0NGZaju9vxgKRAyNofBnrPBpuUm9546hMnI+VKWYuD2J17BxTDC
0U9wBGiWddP5V1whFTLrcljD5u6KnQO+BFJ2lrsBCADCuYyoRoAWUN6MQDEyIG5i
ENKjmZbBRv9F+TDLGEJ2yTcFyPI1G6B7hncoRp+vOUiLvpZBCoMQcmZozwKXrahr
G/vUjwo26iH+Vgc5JjEEwhLRmcwmjjZKNBYKZLeGUSmQ8MDp99orzVUzd8jAYq+k
QSe+08yXXYMyTZppp5t5YzsxGOO1Ys25S612NNUTdONegGR86/Uh8BnXnCGSu8p1
XWsiXeAS5DoICo1pCxj+eVh5+GmxDnjzK55fOpTJCbgB24YYw6RLFDSmLfgLnmQW
K7AWcVQnOUtNz3hPNalqq/8uN2PZ3nMznXZiRXOeuHXLpks2Ww12qMrPbQNZ0yYB
ABEBAAH+AwMC5K94HuixOdZgK/OJU6DvtgeKSAKZuy/UhjUKKc6/+ObFQv8CXEud
JKfWIQ5Nc15GTcFYcOsYD4WJPicRFx+CWknjwC9FP2szsELGZLOAt9xFFzgCGp2I
j63UrquLQe/6rgh3hG36yLClmo6qTvMMU+UOmc3IRlPHkm9hnjgI+UWa13oAIKoT
fNfqR1Oydzob9B6kTyg7KD5UJz3smIef48y2zc3H7xl24kb6nbI8Qp60M38FwwGE
n076cOR3wjlhEaX48rDwfoOTZVePYNROZQp+V2osE+Kxe5eDzg5CMx4wQtLgNP7N
7MorIm6kLMyAbs5A8RBe+T4hrYo7DrcYKxPUXOGWugvGcbyn+ClZ5wqDa3sFhSwu
zyyiM2PdJOoticV0F6exmu6wKquP6BM2yVKzg6U1tR046ezq6xQVwFVZb/6uGRKx
UoBnYmadOoRnUp3xyWzTp3Yr0SxUH3ZBKYklIY458YN9VPzxeSn2TnxSdPr5Sayg
z77Ua0/udV06GIrngOBJDyWJVi3iuqMerA9LiZtYvoTtO7eLoUUVF7d+TCDcNKtK
Z4cDjHhuamSUjAOBZC+GSM2EX8V9hVmGQSIDmE1+aW/Ny6gQD4iDXZO0XIIG1ocJ
NOS0jEIFZyPkJb9qghwlRIwWaequmTS4OOfC+nbGeshkhn9MYdXlXntKinV2Ao66
+7mb0YQEF6gGTGG8sWCnY8oOjAtI5OVZDf1YAUrybr1tOrhv0MsqYEeO+5zJx4Nk
1zIcJqQ/KaBM0/Y1Bj6CXlFV2zwer7O3EbxzRKjOeu6/TFZ1Nfw6EjH3/kXXthh3
BoW0ZJNBIOeIsVXVMytW4d+/K6GCMxp1obO9NvfaoKTfZZJDsFYJIso+DYRZTm/D
lOJPc60t9wlidAqlZKz/JVWj3Tfb3YkBHwQYAQIACQUCUnaWuwIbDAAKCRBQ3NEH
qwghorr6B/wJjTS32iN6iW9nVikvPzhpGgjhP8lXapiIPev4jYSBg4hnCgjd99sO
qsvQYUCZr5cC0GWJ+TOnO9belOYXLJiQRwDqq2QdFmYHckuPx4OrVnAZz5n0AKKI
8WoQ3kr+gui7shdPAb+34hlkHKaQSCMxuq8c+vUev5OYZ5d6wh64yqAq/SVD3z87
kiQi6xpZqe94gNN/Edfl95xroCQPpRUkhAVTMhPf0VBwm+jnY3c9YHu1XBcWlajG
H6RTICqylD0wffJr9+PExo3FBmGkds3udPSi9OB74O2Wtucxfdy25U1VgRHm/pWg
triPBpdFor4DJl0GvcegTXCwOX/LjfF7
=P/Su
-----END PGP PRIVATE KEY BLOCK-----
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2024 Przemysław Kłys @ Evotec
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: Mailozaurr.AzurePipelines.yml
================================================
trigger: none
pr: none
variables:
buildConfiguration: 'Debug'
dotNetVersion: '8.x'
stages:
# .NET Testing Stage - Core functionality testing
- stage: DotNetTests
displayName: '.NET Build & Test'
jobs:
- job: DotNet_Windows
displayName: '.NET Tests - Windows'
pool:
vmImage: 'windows-latest'
steps:
- task: UseDotNet@2
displayName: 'Install .NET SDK'
inputs:
packageType: 'sdk'
version: $(dotNetVersion)
- task: DotNetCoreCLI@2
displayName: 'Restore .NET Dependencies'
inputs:
command: 'restore'
projects: 'Sources/Mailozaurr.sln'
- task: DotNetCoreCLI@2
displayName: 'Build .NET Solution'
inputs:
command: 'build'
projects: 'Sources/Mailozaurr.sln'
arguments: '--configuration $(buildConfiguration) --no-restore'
- task: DotNetCoreCLI@2
displayName: 'Run .NET Tests'
inputs:
command: 'test'
projects: 'Sources/Mailozaurr.sln'
arguments: '--configuration $(buildConfiguration) --no-build --logger trx --collect:"XPlat Code Coverage"'
- task: PublishTestResults@2
displayName: 'Publish .NET Test Results'
inputs:
testResultsFormat: 'VSTest'
testResultsFiles: '**/*.trx'
mergeTestResults: true
condition: succeededOrFailed()
- job: DotNet_Ubuntu
displayName: '.NET Tests - Ubuntu'
pool:
vmImage: 'ubuntu-latest'
steps:
- task: UseDotNet@2
displayName: 'Install .NET SDK'
inputs:
packageType: 'sdk'
version: $(dotNetVersion)
- script: |
sudo apt-get update
sudo apt-get install -y mono-complete
displayName: 'Install Mono for .NET Framework tests'
- task: DotNetCoreCLI@2
displayName: 'Restore .NET Dependencies'
inputs:
command: 'restore'
projects: 'Sources/Mailozaurr.sln'
- task: DotNetCoreCLI@2
displayName: 'Build .NET Solution'
inputs:
command: 'build'
projects: 'Sources/Mailozaurr.sln'
arguments: '--configuration $(buildConfiguration) --no-restore'
- task: DotNetCoreCLI@2
displayName: 'Run .NET Tests'
inputs:
command: 'test'
projects: 'Sources/Mailozaurr.sln'
arguments: '--configuration $(buildConfiguration) --no-build --logger trx'
- job: DotNet_MacOS
displayName: '.NET Tests - macOS'
pool:
vmImage: 'macos-latest'
steps:
- task: UseDotNet@2
displayName: 'Install .NET SDK'
inputs:
packageType: 'sdk'
version: $(dotNetVersion)
- script: |
brew update
brew install mono
displayName: 'Install Mono for .NET Framework tests'
- task: DotNetCoreCLI@2
displayName: 'Restore .NET Dependencies'
inputs:
command: 'restore'
projects: 'Sources/Mailozaurr.sln'
- task: DotNetCoreCLI@2
displayName: 'Build .NET Solution'
inputs:
command: 'build'
projects: 'Sources/Mailozaurr.sln'
arguments: '--configuration $(buildConfiguration) --no-restore'
- task: DotNetCoreCLI@2
displayName: 'Run .NET Tests'
inputs:
command: 'test'
projects: 'Sources/Mailozaurr.sln'
arguments: '--configuration $(buildConfiguration) --no-build --logger trx'
# PowerShell Testing Stage - Module integration testing (independent of .NET stage)
- stage: PowerShellTests
displayName: 'PowerShell Module Tests'
condition: always()
jobs:
- job: PowerShell_Windows_PS5
displayName: 'PowerShell 5.1 - Windows'
pool:
vmImage: 'windows-latest'
steps:
- task: UseDotNet@2
displayName: 'Install .NET SDK'
inputs:
packageType: 'sdk'
version: $(dotNetVersion)
- task: DotNetCoreCLI@2
displayName: 'Build .NET Solution'
inputs:
command: 'build'
projects: 'Sources/Mailozaurr.sln'
arguments: '--configuration $(buildConfiguration)'
- powershell: |
Write-Host "PowerShell Version: $($PSVersionTable.PSVersion)"
Install-Module -Name Pester -Repository PSGallery -Force -SkipPublisherCheck -AllowClobber
Install-Module -Name PSWriteColor -Repository PSGallery -Force -SkipPublisherCheck -AllowClobber
displayName: "Install Required PowerShell Modules"
- powershell: |
.\Mailozaurr.Tests.ps1
displayName: "Run PowerShell Tests (PS 5.1)"
- job: PowerShell_Windows_PS7
displayName: 'PowerShell 7 - Windows'
pool:
vmImage: 'windows-latest'
steps:
- task: UseDotNet@2
displayName: 'Install .NET SDK'
inputs:
packageType: 'sdk'
version: $(dotNetVersion)
- task: DotNetCoreCLI@2
displayName: 'Build .NET Solution'
inputs:
command: 'build'
projects: 'Sources/Mailozaurr.sln'
arguments: '--configuration $(buildConfiguration)'
- pwsh: |
Write-Host "PowerShell Version: $($PSVersionTable.PSVersion)"
Install-Module -Name Pester -Repository PSGallery -Force -SkipPublisherCheck -AllowClobber
Install-Module -Name PSWriteColor -Repository PSGallery -Force -SkipPublisherCheck -AllowClobber
displayName: "Install Required PowerShell Modules"
- pwsh: |
.\Mailozaurr.Tests.ps1
displayName: "Run PowerShell Tests (PS 7)"
- job: PowerShell_Ubuntu
displayName: 'PowerShell 7 - Ubuntu'
pool:
vmImage: 'ubuntu-latest'
steps:
- task: UseDotNet@2
displayName: 'Install .NET SDK'
inputs:
packageType: 'sdk'
version: $(dotNetVersion)
- script: |
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list | sudo tee /etc/apt/sources.list.d/microsoft.list
sudo apt-get update
gitextract_lxvxdwwn/ ├── .editorconfig ├── .gitattributes ├── .github/ │ ├── FUNDING.yml │ └── workflows/ │ ├── claude-code-review.yml │ ├── claude.yml │ ├── dotnet-tests.yml │ └── powershell-tests-all.yml ├── .gitignore ├── Build/ │ ├── Artefacts/ │ │ └── ProjectBuild/ │ │ └── project.build.plan.json │ ├── Build-Module.ps1 │ ├── Build-Project.ps1 │ ├── Refresh-DisposableDomains.ps1 │ └── project.build.json ├── CHANGELOG.MD ├── Docs/ │ ├── Configuration-and-Usage.md │ ├── OAuthFlows.md │ ├── PGP.md │ └── Platform-Architecture.md ├── Examples/ │ ├── Example-AcquireGoogleTokenInteractive.ps1 │ ├── Example-AcquireO365TokenInteractive.ps1 │ ├── Example-ClearGraphJunk.ps1 │ ├── Example-ClearImapJunk.ps1 │ ├── Example-ConnecToImap-01.ps1 │ ├── Example-ConnecToImap-02.ps1 │ ├── Example-ConnecToImap-03-oAuth.ps1 │ ├── Example-ConnecToPop3-01.ps1 │ ├── Example-ConnecToPop3-02.ps1 │ ├── Example-ConnecToPop3-03-oAuth.ps1 │ ├── Example-ConnectEmailGraph-DeviceCode.ps1 │ ├── Example-ConnectEmailGraph-OnBehalfOf.ps1 │ ├── Example-ConvertFromEmlToMsg.ps1 │ ├── Example-DeleteImapMessages.ps1 │ ├── Example-DeletePop3Messages.ps1 │ ├── Example-EmailPendingMessages.ps1 │ ├── Example-ExtractLocalImagePaths.ps1 │ ├── Example-ForwardMessageAttachmentFiltered.ps1 │ ├── Example-GetEmailDeliveryMatch.ps1 │ ├── Example-GetEmailDeliveryStatus.ps1 │ ├── Example-GetGraphDmarcReport.ps1 │ ├── Example-GetGraphEvent.ps1 │ ├── Example-GetGraphMailboxStatistics-Console.ps1 │ ├── Example-GetGraphMailboxStatistics.ps1 │ ├── Example-GetImapDmarcReport.ps1 │ ├── Example-GetMailFolder.ps1 │ ├── Example-GetPop3DmarcReport.ps1 │ ├── Example-GmailApi-01-OAuth.ps1 │ ├── Example-GmailApi-02-SendMessage.ps1 │ ├── Example-GmailApi-03-SendEmailMessageProvider.ps1 │ ├── Example-GmailApi-04-ListMessages.ps1 │ ├── Example-GmailApi-05-GetMessage.ps1 │ ├── Example-GmailApi-06-SaveAttachments.ps1 │ ├── Example-GmailApi-07-DeleteMessage.ps1 │ ├── Example-GmailApi-08-FilterAndDelete.ps1 │ ├── Example-GmailApi-09-DownloadAttachments.ps1 │ ├── Example-GmailApi-10-SendWithAttachment.ps1 │ ├── Example-GmailApi-11-ListThreads.ps1 │ ├── Example-GmailApi-12-GetThread.ps1 │ ├── Example-GmailApi-13-SendWithHeaders.ps1 │ ├── Example-GmailApi-14-SearchNonDeliveryReports.ps1 │ ├── Example-GmailApi-15-GetDmarcReport.ps1 │ ├── Example-GraphMailboxPermissions.ps1 │ ├── Example-GraphManageMessages.ps1 │ ├── Example-ImapFilterScenarios.ps1 │ ├── Example-ImportMSG.ps1 │ ├── Example-ListImapFolderContents.ps1 │ ├── Example-ListImapRootFolders.ps1 │ ├── Example-ListImapRootFoldersOAuth.ps1 │ ├── Example-MoveMailFolder.ps1 │ ├── Example-NewGraphEvent.ps1 │ ├── Example-ParseGraphError.ps1 │ ├── Example-Pop3FilterScenarios.ps1 │ ├── Example-ProcessPendingMessages.ps1 │ ├── Example-QueryLanguageSearch.ps1 │ ├── Example-ReadGraphEncryption.ps1 │ ├── Example-ReadImapEncryption.ps1 │ ├── Example-ReadPop3Encryption.ps1 │ ├── Example-RemoveGmailMessage.ps1 │ ├── Example-RemoveMailFolder.ps1 │ ├── Example-RemoveMessageAttachment.ps1 │ ├── Example-RemoveMessageAttachmentFiltered.ps1 │ ├── Example-RemoveMessages-01.ps1 │ ├── Example-RemoveMessages-02.ps1 │ ├── Example-RenameMailFolder.ps1 │ ├── Example-RetrieveAndCorrelateNdr.ps1 │ ├── Example-RetryAlways.Tests.ps1 │ ├── Example-RetryAlways.cs │ ├── Example-SaveGmailMessageAttachment.ps1 │ ├── Example-SaveImapMessageAttachment.ps1 │ ├── Example-SaveImapMessageAttachmentFiltered.ps1 │ ├── Example-SaveMimeMessage.ps1 │ ├── Example-SavePop3MessageAttachment.ps1 │ ├── Example-SavePop3MessageAttachmentFiltered.ps1 │ ├── Example-SearchAndFind.ps1 │ ├── Example-SearchMessageBody.ps1 │ ├── Example-SendEmail-01-Text.ps1 │ ├── Example-SendEmail-01.ps1 │ ├── Example-SendEmail-02.ps1 │ ├── Example-SendEmail-Attachments.ps1 │ ├── Example-SendEmail-ConnectionPool-Advanced.ps1 │ ├── Example-SendEmail-ConnectionPool.ps1 │ ├── Example-SendEmail-CramMd5.ps1 │ ├── Example-SendEmail-DeduplicateAttachments.ps1 │ ├── Example-SendEmail-GmailApiProvider.ps1 │ ├── Example-SendEmail-Graph-Headers.ps1 │ ├── Example-SendEmail-Graph-Policy.ps1 │ ├── Example-SendEmail-Graph-SmtpFallback.ps1 │ ├── Example-SendEmail-Graph.ps1 │ ├── Example-SendEmail-GraphCertificate.ps1 │ ├── Example-SendEmail-GraphDeviceCode.ps1 │ ├── Example-SendEmail-GraphWithMgRequest.ps1 │ ├── Example-SendEmail-Headers.ps1 │ ├── Example-SendEmail-Mailgun-Headers.ps1 │ ├── Example-SendEmail-Mailgun.ps1 │ ├── Example-SendEmail-OAuthGmail.ps1 │ ├── Example-SendEmail-OAuthO365.ps1 │ ├── Example-SendEmail-Pgp.ps1 │ ├── Example-SendEmail-SendGrid-Headers.ps1 │ ├── Example-SendEmail-SendGrid01.ps1 │ ├── Example-SendEmail-SendGrid02.ps1 │ ├── Example-SendEmail-SentLog.ps1 │ ├── Example-SendEmail-Ses-Headers.ps1 │ ├── Example-SendEmail-SignEncrypt.ps1 │ ├── Example-SendEmail-TemporaryMailCrypto.ps1 │ ├── Example-SendEmail-TemporaryPgp.ps1 │ ├── Example-SendEmail-TemporarySmime.ps1 │ ├── Example-SendEmail-VerifyAttachment.ps1 │ ├── Example-SendEmailPendingMessage-ScheduleAndNotify.ps1 │ ├── Example-SendEmailPendingMessage-Scheduled.ps1 │ ├── Example-SetGraphMessage.ps1 │ ├── Example-SetImapFolder.ps1 │ ├── Example-SetImapMessage.ps1 │ ├── Example-SetPop3Message.ps1 │ ├── Example-SmtpConnectionPoolMetrics.ps1 │ ├── Example-TestSmtpConnection.ps1 │ ├── Example-ValidateEmail.ps1 │ ├── Example-WaitGraphMessage.ps1 │ ├── Example-WaitImapMessage.ps1 │ ├── Example-WaitImapMessageSearchQuery.ps1 │ ├── Example-WaitPop3Message.ps1 │ ├── GraphRules/ │ │ ├── Example-GetInboxRules.ps1 │ │ ├── Example-NewInboxRule.ps1 │ │ ├── Example-RemoveInboxRule.ps1 │ │ ├── Example-RuleBuilder.ps1 │ │ └── Example-SetInboxRule.ps1 │ └── PGPKeys/ │ ├── mimekit.gpg.pub │ └── mimekit.gpg.sec ├── LICENSE ├── Mailozaurr.AzurePipelines.yml ├── Mailozaurr.Tests.ps1 ├── Mailozaurr.psd1 ├── Mailozaurr.psm1 ├── README.MD ├── Sources/ │ ├── Mailozaurr/ │ │ ├── AmazonSES/ │ │ │ └── SesClient.cs │ │ ├── Attachment.cs │ │ ├── Authentication/ │ │ │ ├── LoginState.cs │ │ │ ├── OAuthCredentialCacheEntry.cs │ │ │ ├── OAuthHelpers.cs │ │ │ ├── OAuthTokenCache.cs │ │ │ ├── SaslMechanismNtlmIntegrated.cs │ │ │ └── TokenCacheHelper.cs │ │ ├── Compatibility/ │ │ │ ├── IsExternalInit.cs │ │ │ └── StringCompatibilityExtensions.cs │ │ ├── ComposeProfileUtilities.cs │ │ ├── Connections/ │ │ │ ├── ConnectionRetrier.cs │ │ │ ├── ImapConnectionRequest.cs │ │ │ ├── ImapConnector.cs │ │ │ ├── ImapSessionService.cs │ │ │ ├── Pop3Connector.cs │ │ │ ├── ProtocolAuth.cs │ │ │ └── SmtpSessionService.cs │ │ ├── Cryptography/ │ │ │ ├── AesCredentialProtector.cs │ │ │ ├── CredentialProtection.cs │ │ │ ├── CredentialProtectionPaths.cs │ │ │ ├── EphemeralOpenPgpContext.cs │ │ │ ├── ICredentialProtector.cs │ │ │ ├── TemporaryPgpKeyPair.cs │ │ │ ├── TemporarySmimeCertificate.cs │ │ │ └── WindowsCredentialProtector.cs │ │ ├── Definitions/ │ │ │ ├── AttachmentDescriptor.cs │ │ │ ├── MailComposeProfile.cs │ │ │ ├── OAuthCredential.cs │ │ │ └── ValidatedEmail.cs │ │ ├── DmarcReports/ │ │ │ ├── DmarcReport.cs │ │ │ ├── DmarcReportAttachment.cs │ │ │ ├── DmarcReportServiceBase.cs │ │ │ ├── GmailDmarcReportService.cs │ │ │ ├── GraphDmarcReportService.cs │ │ │ ├── ImapDmarcReportService.cs │ │ │ └── Pop3DmarcReportService.cs │ │ ├── EmailGraphMessage.cs │ │ ├── Enums/ │ │ │ ├── ActionPreference.cs │ │ │ ├── AuthenticationMechanism.cs │ │ │ ├── DeliveryNotification.cs │ │ │ ├── EmailAction.cs │ │ │ ├── EmailActionEncryption.cs │ │ │ ├── EmailEncryption.cs │ │ │ ├── EmailProvider.cs │ │ │ ├── GraphEndpoint.cs │ │ │ ├── GraphImportance.cs │ │ │ ├── GraphMailboxRole.cs │ │ │ └── MessagePriority.cs │ │ ├── Gmail/ │ │ │ ├── GmailApiClient.cs │ │ │ ├── GmailApiException.cs │ │ │ ├── GmailAttachmentInfo.cs │ │ │ ├── GmailAuthenticationException.cs │ │ │ ├── GmailLabel.cs │ │ │ ├── GmailMailboxBrowser.cs │ │ │ ├── GmailMessage.cs │ │ │ ├── GmailThread.cs │ │ │ └── GmailThreadInfo.cs │ │ ├── GraphCredential.cs │ │ ├── GraphEmailMessage.cs │ │ ├── Helpers/ │ │ │ ├── CAPI.cs │ │ │ ├── DictionaryExtensions.cs │ │ │ ├── EncryptionResult.cs │ │ │ ├── Helpers.cs │ │ │ ├── HtmlUtils.cs │ │ │ ├── LimitedStream.cs │ │ │ ├── ProtectedData.cs │ │ │ └── SecureStringHelper.cs │ │ ├── IDmarcReportService.cs │ │ ├── INonDeliveryReportService.cs │ │ ├── ImapEmailMessage.cs │ │ ├── ImapMessageInfo.cs │ │ ├── Logging/ │ │ │ ├── InternalLogger.cs │ │ │ ├── LogCollector.cs │ │ │ ├── LogEntry.cs │ │ │ ├── LogEventArgs.cs │ │ │ ├── LogType.cs │ │ │ ├── LoggingConfigurator.cs │ │ │ └── LoggingMessages.cs │ │ ├── MailboxBulkOperationResult.cs │ │ ├── Mailgun/ │ │ │ └── Mailgun.cs │ │ ├── Mailozaurr.csproj │ │ ├── Mailozaurr.csproj.DotSettings │ │ ├── MailozaurrOptions.cs │ │ ├── MicrosoftGraph/ │ │ │ ├── Graph.cs │ │ │ ├── GraphApiClient.cs │ │ │ ├── GraphApiDiagnostic.cs │ │ │ ├── GraphApiErrorDetail.cs │ │ │ ├── GraphApiErrorHeaders.cs │ │ │ ├── GraphApiErrorParser.cs │ │ │ ├── GraphApiErrorResponse.cs │ │ │ ├── GraphApiException.cs │ │ │ ├── GraphApiInnerError.cs │ │ │ ├── GraphApiServerInfo.cs │ │ │ ├── GraphAttachment.cs │ │ │ ├── GraphAttachmentItem.cs │ │ │ ├── GraphAttachmentItemWrapper.cs │ │ │ ├── GraphAttachmentPlaceHolder.cs │ │ │ ├── GraphAuthorization.cs │ │ │ ├── GraphBatchRequest.cs │ │ │ ├── GraphBatchResult.cs │ │ │ ├── GraphBulkOperationResult.cs │ │ │ ├── GraphContent.cs │ │ │ ├── GraphEmail.cs │ │ │ ├── GraphEmailAddress.cs │ │ │ ├── GraphErrors.cs │ │ │ ├── GraphEvent.cs │ │ │ ├── GraphEventAttendee.cs │ │ │ ├── GraphEventBuilder.cs │ │ │ ├── GraphEventTime.cs │ │ │ ├── GraphHttpMethod.cs │ │ │ ├── GraphInboxRule.cs │ │ │ ├── GraphInboxRuleActions.cs │ │ │ ├── GraphInboxRuleBuilder.cs │ │ │ ├── GraphInboxRulePredicates.cs │ │ │ ├── GraphInternetMessageHeader.cs │ │ │ ├── GraphLargeAttachmentUploader.cs │ │ │ ├── GraphMailFolder.cs │ │ │ ├── GraphMailMessage.cs │ │ │ ├── GraphMailMessageFlag.cs │ │ │ ├── GraphMailboxBrowser.cs │ │ │ ├── GraphMailboxFolderStatistics.cs │ │ │ ├── GraphMailboxGrantee.cs │ │ │ ├── GraphMailboxPermission.cs │ │ │ ├── GraphMailboxPermissionBuilder.cs │ │ │ ├── GraphMailboxStatistics.cs │ │ │ ├── GraphMessage.cs │ │ │ ├── GraphMessageAction.cs │ │ │ ├── GraphMessageContainer.cs │ │ │ ├── GraphMessageInfo.cs │ │ │ ├── GraphMimeMessageSender.cs │ │ │ ├── GraphMimePreparation.cs │ │ │ ├── GraphPages.cs │ │ │ ├── GraphRetryHelper.cs │ │ │ ├── GraphSendPolicy.cs │ │ │ └── GraphUploadSessionResult.cs │ │ ├── MicrosoftGraphUtils.cs │ │ ├── MimeKitUtils.cs │ │ ├── MimeMessageContent.cs │ │ ├── NativeMailboxBrowserSessions.cs │ │ ├── NativeMailboxThreadingMetadataOperations.cs │ │ ├── NonDeliveryReports/ │ │ │ ├── DsnDiagnosticCode.cs │ │ │ ├── DsnStatus.cs │ │ │ ├── DsnStatusClass.cs │ │ │ ├── GmailNonDeliveryReportService.cs │ │ │ ├── GraphNonDeliveryReportService.cs │ │ │ ├── ImapNonDeliveryReportService.cs │ │ │ ├── NonDeliveryReport.cs │ │ │ ├── NonDeliveryReportResult.cs │ │ │ ├── NonDeliveryReportServiceBase.cs │ │ │ ├── NonDeliveryReportSubjectPatterns.cs │ │ │ ├── NonDeliveryReportType.cs │ │ │ └── Pop3NonDeliveryReportService.cs │ │ ├── Pop3EmailMessage.cs │ │ ├── Pop3MessageInfo.cs │ │ ├── README.md │ │ ├── Receive/ │ │ │ ├── FolderOperations.cs │ │ │ ├── GraphMessageListener.cs │ │ │ ├── ImapBulkFlagOperations.cs │ │ │ ├── ImapClientFolderCache.cs │ │ │ ├── ImapDeleteOperations.cs │ │ │ ├── ImapIdleListener.cs │ │ │ ├── ImapMailboxSearchQueryBuilder.cs │ │ │ ├── ImapMessageReader.cs │ │ │ ├── ImapMoveOperations.cs │ │ │ ├── ImapRootFolderEnumerator.cs │ │ │ ├── ImapSentFolderResolver.cs │ │ │ ├── ImapSentMessageOperations.cs │ │ │ ├── JunkCleaner.cs │ │ │ ├── MailboxSearcher.cs │ │ │ ├── MessageFetcher.cs │ │ │ ├── MessageFlagSetter.cs │ │ │ ├── MessageRemover.cs │ │ │ ├── Pop3AttachmentPayloadBuilder.cs │ │ │ ├── Pop3MailboxBrowser.cs │ │ │ └── Pop3PollListener.cs │ │ ├── Resources/ │ │ │ ├── allowlist.conf │ │ │ └── disposable_email_blocklist.conf │ │ ├── SendGrid/ │ │ │ ├── SendGridAttachment.cs │ │ │ ├── SendGridClient.cs │ │ │ ├── SendGridContent.cs │ │ │ ├── SendGridEmailAddress.cs │ │ │ ├── SendGridMessage.cs │ │ │ └── SendGridPersonalization.cs │ │ ├── SentMessages/ │ │ │ ├── FilePendingMessageRepository.cs │ │ │ ├── FileSentMessageRepository.cs │ │ │ ├── IPendingMessageProcessorObserver.cs │ │ │ ├── IPendingMessageRepository.cs │ │ │ ├── IPendingMessageSender.cs │ │ │ ├── ISentMessageRepository.cs │ │ │ ├── LogFileLineReader.cs │ │ │ ├── NoopPendingMessageSender.cs │ │ │ ├── PendingMessageProcessor.cs │ │ │ ├── PendingMessageRecord.cs │ │ │ ├── PendingMessageRepositoryOptions.cs │ │ │ ├── PendingMessageSenderFactory.cs │ │ │ ├── SendLogResolver.cs │ │ │ ├── Senders/ │ │ │ │ ├── GmailPendingMessageSender.cs │ │ │ │ ├── GraphPendingMessageSender.cs │ │ │ │ ├── MailgunPendingMessageSender.cs │ │ │ │ ├── SendGridPendingMessageSender.cs │ │ │ │ ├── SesPendingMessageSender.cs │ │ │ │ └── SmtpPendingMessageSender.cs │ │ │ ├── SentMessageRecipients.cs │ │ │ └── SentMessageRecord.cs │ │ ├── Serialization/ │ │ │ ├── JsonDtos.cs │ │ │ ├── MailozaurrJsonContext.cs │ │ │ └── UnixTimeSecondsDateTimeOffsetConverter.cs │ │ ├── Smtp/ │ │ │ ├── ClientSmtp.Disposal.cs │ │ │ ├── ClientSmtp.cs │ │ │ ├── NativeSentMailboxOperations.cs │ │ │ ├── Smtp.cs │ │ │ ├── SmtpAppendExecutionResult.cs │ │ │ ├── SmtpAppendPipeline.cs │ │ │ ├── SmtpConnectAuthenticateResult.cs │ │ │ ├── SmtpConnectionInfo.cs │ │ │ ├── SmtpConnectionPool.cs │ │ │ ├── SmtpDuplicateProbeResult.cs │ │ │ ├── SmtpResult.cs │ │ │ ├── SmtpSecureMime.cs │ │ │ ├── SmtpSendExecutionResult.cs │ │ │ ├── SmtpSendPipeline.cs │ │ │ ├── SmtpSentFolderSessionPipeline.cs │ │ │ └── SmtpValidation.cs │ │ └── Validator.cs │ ├── Mailozaurr.Application/ │ │ ├── AttachmentSummary.cs │ │ ├── CommonMessageActionsPreview.cs │ │ ├── CommonMessageActionsPreviewRequest.cs │ │ ├── DeleteMessagesPreview.cs │ │ ├── DeleteMessagesPreviewRequest.cs │ │ ├── DeleteMessagesRequest.cs │ │ ├── DraftAttachment.cs │ │ ├── DraftMessage.cs │ │ ├── DraftMimeMessageFactory.cs │ │ ├── FileMailDraftStore.cs │ │ ├── FileMailMessageActionPlanBatchStore.cs │ │ ├── FileMailProfileStore.cs │ │ ├── FileMailSecretStore.cs │ │ ├── FolderRef.cs │ │ ├── FolderRefCompact.cs │ │ ├── GetMessageRequest.cs │ │ ├── GetMessagesRequest.cs │ │ ├── GmailMailMessageActionHandler.cs │ │ ├── GmailMailReadHandler.cs │ │ ├── GmailMailSendHandler.cs │ │ ├── GmailProfileBootstrapRequest.cs │ │ ├── GmailProfileLoginRequest.cs │ │ ├── GmailSession.cs │ │ ├── GmailSessionFactory.cs │ │ ├── GmailSessionRequest.cs │ │ ├── GraphMailMessageActionHandler.cs │ │ ├── GraphMailReadHandler.cs │ │ ├── GraphMailSendHandler.cs │ │ ├── GraphProfileBootstrapRequest.cs │ │ ├── GraphProfileLoginRequest.cs │ │ ├── GraphSession.cs │ │ ├── GraphSessionFactory.cs │ │ ├── GraphSessionRequest.cs │ │ ├── IDraftMimeMessageFactory.cs │ │ ├── IGmailSessionFactory.cs │ │ ├── IGraphSessionFactory.cs │ │ ├── IImapSessionFactory.cs │ │ ├── IMailDraftExchangeService.cs │ │ ├── IMailDraftService.cs │ │ ├── IMailDraftStore.cs │ │ ├── IMailFolderAliasService.cs │ │ ├── IMailMessageActionBatchService.cs │ │ ├── IMailMessageActionHandler.cs │ │ ├── IMailMessageActionPlanBatchStore.cs │ │ ├── IMailMessageActionPlanExchangeService.cs │ │ ├── IMailMessageActionPlanRegistryService.cs │ │ ├── IMailMessageActionPlanService.cs │ │ ├── IMailMessageActionPreviewService.cs │ │ ├── IMailMessageActionService.cs │ │ ├── IMailProfileAuthService.cs │ │ ├── IMailProfileBootstrapService.cs │ │ ├── IMailProfileConnectionService.cs │ │ ├── IMailProfileOverviewService.cs │ │ ├── IMailProfileSecretService.cs │ │ ├── IMailProfileService.cs │ │ ├── IMailProfileStore.cs │ │ ├── IMailQueueService.cs │ │ ├── IMailReadHandler.cs │ │ ├── IMailReadService.cs │ │ ├── IMailSecretStore.cs │ │ ├── IMailSendHandler.cs │ │ ├── IMailSendService.cs │ │ ├── ISmtpSessionFactory.cs │ │ ├── ImapMailMessageActionHandler.cs │ │ ├── ImapMailReadHandler.cs │ │ ├── ImapSessionFactory.cs │ │ ├── JsonMailDraftExchangeService.cs │ │ ├── JsonMailMessageActionPlanExchangeService.cs │ │ ├── ListAttachmentsRequest.cs │ │ ├── MailApplication.cs │ │ ├── MailApplicationBuilder.cs │ │ ├── MailApplicationOptions.cs │ │ ├── MailApplicationPaths.cs │ │ ├── MailCapability.cs │ │ ├── MailCapabilityCatalog.cs │ │ ├── MailDraft.cs │ │ ├── MailDraftCompact.cs │ │ ├── MailDraftService.cs │ │ ├── MailDraftStoreOptions.cs │ │ ├── MailFolderAliasService.cs │ │ ├── MailFolderAliasSummary.cs │ │ ├── MailFolderAliases.cs │ │ ├── MailFolderQuery.cs │ │ ├── MailFolderTargetResolution.cs │ │ ├── MailMessageActionBatchService.cs │ │ ├── MailMessageActionPlanBatch.cs │ │ ├── MailMessageActionPlanBatchCompact.cs │ │ ├── MailMessageActionPlanBatchQuery.cs │ │ ├── MailMessageActionPlanBatchSortBy.cs │ │ ├── MailMessageActionPlanBatchStoreOptions.cs │ │ ├── MailMessageActionPlanBatchSummary.cs │ │ ├── MailMessageActionPlanBatchTransformPreview.cs │ │ ├── MailMessageActionPlanRegistryService.cs │ │ ├── MailMessageActionPlanService.cs │ │ ├── MailMessageActionPreviewService.cs │ │ ├── MailProfile.cs │ │ ├── MailProfileAuthDefaults.cs │ │ ├── MailProfileAuthFlowNames.cs │ │ ├── MailProfileAuthService.cs │ │ ├── MailProfileAuthStatus.cs │ │ ├── MailProfileAuthenticationResult.cs │ │ ├── MailProfileBootstrapService.cs │ │ ├── MailProfileConnectionService.cs │ │ ├── MailProfileConnectionTestResult.cs │ │ ├── MailProfileConnectionTestScope.cs │ │ ├── MailProfileKind.cs │ │ ├── MailProfileKindParser.cs │ │ ├── MailProfileOverview.cs │ │ ├── MailProfileOverviewCompact.cs │ │ ├── MailProfileOverviewQuery.cs │ │ ├── MailProfileOverviewService.cs │ │ ├── MailProfileOverviewSortBy.cs │ │ ├── MailProfileSecretService.cs │ │ ├── MailProfileService.cs │ │ ├── MailProfileSettingsKeys.cs │ │ ├── MailProfileStoreOptions.cs │ │ ├── MailProfileValidationResult.cs │ │ ├── MailProfileValidator.cs │ │ ├── MailSearchRequest.cs │ │ ├── MailSecretNames.cs │ │ ├── MailSecretReferenceResolver.cs │ │ ├── MailSecretStoreOptions.cs │ │ ├── MailboxRef.cs │ │ ├── Mailozaurr.Application.csproj │ │ ├── MessageActionBatchExecutionItemResult.cs │ │ ├── MessageActionBatchExecutionResult.cs │ │ ├── MessageActionConfirmationTokens.cs │ │ ├── MessageActionExecutionPlan.cs │ │ ├── MessageActionExecutionPlanRequest.cs │ │ ├── MessageActionItemResult.cs │ │ ├── MessageActionPlanBatchTransformPreviewItem.cs │ │ ├── MessageActionPlanBatchTransformRequest.cs │ │ ├── MessageActionPreviewItem.cs │ │ ├── MessageActionResult.cs │ │ ├── MessageDetail.cs │ │ ├── MessageDetailCompact.cs │ │ ├── MessageRecipient.cs │ │ ├── MessageStateChangePreview.cs │ │ ├── MessageSummary.cs │ │ ├── MessageSummaryCompact.cs │ │ ├── MimeAttachmentStorage.cs │ │ ├── MoveMessagesPreview.cs │ │ ├── MoveMessagesPreviewRequest.cs │ │ ├── MoveMessagesRequest.cs │ │ ├── OperationResult.cs │ │ ├── PendingMailQueueService.cs │ │ ├── ProfileCapabilities.cs │ │ ├── QueueProcessResult.cs │ │ ├── QueuedMessageCompact.cs │ │ ├── QueuedMessageSummary.cs │ │ ├── RoutedMailMessageActionService.cs │ │ ├── RoutedMailReadService.cs │ │ ├── RoutedMailSendService.cs │ │ ├── SaveAttachmentRequest.cs │ │ ├── SaveAttachmentsManyRequest.cs │ │ ├── SaveAttachmentsManyResult.cs │ │ ├── SaveAttachmentsRequest.cs │ │ ├── SaveAttachmentsResult.cs │ │ ├── SavedAttachmentResult.cs │ │ ├── SendMessageRequest.cs │ │ ├── SendResult.cs │ │ ├── SetFlaggedStateRequest.cs │ │ ├── SetReadStateRequest.cs │ │ ├── SmtpMailSendHandler.cs │ │ ├── SmtpSessionFactory.cs │ │ ├── StandardMessageActionsPreview.cs │ │ └── StandardMessageActionsPreviewRequest.cs │ ├── Mailozaurr.Cli/ │ │ ├── CliArguments.cs │ │ ├── CliRunner.cs │ │ ├── Mailozaurr.Cli.csproj │ │ ├── Mcp/ │ │ │ ├── MailMcpTools.cs │ │ │ └── McpServerHost.cs │ │ └── Program.cs │ ├── Mailozaurr.Examples/ │ │ ├── AcquireGoogleTokenInteractive.cs │ │ ├── AcquireO365TokenDeviceCode.cs │ │ ├── AcquireO365TokenInteractive.cs │ │ ├── BuildGraphUriExample.cs │ │ ├── DetectNonDeliveryReportExample.cs │ │ ├── FetchGmailMessages.cs │ │ ├── FetchImapMessages.cs │ │ ├── FetchPopMessages.cs │ │ ├── GenerateTemporaryMailCrypto.cs │ │ ├── GenerateTemporaryPgpKeyPair.cs │ │ ├── GenerateTemporarySmimeCertificate.cs │ │ ├── ImapIdleListenerExample.cs │ │ ├── ImapIdleListenerFilteredExample.cs │ │ ├── Mailozaurr.Examples.csproj │ │ ├── NonDeliveryReportServiceExample.cs │ │ ├── ParseNonDeliveryReportExample.cs │ │ ├── PendingMessageRepositoryExample.cs │ │ ├── Program.cs │ │ ├── RetrieveAndCorrelateNonDeliveryReportsExample.cs │ │ ├── RetrieveDmarcReportsExample.cs │ │ ├── SearchBodyContainsExample.cs │ │ ├── SearchNonDeliveryReportsExample.cs │ │ ├── SendEmailAttachments.cs │ │ ├── SendEmailGmail.cs │ │ ├── SendEmailGmailApi.cs │ │ ├── SendEmailGraphCertificate.cs │ │ ├── SendEmailGraphClientSecret.cs │ │ ├── SendEmailGraphWithPolicy.cs │ │ ├── SendEmailHeadersGraph.cs │ │ ├── SendEmailHeadersSendGrid.cs │ │ ├── SendEmailHeadersSmtp.cs │ │ ├── SendEmailMailgun.cs │ │ ├── SendEmailPgp.cs │ │ ├── SendEmailRemoteImages.cs │ │ ├── SendEmailSasl.cs │ │ ├── SendEmailSmtpAsync.cs │ │ ├── SendEmailVerifyAttachments.cs │ │ ├── SendTemplatedEmailSes.cs │ │ ├── SmtpPendingMessageExample.cs │ │ └── SmtpProcessPendingMessagesExample.cs │ ├── Mailozaurr.Msg/ │ │ ├── Definitions/ │ │ │ ├── EmlConversionResult.cs │ │ │ └── MsgConversionResult.cs │ │ ├── EmailMessage.cs │ │ ├── MailFileModels.cs │ │ ├── MailFileReader.cs │ │ ├── MailFileReaderOptions.cs │ │ └── Mailozaurr.Msg.csproj │ ├── Mailozaurr.PowerShell/ │ │ ├── CmdletAddGraphMailboxPermission.cs │ │ ├── CmdletClearGraphJunk.cs │ │ ├── CmdletClearIMAPJunk.cs │ │ ├── CmdletClearSmtpConnectionPool.cs │ │ ├── CmdletConnectEmailGraph.cs │ │ ├── CmdletConnectIMAP.cs │ │ ├── CmdletConnectOAuthGoogle.cs │ │ ├── CmdletConnectOAuthO365.cs │ │ ├── CmdletConnectPOP3.cs │ │ ├── CmdletConvertFromEmlToMsg.cs │ │ ├── CmdletConvertFromMsgToEml.cs │ │ ├── CmdletConvertFromOAuth2Credential.cs │ │ ├── CmdletConvertToGraphCertificateCredential.cs │ │ ├── CmdletConvertToGraphCredential.cs │ │ ├── CmdletConvertToMailgunCredential.cs │ │ ├── CmdletConvertToOAuth2Credential.cs │ │ ├── CmdletConvertToSendGridCredential.cs │ │ ├── CmdletDisconnectEmailGraph.cs │ │ ├── CmdletDisconnectIMAP.cs │ │ ├── CmdletDisconnectPOP3.cs │ │ ├── CmdletGetDmarcReport.cs │ │ ├── CmdletGetEmailDeliveryMatch.cs │ │ ├── CmdletGetEmailDeliveryStatus.cs │ │ ├── CmdletGetEmailGraphFolder.cs │ │ ├── CmdletGetEmailGraphMessage.cs │ │ ├── CmdletGetEmailGraphMessageAttachment.cs │ │ ├── CmdletGetEmailGraphMessageMime.cs │ │ ├── CmdletGetEmailPendingMessage.cs │ │ ├── CmdletGetGmailMessage.cs │ │ ├── CmdletGetGmailThread.cs │ │ ├── CmdletGetGraphEvent.cs │ │ ├── CmdletGetGraphInboxRule.cs │ │ ├── CmdletGetGraphMailboxPermission.cs │ │ ├── CmdletGetGraphMailboxStatistics.cs │ │ ├── CmdletGetIMAPFolder.cs │ │ ├── CmdletGetIMAPMessage.cs │ │ ├── CmdletGetMimeMessageContent.cs │ │ ├── CmdletGetPOP3Message.cs │ │ ├── CmdletGetSmtpConnectionPool.cs │ │ ├── CmdletImportMailFile.cs │ │ ├── CmdletMoveGraphFolder.cs │ │ ├── CmdletMoveGraphMessage.cs │ │ ├── CmdletMoveIMAPFolder.cs │ │ ├── CmdletMoveIMAPMessage.cs │ │ ├── CmdletNewGraphEvent.cs │ │ ├── CmdletNewGraphEventBuilder.cs │ │ ├── CmdletNewGraphInboxRule.cs │ │ ├── CmdletNewGraphInboxRuleBuilder.cs │ │ ├── CmdletNewGraphInboxRuleObject.cs │ │ ├── CmdletNewGraphMailboxPermissionBuilder.cs │ │ ├── CmdletNewGraphMailboxPermissionObject.cs │ │ ├── CmdletNewTemporaryMailCrypto.cs │ │ ├── CmdletRemoveEmailPendingMessage.cs │ │ ├── CmdletRemoveGmailMessage.cs │ │ ├── CmdletRemoveGraphEvent.cs │ │ ├── CmdletRemoveGraphFolder.cs │ │ ├── CmdletRemoveGraphInboxRule.cs │ │ ├── CmdletRemoveGraphMailboxPermission.cs │ │ ├── CmdletRemoveGraphMessage.cs │ │ ├── CmdletRemoveGraphMessageAttachment.cs │ │ ├── CmdletRemoveIMAPFolder.cs │ │ ├── CmdletRemoveIMAPMessage.cs │ │ ├── CmdletRemoveIMAPMessageAttachment.cs │ │ ├── CmdletRemovePOP3Message.cs │ │ ├── CmdletRemovePOP3MessageAttachment.cs │ │ ├── CmdletRenameGraphFolder.cs │ │ ├── CmdletRenameIMAPFolder.cs │ │ ├── CmdletSaveGmailMessageAttachment.cs │ │ ├── CmdletSaveGraphMessage.cs │ │ ├── CmdletSaveGraphMessageAttachment.cs │ │ ├── CmdletSaveIMAPMessage.cs │ │ ├── CmdletSaveIMAPMessageAttachment.cs │ │ ├── CmdletSaveMimeMessage.cs │ │ ├── CmdletSavePOP3Message.cs │ │ ├── CmdletSavePOP3MessageAttachment.cs │ │ ├── CmdletSearchGraphMailbox.cs │ │ ├── CmdletSearchIMAPMailbox.cs │ │ ├── CmdletSearchPOP3Mailbox.cs │ │ ├── CmdletSendEmailMessage.Parameters.cs │ │ ├── CmdletSendEmailMessage.Process.cs │ │ ├── CmdletSendEmailMessage.cs │ │ ├── CmdletSendEmailPendingMessage.cs │ │ ├── CmdletSendGmailMessage.cs │ │ ├── CmdletSetGraphEvent.cs │ │ ├── CmdletSetGraphInboxRule.cs │ │ ├── CmdletSetGraphMessage.cs │ │ ├── CmdletSetIMAPFolder.cs │ │ ├── CmdletSetIMAPMessage.cs │ │ ├── CmdletSetPOP3Message.cs │ │ ├── CmdletTestEmailAddress.cs │ │ ├── CmdletTestMimeMessageSignature.cs │ │ ├── CmdletTestSmtpConnection.cs │ │ ├── CmdletUnprotectMimeMessage.cs │ │ ├── CmdletWaitGraphMessage.cs │ │ ├── CmdletWaitIMAPMessage.cs │ │ ├── CmdletWaitPOP3Message.cs │ │ ├── CmdletWatchSmtpConnectionPool.cs │ │ ├── Communication/ │ │ │ ├── AsyncPSCmdlet.cs │ │ │ ├── InternalLoggerPowerShell.cs │ │ │ └── LogEmitter.cs │ │ ├── CredentialHelpers.cs │ │ ├── Definitions/ │ │ │ ├── ConnectionInfoBase.cs │ │ │ ├── DefaultSessions.cs │ │ │ ├── EmailProtocol.cs │ │ │ ├── EmlConversionResult.cs │ │ │ ├── GraphConnectionInfo.cs │ │ │ ├── ImapConnectionInfo.cs │ │ │ ├── MsgConversionResult.cs │ │ │ └── PopConnectionInfo.cs │ │ ├── Mailozaurr.PowerShell.csproj │ │ ├── Mailozaurr.PowerShell.csproj.DotSettings │ │ └── OnImportAndRemove.cs │ ├── Mailozaurr.Tests/ │ │ ├── AdditionalCoverageTests.cs │ │ ├── ApplicationBuilderTests.cs │ │ ├── ApplicationCapabilitiesTests.cs │ │ ├── ApplicationDraftServiceTests.cs │ │ ├── ApplicationDraftStoreTests.cs │ │ ├── ApplicationFolderAliasServiceTests.cs │ │ ├── ApplicationGmailMailReadHandlerTests.cs │ │ ├── ApplicationGmailMailSendHandlerTests.cs │ │ ├── ApplicationGmailSessionFactoryTests.cs │ │ ├── ApplicationGraphMailReadHandlerTests.cs │ │ ├── ApplicationGraphMailSendHandlerTests.cs │ │ ├── ApplicationGraphSessionFactoryTests.cs │ │ ├── ApplicationImapMailReadHandlerTests.cs │ │ ├── ApplicationImapSessionFactoryTests.cs │ │ ├── ApplicationMessageActionBatchServiceTests.cs │ │ ├── ApplicationMessageActionConfirmationTokensTests.cs │ │ ├── ApplicationMessageActionPlanBatchStoreTests.cs │ │ ├── ApplicationMessageActionPlanRegistryServiceTests.cs │ │ ├── ApplicationMessageActionPlanServiceTests.cs │ │ ├── ApplicationMessageActionPreviewServiceTests.cs │ │ ├── ApplicationProfileAuthServiceTests.cs │ │ ├── ApplicationProfileBootstrapServiceTests.cs │ │ ├── ApplicationProfileConnectionServiceTests.cs │ │ ├── ApplicationProfileOverviewServiceTests.cs │ │ ├── ApplicationProfileSecretServiceTests.cs │ │ ├── ApplicationProfileServiceTests.cs │ │ ├── ApplicationProfileStoreTests.cs │ │ ├── ApplicationQueueServiceTests.cs │ │ ├── ApplicationRoutingServicesTests.cs │ │ ├── ApplicationSecretStoreTests.cs │ │ ├── ApplicationSmtpMailSendHandlerTests.cs │ │ ├── ApplicationSmtpSessionFactoryTests.cs │ │ ├── CliRunnerTests.cs │ │ ├── ClientSmtpDisposeTests.cs │ │ ├── ClientSmtpTests.cs │ │ ├── CmdletImportMailFileTests.cs │ │ ├── CmdletWaitImapMessageTests.cs │ │ ├── ComposeProfileUtilitiesTests.cs │ │ ├── ConnectorTests.cs │ │ ├── ConvertFromGraphCredentialTests.cs │ │ ├── CredentialHelpersTests.cs │ │ ├── Cryptography/ │ │ │ ├── AesCredentialProtectorTests.cs │ │ │ └── CredentialProtectionTests.cs │ │ ├── DraftMimeMessageFactoryTests.cs │ │ ├── EmailMessageConversionTests.cs │ │ ├── EphemeralOpenPgpContextTests.cs │ │ ├── FetchExamplesTests.cs │ │ ├── FilePendingMessageRepositoryTests.cs │ │ ├── FolderOperationsTests.cs │ │ ├── GmailApiClientTests.cs │ │ ├── GmailMailboxBrowserTests.cs │ │ ├── GmailNonDeliveryReportsTests.cs │ │ ├── GraphApiClientMailboxTests.cs │ │ ├── GraphApiClientTests.cs │ │ ├── GraphApiErrorParserTests.cs │ │ ├── GraphAuthenticateTests.cs │ │ ├── GraphBatchAndRetryTests.cs │ │ ├── GraphChunkSizeLimitTests.cs │ │ ├── GraphCreateMessageTests.cs │ │ ├── GraphDraftTests.cs │ │ ├── GraphEventBuilderTests.cs │ │ ├── GraphExceptionStackTraceTests.cs │ │ ├── GraphInboxRulesTests.cs │ │ ├── GraphMailboxBrowserTests.cs │ │ ├── GraphMailboxPermissionBuilderTests.cs │ │ ├── GraphMailboxPermissionTests.cs │ │ ├── GraphMessageListenerTests.cs │ │ ├── GraphSearchMailboxesTests.cs │ │ ├── GraphStopwatchTests.cs │ │ ├── GraphTestCollection.cs │ │ ├── GraphUploadRangeTests.cs │ │ ├── GraphUploadSessionParsingTests.cs │ │ ├── HelpersTests.cs │ │ ├── HtmlAutoEmbedImageTests.cs │ │ ├── HtmlUtilsTests.cs │ │ ├── ImapBulkFlagOperationsTests.cs │ │ ├── ImapConnectionRequestTests.cs │ │ ├── ImapDeleteOperationsTests.cs │ │ ├── ImapFetchTests.cs │ │ ├── ImapIdleListenerTests.cs │ │ ├── ImapMailboxSearchQueryBuilderTests.cs │ │ ├── ImapMessageReaderTests.cs │ │ ├── ImapMoveOperationsTests.cs │ │ ├── ImapSentFolderResolverTests.cs │ │ ├── ImapSentMessageOperationsTests.cs │ │ ├── ImapSessionServiceTests.cs │ │ ├── InternalLoggerTests.cs │ │ ├── IsDisposableEmailTests.cs │ │ ├── JsonMailDraftExchangeServiceTests.cs │ │ ├── JsonMailMessageActionPlanExchangeServiceTests.cs │ │ ├── JunkCleanerTests.cs │ │ ├── LoggingConfiguratorDisposeTests.cs │ │ ├── LoggingConfiguratorTests.cs │ │ ├── LoggingConfiguratorValidationTests.cs │ │ ├── LoggingMessagesTests.cs │ │ ├── MailFileReaderTests.cs │ │ ├── MailMcpToolsTests.cs │ │ ├── MailboxSearcherBodyTests.cs │ │ ├── MailgunClientTests.cs │ │ ├── Mailozaurr.Tests.csproj │ │ ├── MessageFlaggerTests.cs │ │ ├── MessageInfoTests.cs │ │ ├── MicrosoftGraphUtilsCertificateTokenCachingTests.cs │ │ ├── MicrosoftGraphUtilsJunkMailTests.cs │ │ ├── MicrosoftGraphUtilsNullResponseTests.cs │ │ ├── MicrosoftGraphUtilsPagingTests.cs │ │ ├── MicrosoftGraphUtilsTests.cs │ │ ├── MimeKitNonDeliveryReportTests.cs │ │ ├── NativeMailboxBrowserSessionsTests.cs │ │ ├── NativeMailboxThreadingMetadataOperationsTests.cs │ │ ├── NativeSentMailboxOperationsTests.cs │ │ ├── NonDeliveryReportDetectionTests.cs │ │ ├── NonDeliveryReportServiceTests.cs │ │ ├── NonDeliveryReportTests.cs │ │ ├── OAuthCacheTestHelper.cs │ │ ├── OAuthHelpersCachedTokenTests.cs │ │ ├── OAuthHelpersGoogleCachedTokenTests.cs │ │ ├── OAuthTokenCacheProtectionTests.cs │ │ ├── Pop3AttachmentPayloadBuilderTests.cs │ │ ├── Pop3ConnectionTests.cs │ │ ├── Pop3MailboxBrowserTests.cs │ │ ├── Pop3PollListenerTests.cs │ │ ├── ProtocolAuthTests.cs │ │ ├── QueryLanguageParserTests.cs │ │ ├── RecordingHandler.cs │ │ ├── RetryAlwaysTests.cs │ │ ├── SearchDmarcReportsTests.cs │ │ ├── SearchNonDeliveryReportsTests.cs │ │ ├── SecureStringHelperAsyncTests.cs │ │ ├── SendEmailBasicTests.cs │ │ ├── SendGridAttachmentTests.cs │ │ ├── SendGridClientDisposeTests.cs │ │ ├── SendGridConvertToEmailObjectTests.cs │ │ ├── SendGridCreateMessageTests.cs │ │ ├── SendLogResolverTests.cs │ │ ├── SentMessageRepositoryTests.cs │ │ ├── SentMessages/ │ │ │ ├── GmailPendingMessageSenderTests.cs │ │ │ ├── GraphPendingMessageSenderTests.cs │ │ │ ├── MailgunPendingMessageSenderTests.cs │ │ │ ├── PendingMessageProcessorFileRepositoryTests.cs │ │ │ ├── PendingMessageProcessorTests.cs │ │ │ ├── PendingMessageRecordSerializationTests.cs │ │ │ ├── PendingMessageSenderFactoryTests.cs │ │ │ ├── ProviderPendingMessageTests.cs │ │ │ ├── SendGridPendingMessageSenderTests.cs │ │ │ ├── SesPendingMessageSenderTests.cs │ │ │ ├── SmtpPendingMessageEncryptionTests.cs │ │ │ ├── SmtpPendingMessageProcessorIntegrationTests.cs │ │ │ └── SmtpPendingMessageSenderTests.cs │ │ ├── SerializationContextTests.cs │ │ ├── SesClientSendEmailAsyncTests.cs │ │ ├── SesClientSendTemplatedEmailAsyncTests.cs │ │ ├── SesClientTests.cs │ │ ├── SmtpAsyncWrappersTests.cs │ │ ├── SmtpAttachmentTests.cs │ │ ├── SmtpAuthenticationMechanismTests.cs │ │ ├── SmtpConcurrencyTests.cs │ │ ├── SmtpConnectionPoolConcurrencyTests.cs │ │ ├── SmtpConnectionPoolMetricsTests.cs │ │ ├── SmtpConnectionPoolTests.cs │ │ ├── SmtpHeadersTests.cs │ │ ├── SmtpInlineAttachmentTests.cs │ │ ├── SmtpPendingMessageTests.cs │ │ ├── SmtpSendAsyncTests.cs │ │ ├── SmtpSendPipelineTests.cs │ │ ├── SmtpSentFolderSessionPipelineTests.cs │ │ ├── SmtpSessionServiceTests.cs │ │ ├── SmtpSignTests.cs │ │ ├── SmtpSslOptionTests.cs │ │ ├── SmtpValidationTests.cs │ │ ├── TemporaryPgpKeyPairTests.cs │ │ ├── TemporarySmimeCertificateTests.cs │ │ ├── TestParallelization.cs │ │ ├── TokenCacheHelperTests.cs │ │ └── ValidatorTests.cs │ ├── Mailozaurr.sln │ └── Mailozaurr.sln.DotSettings ├── Tests/ │ ├── Add-GraphMailboxPermission.Tests.ps1 │ ├── Clear-GraphJunk.Tests.ps1 │ ├── Clear-IMAPJunk.Tests.ps1 │ ├── Clear-SmtpConnectionPool.Tests.ps1 │ ├── Connect-EmailGraph.Tests.ps1 │ ├── Connect-OAuthGoogle.Tests.ps1 │ ├── Connect-OAuthO365.Tests.ps1 │ ├── Connect-POP3.Tests.ps1 │ ├── ConvertFromGraphCredential.Tests.ps1 │ ├── ConvertTo-GraphCertificateCredential.Tests.ps1 │ ├── ConvertTo-GraphCredential.Tests.ps1 │ ├── ConvertTo-MailgunCredential.Tests.ps1 │ ├── ConvertTo-OAuth2Credential.Tests.ps1 │ ├── ConvertTo-SendGridCredential.Tests.ps1 │ ├── Get-DmarcReport.Tests.ps1 │ ├── Get-EmailDeliveryMatch.Tests.ps1 │ ├── Get-EmailDeliveryStatus.Tests.ps1 │ ├── Get-EmailPendingMessage.Tests.ps1 │ ├── Get-GmailMessage.Tests.ps1 │ ├── Get-GmailThread.Tests.ps1 │ ├── Get-GraphEvent.Tests.ps1 │ ├── Get-GraphInboxRule.Tests.ps1 │ ├── Get-GraphMailboxPermission.Tests.ps1 │ ├── Get-GraphMailboxStatistics.Tests.ps1 │ ├── Get-IMAPFolderRoot.Tests.ps1 │ ├── Get-IMAPMessage.Tests.ps1 │ ├── Get-IMAPMessage.WhatIf.Tests.ps1 │ ├── Get-MimeMessageContent.Tests.ps1 │ ├── Get-POP3Message.Tests.ps1 │ ├── Get-SmtpConnectionPool.Tests.ps1 │ ├── GraphApiErrorParser.Tests.ps1 │ ├── GraphSendPolicy.Tests.ps1 │ ├── GraphUploadSessionResult.Tests.ps1 │ ├── Import-Module.Tests.ps1 │ ├── Mailozaurr.Pester/ │ │ └── Send-EmailPendingMessage.Filters.Tests.ps1 │ ├── MaxConcurrentRequests.Tests.ps1 │ ├── MessageEncryption.Tests.ps1 │ ├── MessageTypes.Tests.ps1 │ ├── Move-GraphMessage.Tests.ps1 │ ├── Move-IMAPMessage.Tests.ps1 │ ├── New-GraphEvent.Tests.ps1 │ ├── New-GraphInboxRule.Tests.ps1 │ ├── New-GraphInboxRuleObjectBuilder.Tests.ps1 │ ├── New-GraphMailboxPermissionObjectBuilder.Tests.ps1 │ ├── New-TemporaryMailCrypto.Tests.ps1 │ ├── Pop3Connector.Dispose.Tests.ps1 │ ├── Remove-EmailPendingMessage.Tests.ps1 │ ├── Remove-GmailMessage.Tests.ps1 │ ├── Remove-GraphEvent.Tests.ps1 │ ├── Remove-GraphInboxRule.Tests.ps1 │ ├── Remove-GraphMailboxPermission.Tests.ps1 │ ├── Remove-GraphMessage.Tests.ps1 │ ├── Remove-GraphMessageAttachment.Tests.ps1 │ ├── Remove-IMAPMessage.Tests.ps1 │ ├── Remove-IMAPMessageAttachment.Tests.ps1 │ ├── Remove-POP3Message.Tests.ps1 │ ├── Remove-POP3MessageAttachment.Tests.ps1 │ ├── Save-GmailMessageAttachment.Tests.ps1 │ ├── Save-IMAPMessage.Tests.ps1 │ ├── Save-MimeMessage.Tests.ps1 │ ├── Save-POP3Message.Tests.ps1 │ ├── Search-IMAPMailbox.Tests.ps1 │ ├── Search-POP3Mailbox.Tests.ps1 │ ├── Send-EmailMessage.AsyncLogging.Tests.ps1 │ ├── Send-EmailMessage.Attachments.Tests.ps1 │ ├── Send-EmailMessage.GmailProvider.Tests.ps1 │ ├── Send-EmailMessage.GraphLimit.Tests.ps1 │ ├── Send-EmailMessage.Headers.Tests.ps1 │ ├── Send-EmailMessage.LoggerScope.Tests.ps1 │ ├── Send-EmailMessage.Pgp.Tests.ps1 │ ├── Send-EmailMessage.SentLogPath.Tests.ps1 │ ├── Send-EmailMessage.SkipAuth.Tests.ps1 │ ├── Send-EmailMessage.Tests.ps1 │ ├── Send-EmailMessage.WildcardAttachment.Tests.ps1 │ ├── Send-EmailMessageConnectionPool.Tests.ps1 │ ├── Send-EmailPendingMessage.Tests.ps1 │ ├── Send-GmailMessage.Tests.ps1 │ ├── SendLogResolver.Tests.ps1 │ ├── Set-GraphEvent.Tests.ps1 │ ├── Set-GraphInboxRule.Tests.ps1 │ ├── Test-MimeMessageSignature.Tests.ps1 │ ├── Test-SmtpConnection.Tests.ps1 │ ├── Unprotect-MimeMessage.Tests.ps1 │ ├── Wait-GraphMessage.Tests.ps1 │ ├── Wait-IMAPMessage.Tests.ps1 │ ├── Wait-POP3Message.Tests.ps1 │ └── Watch-SmtpConnectionPool.Tests.ps1 ├── Website/ │ ├── README.md │ └── content/ │ ├── examples/ │ │ ├── _index.md │ │ ├── test-smtp-connection-before-sending.md │ │ └── validate-email-addresses.md │ └── project-docs/ │ └── docs/ │ ├── _index.md │ ├── install.md │ ├── overview.md │ └── toc.yml └── codecov.yml
Showing preview only (520K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (4934 symbols across 717 files)
FILE: Sources/Mailozaurr.Application/AttachmentSummary.cs
class AttachmentSummary (line 6) | public sealed class AttachmentSummary {
FILE: Sources/Mailozaurr.Application/CommonMessageActionsPreview.cs
class CommonMessageActionsPreview (line 6) | public sealed class CommonMessageActionsPreview : OperationResult {
FILE: Sources/Mailozaurr.Application/CommonMessageActionsPreviewRequest.cs
class CommonMessageActionsPreviewRequest (line 6) | public sealed class CommonMessageActionsPreviewRequest {
FILE: Sources/Mailozaurr.Application/DeleteMessagesPreview.cs
class DeleteMessagesPreview (line 6) | public sealed class DeleteMessagesPreview : OperationResult {
FILE: Sources/Mailozaurr.Application/DeleteMessagesPreviewRequest.cs
class DeleteMessagesPreviewRequest (line 6) | public sealed class DeleteMessagesPreviewRequest {
FILE: Sources/Mailozaurr.Application/DeleteMessagesRequest.cs
class DeleteMessagesRequest (line 6) | public sealed class DeleteMessagesRequest {
FILE: Sources/Mailozaurr.Application/DraftAttachment.cs
class DraftAttachment (line 6) | public sealed class DraftAttachment {
FILE: Sources/Mailozaurr.Application/DraftMessage.cs
class DraftMessage (line 6) | public sealed class DraftMessage {
FILE: Sources/Mailozaurr.Application/DraftMimeMessageFactory.cs
class DraftMimeMessageFactory (line 9) | public sealed class DraftMimeMessageFactory : IDraftMimeMessageFactory {
method CreateAsync (line 11) | public Task<MimeMessage> CreateAsync(MailProfile profile, DraftMessage...
method AddSender (line 41) | private static void AddSender(MimeMessage message, MailProfile profile...
method AddRecipients (line 61) | private static void AddRecipients(InternetAddressList target, IEnumera...
method CreateMailboxAddress (line 78) | private static MailboxAddress CreateMailboxAddress(MessageRecipient re...
method AddHeaders (line 91) | private static void AddHeaders(MimeMessage message, IReadOnlyDictionar...
method BuildBody (line 105) | private static MimeEntity BuildBody(DraftMessage draft, CancellationTo...
method CreateAttachmentEntity (line 131) | private static MimeEntity CreateAttachmentEntity(DraftAttachment attac...
method ResolveContentType (line 157) | private static ContentType ResolveContentType(DraftAttachment attachme...
FILE: Sources/Mailozaurr.Application/FileMailDraftStore.cs
class FileMailDraftStore (line 8) | public sealed class FileMailDraftStore : IMailDraftStore {
method FileMailDraftStore (line 19) | public FileMailDraftStore(MailDraftStoreOptions? options = null)
method FileMailDraftStore (line 26) | public FileMailDraftStore(string filePath) {
method GetAllAsync (line 31) | public async Task<IReadOnlyList<MailDraft>> GetAllAsync(CancellationTo...
method GetByIdAsync (line 46) | public async Task<MailDraft?> GetByIdAsync(string draftId, Cancellatio...
method SaveAsync (line 62) | public async Task SaveAsync(MailDraft draft, CancellationToken cancell...
method RemoveAsync (line 91) | public async Task<bool> RemoveAsync(string draftId, CancellationToken ...
method LoadDocumentAsync (line 111) | private async Task<MailDraftStoreDocument> LoadDocumentAsync(Cancellat...
method SaveDocumentAsync (line 122) | private async Task SaveDocumentAsync(MailDraftStoreDocument document, ...
method ValidateDraft (line 150) | private static void ValidateDraft(MailDraft? draft) {
method CloneDraft (line 168) | private static MailDraft CloneDraft(MailDraft draft) => new() {
method CloneMessage (line 176) | private static DraftMessage CloneMessage(DraftMessage message) => new() {
method CloneRecipient (line 190) | private static MessageRecipient CloneRecipient(MessageRecipient recipi...
method CloneAttachment (line 195) | private static DraftAttachment CloneAttachment(DraftAttachment attachm...
class MailDraftStoreDocument (line 203) | private sealed class MailDraftStoreDocument {
FILE: Sources/Mailozaurr.Application/FileMailMessageActionPlanBatchStore.cs
class FileMailMessageActionPlanBatchStore (line 8) | public sealed class FileMailMessageActionPlanBatchStore : IMailMessageAc...
method FileMailMessageActionPlanBatchStore (line 19) | public FileMailMessageActionPlanBatchStore(MailMessageActionPlanBatchS...
method FileMailMessageActionPlanBatchStore (line 26) | public FileMailMessageActionPlanBatchStore(string filePath) {
method GetAllAsync (line 31) | public async Task<IReadOnlyList<MailMessageActionPlanBatch>> GetAllAsy...
method GetByIdAsync (line 46) | public async Task<MailMessageActionPlanBatch?> GetByIdAsync(string bat...
method SaveAsync (line 62) | public async Task SaveAsync(MailMessageActionPlanBatch batch, Cancella...
method RemoveAsync (line 91) | public async Task<bool> RemoveAsync(string batchId, CancellationToken ...
method LoadDocumentAsync (line 111) | private async Task<MailMessageActionPlanBatchStoreDocument> LoadDocume...
method SaveDocumentAsync (line 122) | private async Task SaveDocumentAsync(MailMessageActionPlanBatchStoreDo...
method ValidateBatch (line 150) | private static void ValidateBatch(MailMessageActionPlanBatch? batch) {
method CloneBatch (line 165) | private static MailMessageActionPlanBatch CloneBatch(MailMessageAction...
method ClonePlan (line 174) | private static MessageActionExecutionPlan ClonePlan(MessageActionExecu...
class MailMessageActionPlanBatchStoreDocument (line 211) | private sealed class MailMessageActionPlanBatchStoreDocument {
FILE: Sources/Mailozaurr.Application/FileMailProfileStore.cs
class FileMailProfileStore (line 8) | public sealed class FileMailProfileStore : IMailProfileStore {
method FileMailProfileStore (line 19) | public FileMailProfileStore(MailProfileStoreOptions? options = null)
method FileMailProfileStore (line 26) | public FileMailProfileStore(string filePath) {
method GetAllAsync (line 31) | public async Task<IReadOnlyList<MailProfile>> GetAllAsync(Cancellation...
method GetByIdAsync (line 42) | public async Task<MailProfile?> GetByIdAsync(string profileId, Cancell...
method SaveAsync (line 58) | public async Task SaveAsync(MailProfile profile, CancellationToken can...
method RemoveAsync (line 86) | public async Task<bool> RemoveAsync(string profileId, CancellationToke...
method LoadDocumentAsync (line 106) | private async Task<MailProfileStoreDocument> LoadDocumentAsync(Cancell...
method SaveDocumentAsync (line 117) | private async Task SaveDocumentAsync(MailProfileStoreDocument document...
method ValidateProfile (line 145) | private static void ValidateProfile(MailProfile? profile) {
method CloneProfiles (line 159) | private static IReadOnlyList<MailProfile> CloneProfiles(IEnumerable<Ma...
method CloneProfile (line 162) | private static MailProfile CloneProfile(MailProfile profile) => new() {
class MailProfileStoreDocument (line 176) | private sealed class MailProfileStoreDocument {
FILE: Sources/Mailozaurr.Application/FileMailSecretStore.cs
class FileMailSecretStore (line 8) | public sealed class FileMailSecretStore : IMailSecretStore {
method FileMailSecretStore (line 20) | public FileMailSecretStore(MailSecretStoreOptions? options = null)
method FileMailSecretStore (line 27) | public FileMailSecretStore(string filePath, ICredentialProtector prote...
method GetSecretAsync (line 33) | public async Task<string?> GetSecretAsync(string profileId, string sec...
method SetSecretAsync (line 51) | public async Task SetSecretAsync(string profileId, string secretName, ...
method RemoveSecretAsync (line 69) | public async Task<bool> RemoveSecretAsync(string profileId, string sec...
method LoadDocumentAsync (line 88) | private async Task<MailSecretStoreDocument> LoadDocumentAsync(Cancella...
method SaveDocumentAsync (line 99) | private async Task SaveDocumentAsync(MailSecretStoreDocument document,...
method CreateKey (line 137) | private static string CreateKey(string profileId, string secretName) =...
method ValidateKeyPart (line 139) | private static void ValidateKeyPart(string value, string parameterName) {
class MailSecretStoreDocument (line 145) | private sealed class MailSecretStoreDocument {
FILE: Sources/Mailozaurr.Application/FolderRef.cs
class FolderRef (line 6) | public sealed class FolderRef {
FILE: Sources/Mailozaurr.Application/FolderRefCompact.cs
class FolderRefCompact (line 6) | public sealed class FolderRefCompact {
FILE: Sources/Mailozaurr.Application/GetMessageRequest.cs
class GetMessageRequest (line 6) | public sealed class GetMessageRequest {
FILE: Sources/Mailozaurr.Application/GetMessagesRequest.cs
class GetMessagesRequest (line 6) | public sealed class GetMessagesRequest {
FILE: Sources/Mailozaurr.Application/GmailMailMessageActionHandler.cs
class GmailMailMessageActionHandler (line 6) | public sealed class GmailMailMessageActionHandler : IMailMessageActionHa...
method GmailMailMessageActionHandler (line 15) | public GmailMailMessageActionHandler(
method SetReadStateAsync (line 30) | public async Task<MessageActionResult> SetReadStateAsync(MailProfile p...
method SetFlaggedStateAsync (line 36) | public async Task<MessageActionResult> SetFlaggedStateAsync(MailProfil...
method MoveAsync (line 46) | public async Task<MessageActionResult> MoveAsync(MailProfile profile, ...
method DeleteAsync (line 52) | public async Task<MessageActionResult> DeleteAsync(MailProfile profile...
method DefaultSetReadStateAsync (line 57) | private static async Task<MessageActionResult> DefaultSetReadStateAsyn...
method DefaultMoveAsync (line 62) | private static async Task<MessageActionResult> DefaultMoveAsync(GmailS...
method DefaultDeleteAsync (line 71) | private static async Task<MessageActionResult> DefaultDeleteAsync(Gmai...
method NormalizeIds (line 76) | private static IReadOnlyList<string> NormalizeIds(IEnumerable<string> ...
method MapResult (line 79) | private static MessageActionResult MapResult(string profileId, IReadOn...
FILE: Sources/Mailozaurr.Application/GmailMailReadHandler.cs
class GmailMailReadHandler (line 9) | public sealed class GmailMailReadHandler : IMailReadHandler {
method GmailMailReadHandler (line 19) | public GmailMailReadHandler(
method GetFoldersAsync (line 36) | public async Task<IReadOnlyList<FolderRef>> GetFoldersAsync(MailProfil...
method SearchAsync (line 42) | public async Task<IReadOnlyList<MessageSummary>> SearchAsync(MailProfi...
method GetMessageAsync (line 48) | public async Task<MessageDetail?> GetMessageAsync(MailProfile profile,...
method SaveAttachmentAsync (line 54) | public async Task<OperationResult> SaveAttachmentAsync(MailProfile pro...
method DefaultGetFoldersAsync (line 59) | private static async Task<IReadOnlyList<FolderRef>> DefaultGetFoldersA...
method DefaultSearchAsync (line 93) | private static async Task<IReadOnlyList<MessageSummary>> DefaultSearch...
method DefaultGetMessageAsync (line 119) | private static async Task<MessageDetail?> DefaultGetMessageAsync(
method DefaultSaveAttachmentAsync (line 170) | private static async Task<OperationResult> DefaultSaveAttachmentAsync(
method MapSummary (line 208) | private static MessageSummary MapSummary(
method MapRecipients (line 227) | private static List<MessageRecipient> MapRecipients(string? raw, IEnum...
method ResolveFolder (line 256) | private static string ResolveFolder(string? folderId, MailProfile prof...
method ResolveUserId (line 267) | private static string ResolveUserId(MailProfile profile, string? mailb...
method GetMaxMimeBytes (line 281) | private static int GetMaxMimeBytes(MailProfile profile) {
method ResolveAttachment (line 291) | private static GmailAttachmentInfo? ResolveAttachment(IList<GmailAttac...
method ResolveDestinationPath (line 301) | private static string ResolveDestinationPath(string requestedPath, str...
method GetParentPath (line 315) | private static string? GetParentPath(string path) {
FILE: Sources/Mailozaurr.Application/GmailMailSendHandler.cs
class GmailMailSendHandler (line 8) | public sealed class GmailMailSendHandler : IMailSendHandler {
method GmailMailSendHandler (line 17) | public GmailMailSendHandler(
method SendAsync (line 32) | public async Task<SendResult> SendAsync(MailProfile profile, SendMessa...
method DefaultSendAsync (line 77) | private static Task<GmailMessage> DefaultSendAsync(
FILE: Sources/Mailozaurr.Application/GmailProfileBootstrapRequest.cs
class GmailProfileBootstrapRequest (line 6) | public sealed class GmailProfileBootstrapRequest {
FILE: Sources/Mailozaurr.Application/GmailProfileLoginRequest.cs
class GmailProfileLoginRequest (line 6) | public sealed class GmailProfileLoginRequest {
FILE: Sources/Mailozaurr.Application/GmailSession.cs
class GmailSession (line 6) | public sealed class GmailSession : IDisposable {
method GmailSession (line 10) | public GmailSession(GmailApiClient client, string userId) {
method Dispose (line 26) | public void Dispose() {
FILE: Sources/Mailozaurr.Application/GmailSessionFactory.cs
class GmailSessionFactory (line 10) | public sealed class GmailSessionFactory : IGmailSessionFactory {
method GmailSessionFactory (line 19) | public GmailSessionFactory(
method ConnectAsync (line 29) | public async Task<GmailSession> ConnectAsync(MailProfile profile, Canc...
method ResolveCredentialAsync (line 61) | private async Task<(OAuthCredential Credential, GmailRefreshRequest? R...
method DefaultRefreshCredentialAsync (line 114) | private static async Task<OAuthCredential> DefaultRefreshCredentialAsync(
method DefaultConnectAsync (line 173) | private static Task<GmailSession> DefaultConnectAsync(GmailSessionRequ...
method ResolveUserId (line 178) | private static string ResolveUserId(MailProfile profile) {
method TryResolveTokenExpiration (line 190) | private static DateTimeOffset? TryResolveTokenExpiration(MailProfile p...
method ShouldRefreshToken (line 200) | private static bool ShouldRefreshToken(DateTimeOffset? expiresOn) =>
class GmailRefreshRequest (line 206) | public sealed class GmailRefreshRequest {
FILE: Sources/Mailozaurr.Application/GmailSessionRequest.cs
class GmailSessionRequest (line 6) | public sealed class GmailSessionRequest {
FILE: Sources/Mailozaurr.Application/GraphMailMessageActionHandler.cs
class GraphMailMessageActionHandler (line 6) | public sealed class GraphMailMessageActionHandler : IMailMessageActionHa...
method GraphMailMessageActionHandler (line 15) | public GraphMailMessageActionHandler(
method SetReadStateAsync (line 30) | public async Task<MessageActionResult> SetReadStateAsync(MailProfile p...
method SetFlaggedStateAsync (line 36) | public async Task<MessageActionResult> SetFlaggedStateAsync(MailProfil...
method MoveAsync (line 47) | public async Task<MessageActionResult> MoveAsync(MailProfile profile, ...
method DeleteAsync (line 53) | public async Task<MessageActionResult> DeleteAsync(MailProfile profile...
method DefaultSetReadStateAsync (line 58) | private static async Task<MessageActionResult> DefaultSetReadStateAsyn...
method DefaultMoveAsync (line 64) | private static async Task<MessageActionResult> DefaultMoveAsync(GraphS...
method DefaultDeleteAsync (line 70) | private static async Task<MessageActionResult> DefaultDeleteAsync(Grap...
method NormalizeIds (line 76) | private static IReadOnlyList<string> NormalizeIds(IEnumerable<string> ...
method MapResult (line 79) | private static MessageActionResult MapResult(string profileId, IReadOn...
FILE: Sources/Mailozaurr.Application/GraphMailReadHandler.cs
class GraphMailReadHandler (line 9) | public sealed class GraphMailReadHandler : IMailReadHandler {
method GraphMailReadHandler (line 20) | public GraphMailReadHandler(
method GetFoldersAsync (line 37) | public async Task<IReadOnlyList<FolderRef>> GetFoldersAsync(MailProfil...
method SearchAsync (line 43) | public async Task<IReadOnlyList<MessageSummary>> SearchAsync(MailProfi...
method GetMessageAsync (line 49) | public async Task<MessageDetail?> GetMessageAsync(MailProfile profile,...
method SaveAttachmentAsync (line 55) | public async Task<OperationResult> SaveAttachmentAsync(MailProfile pro...
method DefaultGetFoldersAsync (line 60) | private static async Task<IReadOnlyList<FolderRef>> DefaultGetFoldersA...
method DefaultSearchAsync (line 142) | private static async Task<IReadOnlyList<MessageSummary>> DefaultSearch...
method DefaultGetMessageAsync (line 186) | private static async Task<MessageDetail?> DefaultGetMessageAsync(
method DefaultSaveAttachmentAsync (line 236) | private static async Task<OperationResult> DefaultSaveAttachmentAsync(
method MapSummary (line 275) | private static MessageSummary MapSummary(
method MapRecipients (line 294) | private static List<MessageRecipient> MapRecipients(GraphEmailAddress?...
method MapRecipients (line 312) | private static List<MessageRecipient> MapRecipients(IEnumerable<GraphE...
method ResolveFolder (line 332) | private static string ResolveFolder(string? folderId, MailProfile prof...
method ResolveUserId (line 343) | private static string ResolveUserId(MailProfile profile, string? mailb...
method GetMaxMimeBytes (line 357) | private static int GetMaxMimeBytes(MailProfile profile) {
method AddSearchToken (line 367) | private static void AddSearchToken(List<string> tokens, string? value) {
class GraphFolderNode (line 380) | private sealed class GraphFolderNode {
method GraphFolderNode (line 381) | public GraphFolderNode(
FILE: Sources/Mailozaurr.Application/GraphMailSendHandler.cs
class GraphMailSendHandler (line 11) | public sealed class GraphMailSendHandler : IMailSendHandler {
method GraphMailSendHandler (line 20) | public GraphMailSendHandler(
method SendAsync (line 35) | public async Task<SendResult> SendAsync(MailProfile profile, SendMessa...
method DefaultSendAsync (line 79) | private static async Task<GraphMessage> DefaultSendAsync(
method QueueMessageAsync (line 89) | private async Task<PendingMessageRecord> QueueMessageAsync(
FILE: Sources/Mailozaurr.Application/GraphProfileBootstrapRequest.cs
class GraphProfileBootstrapRequest (line 6) | public sealed class GraphProfileBootstrapRequest {
FILE: Sources/Mailozaurr.Application/GraphProfileLoginRequest.cs
class GraphProfileLoginRequest (line 6) | public sealed class GraphProfileLoginRequest {
FILE: Sources/Mailozaurr.Application/GraphSession.cs
class GraphSession (line 6) | public sealed class GraphSession : IDisposable {
method GraphSession (line 10) | public GraphSession(
method Dispose (line 34) | public void Dispose() {
FILE: Sources/Mailozaurr.Application/GraphSessionFactory.cs
class GraphSessionFactory (line 6) | public sealed class GraphSessionFactory : IGraphSessionFactory {
method GraphSessionFactory (line 15) | public GraphSessionFactory(
method ConnectAsync (line 27) | public async Task<GraphSession> ConnectAsync(MailProfile profile, Canc...
method ResolveCredentialAsync (line 49) | private async Task<OAuthCredential> ResolveCredentialAsync(MailProfile...
method BuildGraphCredentialAsync (line 96) | private async Task<GraphCredential> BuildGraphCredentialAsync(MailProf...
method TryBuildGraphCredentialAsync (line 117) | private async Task<GraphCredential?> TryBuildGraphCredentialAsync(Mail...
method DefaultAcquireCredentialAsync (line 142) | private static async Task<OAuthCredential> DefaultAcquireCredentialAsync(
method DefaultAcquireSilentCredentialAsync (line 161) | private static Task<OAuthCredential?> DefaultAcquireSilentCredentialAs...
method DefaultConnectAsync (line 183) | private static Task<GraphSession> DefaultConnectAsync(GraphSessionRequ...
method ResolveUserId (line 192) | private static string ResolveUserId(MailProfile profile) {
method ResolveLoginHint (line 204) | private static string? ResolveLoginHint(MailProfile profile) {
method TryResolveTokenExpiration (line 222) | private static DateTimeOffset? TryResolveTokenExpiration(MailProfile p...
method ShouldRefreshToken (line 232) | private static bool ShouldRefreshToken(DateTimeOffset? expiresOn) =>
method CanUseInteractiveSilentRefresh (line 235) | private static bool CanUseInteractiveSilentRefresh(MailProfile profile) {
method GetRequiredSetting (line 247) | private static string GetRequiredSetting(MailProfile profile, string k...
method NormalizeAccessToken (line 255) | private static string NormalizeAccessToken(string authorizationHeaderV...
FILE: Sources/Mailozaurr.Application/GraphSessionRequest.cs
class GraphSessionRequest (line 6) | public sealed class GraphSessionRequest {
FILE: Sources/Mailozaurr.Application/IDraftMimeMessageFactory.cs
type IDraftMimeMessageFactory (line 8) | public interface IDraftMimeMessageFactory {
method CreateAsync (line 12) | Task<MimeMessage> CreateAsync(MailProfile profile, DraftMessage draft,...
FILE: Sources/Mailozaurr.Application/IGmailSessionFactory.cs
type IGmailSessionFactory (line 6) | public interface IGmailSessionFactory {
method ConnectAsync (line 8) | Task<GmailSession> ConnectAsync(MailProfile profile, CancellationToken...
FILE: Sources/Mailozaurr.Application/IGraphSessionFactory.cs
type IGraphSessionFactory (line 6) | public interface IGraphSessionFactory {
method ConnectAsync (line 8) | Task<GraphSession> ConnectAsync(MailProfile profile, CancellationToken...
FILE: Sources/Mailozaurr.Application/IImapSessionFactory.cs
type IImapSessionFactory (line 8) | public interface IImapSessionFactory {
method ConnectAsync (line 12) | Task<ImapClient> ConnectAsync(MailProfile profile, CancellationToken c...
FILE: Sources/Mailozaurr.Application/IMailDraftExchangeService.cs
type IMailDraftExchangeService (line 6) | public interface IMailDraftExchangeService {
method LoadAsync (line 8) | Task<MailDraft> LoadAsync(string path, CancellationToken cancellationT...
method SaveAsync (line 11) | Task SaveAsync(string path, MailDraft draft, CancellationToken cancell...
FILE: Sources/Mailozaurr.Application/IMailDraftService.cs
type IMailDraftService (line 6) | public interface IMailDraftService {
method GetDraftsAsync (line 8) | Task<IReadOnlyList<MailDraft>> GetDraftsAsync(CancellationToken cancel...
method GetDraftsCompactAsync (line 11) | Task<IReadOnlyList<MailDraftCompact>> GetDraftsCompactAsync(Cancellati...
method GetDraftAsync (line 14) | Task<MailDraft?> GetDraftAsync(string draftId, CancellationToken cance...
method GetDraftCompactAsync (line 17) | Task<MailDraftCompact?> GetDraftCompactAsync(string draftId, Cancellat...
method SaveAsync (line 20) | Task<OperationResult> SaveAsync(MailDraft draft, CancellationToken can...
method DeleteAsync (line 23) | Task<OperationResult> DeleteAsync(string draftId, CancellationToken ca...
FILE: Sources/Mailozaurr.Application/IMailDraftStore.cs
type IMailDraftStore (line 6) | public interface IMailDraftStore {
method GetAllAsync (line 8) | Task<IReadOnlyList<MailDraft>> GetAllAsync(CancellationToken cancellat...
method GetByIdAsync (line 11) | Task<MailDraft?> GetByIdAsync(string draftId, CancellationToken cancel...
method SaveAsync (line 14) | Task SaveAsync(MailDraft draft, CancellationToken cancellationToken = ...
method RemoveAsync (line 17) | Task<bool> RemoveAsync(string draftId, CancellationToken cancellationT...
FILE: Sources/Mailozaurr.Application/IMailFolderAliasService.cs
type IMailFolderAliasService (line 6) | public interface IMailFolderAliasService {
method GetAliasesAsync (line 8) | Task<IReadOnlyList<MailFolderAliasSummary>> GetAliasesAsync(
method ResolveAsync (line 14) | Task<MailFolderTargetResolution> ResolveAsync(
FILE: Sources/Mailozaurr.Application/IMailMessageActionBatchService.cs
type IMailMessageActionBatchService (line 6) | public interface IMailMessageActionBatchService {
method ExecuteAsync (line 8) | Task<MessageActionBatchExecutionResult> ExecuteAsync(
FILE: Sources/Mailozaurr.Application/IMailMessageActionHandler.cs
type IMailMessageActionHandler (line 6) | public interface IMailMessageActionHandler {
method SetReadStateAsync (line 11) | Task<MessageActionResult> SetReadStateAsync(MailProfile profile, SetRe...
method SetFlaggedStateAsync (line 14) | Task<MessageActionResult> SetFlaggedStateAsync(MailProfile profile, Se...
method MoveAsync (line 17) | Task<MessageActionResult> MoveAsync(MailProfile profile, MoveMessagesR...
method DeleteAsync (line 20) | Task<MessageActionResult> DeleteAsync(MailProfile profile, DeleteMessa...
FILE: Sources/Mailozaurr.Application/IMailMessageActionPlanBatchStore.cs
type IMailMessageActionPlanBatchStore (line 6) | public interface IMailMessageActionPlanBatchStore {
method GetAllAsync (line 8) | Task<IReadOnlyList<MailMessageActionPlanBatch>> GetAllAsync(Cancellati...
method GetByIdAsync (line 11) | Task<MailMessageActionPlanBatch?> GetByIdAsync(string batchId, Cancell...
method SaveAsync (line 14) | Task SaveAsync(MailMessageActionPlanBatch batch, CancellationToken can...
method RemoveAsync (line 17) | Task<bool> RemoveAsync(string batchId, CancellationToken cancellationT...
FILE: Sources/Mailozaurr.Application/IMailMessageActionPlanExchangeService.cs
type IMailMessageActionPlanExchangeService (line 6) | public interface IMailMessageActionPlanExchangeService {
method LoadAsync (line 8) | Task<MessageActionExecutionPlan> LoadAsync(string path, CancellationTo...
method SaveAsync (line 11) | Task SaveAsync(string path, MessageActionExecutionPlan plan, Cancellat...
method LoadBatchAsync (line 14) | Task<IReadOnlyList<MessageActionExecutionPlan>> LoadBatchAsync(string ...
method SaveBatchAsync (line 17) | Task SaveBatchAsync(string path, IReadOnlyList<MessageActionExecutionP...
FILE: Sources/Mailozaurr.Application/IMailMessageActionPlanRegistryService.cs
type IMailMessageActionPlanRegistryService (line 6) | public interface IMailMessageActionPlanRegistryService {
method GetBatchesAsync (line 8) | Task<IReadOnlyList<MailMessageActionPlanBatch>> GetBatchesAsync(MailMe...
method GetBatchesCompactAsync (line 11) | Task<IReadOnlyList<MailMessageActionPlanBatchCompact>> GetBatchesCompa...
method GetBatchesSummaryAsync (line 14) | Task<IReadOnlyList<MailMessageActionPlanBatchSummary>> GetBatchesSumma...
method GetBatchAsync (line 17) | Task<MailMessageActionPlanBatch?> GetBatchAsync(string batchId, Cancel...
method GetBatchCompactAsync (line 20) | Task<MailMessageActionPlanBatchCompact?> GetBatchCompactAsync(string b...
method GetBatchSummaryAsync (line 23) | Task<MailMessageActionPlanBatchSummary?> GetBatchSummaryAsync(string b...
method SaveAsync (line 26) | Task<OperationResult> SaveAsync(MailMessageActionPlanBatch batch, Canc...
method CreateCommonBatchAsync (line 29) | Task<OperationResult> CreateCommonBatchAsync(
method CreateCommonBatchFromPreviewAsync (line 38) | Task<OperationResult> CreateCommonBatchFromPreviewAsync(
method CloneAsync (line 47) | Task<OperationResult> CloneAsync(string sourceBatchId, string targetBa...
method TransformCloneAsync (line 50) | Task<OperationResult> TransformCloneAsync(
method PreviewTransformCloneAsync (line 59) | Task<MailMessageActionPlanBatchTransformPreview> PreviewTransformClone...
method AppendPlanAsync (line 65) | Task<OperationResult> AppendPlanAsync(string batchId, MessageActionExe...
method AppendImportedPlanAsync (line 68) | Task<OperationResult> AppendImportedPlanAsync(string batchId, string p...
method ReplacePlanAtAsync (line 71) | Task<OperationResult> ReplacePlanAtAsync(string batchId, int index, Me...
method ReplaceImportedPlanAtAsync (line 74) | Task<OperationResult> ReplaceImportedPlanAtAsync(string batchId, int i...
method RemovePlanAtAsync (line 77) | Task<OperationResult> RemovePlanAtAsync(string batchId, int index, Can...
method DeleteAsync (line 80) | Task<OperationResult> DeleteAsync(string batchId, CancellationToken ca...
method ImportAsync (line 83) | Task<OperationResult> ImportAsync(string batchId, string name, string ...
method ExportAsync (line 86) | Task<OperationResult> ExportAsync(string batchId, string path, Cancell...
method ExecuteAsync (line 89) | Task<MessageActionBatchExecutionResult> ExecuteAsync(string batchId, b...
FILE: Sources/Mailozaurr.Application/IMailMessageActionPlanService.cs
type IMailMessageActionPlanService (line 6) | public interface IMailMessageActionPlanService {
method CreatePlanAsync (line 8) | Task<MessageActionExecutionPlan> CreatePlanAsync(MessageActionExecutio...
method ExecuteAsync (line 11) | Task<MessageActionResult> ExecuteAsync(MessageActionExecutionPlan plan...
FILE: Sources/Mailozaurr.Application/IMailMessageActionPreviewService.cs
type IMailMessageActionPreviewService (line 6) | public interface IMailMessageActionPreviewService {
method PreviewReadStateAsync (line 8) | Task<MessageStateChangePreview> PreviewReadStateAsync(SetReadStateRequ...
method PreviewFlaggedStateAsync (line 11) | Task<MessageStateChangePreview> PreviewFlaggedStateAsync(SetFlaggedSta...
method PreviewCommonActionsAsync (line 14) | Task<CommonMessageActionsPreview> PreviewCommonActionsAsync(CommonMess...
method PreviewMoveAsync (line 17) | Task<MoveMessagesPreview> PreviewMoveAsync(MoveMessagesPreviewRequest ...
method PreviewDeleteAsync (line 20) | Task<DeleteMessagesPreview> PreviewDeleteAsync(DeleteMessagesPreviewRe...
method PreviewStandardActionsAsync (line 23) | Task<StandardMessageActionsPreview> PreviewStandardActionsAsync(Standa...
FILE: Sources/Mailozaurr.Application/IMailMessageActionService.cs
type IMailMessageActionService (line 6) | public interface IMailMessageActionService {
method SetReadStateAsync (line 8) | Task<MessageActionResult> SetReadStateAsync(SetReadStateRequest reques...
method SetFlaggedStateAsync (line 11) | Task<MessageActionResult> SetFlaggedStateAsync(SetFlaggedStateRequest ...
method MoveAsync (line 14) | Task<MessageActionResult> MoveAsync(MoveMessagesRequest request, Cance...
method DeleteAsync (line 17) | Task<MessageActionResult> DeleteAsync(DeleteMessagesRequest request, C...
FILE: Sources/Mailozaurr.Application/IMailProfileAuthService.cs
type IMailProfileAuthService (line 6) | public interface IMailProfileAuthService {
method GetStatusAsync (line 8) | Task<MailProfileAuthStatus?> GetStatusAsync(string profileId, Cancella...
method LoginGmailAsync (line 11) | Task<MailProfileAuthenticationResult> LoginGmailAsync(GmailProfileLogi...
method LoginGraphAsync (line 14) | Task<MailProfileAuthenticationResult> LoginGraphAsync(GraphProfileLogi...
method RefreshAsync (line 17) | Task<MailProfileAuthenticationResult> RefreshAsync(string profileId, C...
FILE: Sources/Mailozaurr.Application/IMailProfileBootstrapService.cs
type IMailProfileBootstrapService (line 6) | public interface IMailProfileBootstrapService {
method SaveGraphProfileAsync (line 8) | Task<OperationResult> SaveGraphProfileAsync(GraphProfileBootstrapReque...
method SaveGmailProfileAsync (line 11) | Task<OperationResult> SaveGmailProfileAsync(GmailProfileBootstrapReque...
FILE: Sources/Mailozaurr.Application/IMailProfileConnectionService.cs
type IMailProfileConnectionService (line 6) | public interface IMailProfileConnectionService {
method TestAsync (line 8) | Task<MailProfileConnectionTestResult> TestAsync(
FILE: Sources/Mailozaurr.Application/IMailProfileOverviewService.cs
type IMailProfileOverviewService (line 6) | public interface IMailProfileOverviewService {
method GetOverviewsAsync (line 8) | Task<IReadOnlyList<MailProfileOverview>> GetOverviewsAsync(
method GetCompactOverviewsAsync (line 13) | Task<IReadOnlyList<MailProfileOverviewCompact>> GetCompactOverviewsAsync(
method GetOverviewAsync (line 18) | Task<MailProfileOverview?> GetOverviewAsync(string profileId, Cancella...
method GetCompactOverviewAsync (line 21) | Task<MailProfileOverviewCompact?> GetCompactOverviewAsync(string profi...
FILE: Sources/Mailozaurr.Application/IMailProfileSecretService.cs
type IMailProfileSecretService (line 6) | public interface IMailProfileSecretService {
method SetSecretAsync (line 8) | Task<OperationResult> SetSecretAsync(string profileId, string secretNa...
method SetSecretAsync (line 11) | Task<OperationResult> SetSecretAsync(string profileId, string secretNa...
method RemoveSecretAsync (line 14) | Task<OperationResult> RemoveSecretAsync(string profileId, string secre...
FILE: Sources/Mailozaurr.Application/IMailProfileService.cs
type IMailProfileService (line 6) | public interface IMailProfileService {
method GetProfilesAsync (line 8) | Task<IReadOnlyList<MailProfile>> GetProfilesAsync(CancellationToken ca...
method GetProfileAsync (line 11) | Task<MailProfile?> GetProfileAsync(string profileId, CancellationToken...
method ValidateAsync (line 14) | Task<MailProfileValidationResult> ValidateAsync(MailProfile profile, C...
method DiagnoseAsync (line 17) | Task<MailProfileValidationResult> DiagnoseAsync(string profileId, Canc...
method SaveAsync (line 20) | Task<OperationResult> SaveAsync(MailProfile profile, CancellationToken...
method DeleteAsync (line 23) | Task<OperationResult> DeleteAsync(string profileId, CancellationToken ...
method SetDefaultAsync (line 26) | Task<OperationResult> SetDefaultAsync(string profileId, CancellationTo...
method GetCapabilitiesAsync (line 29) | Task<ProfileCapabilities?> GetCapabilitiesAsync(string profileId, Canc...
FILE: Sources/Mailozaurr.Application/IMailProfileStore.cs
type IMailProfileStore (line 6) | public interface IMailProfileStore {
method GetAllAsync (line 8) | Task<IReadOnlyList<MailProfile>> GetAllAsync(CancellationToken cancell...
method GetByIdAsync (line 11) | Task<MailProfile?> GetByIdAsync(string profileId, CancellationToken ca...
method SaveAsync (line 14) | Task SaveAsync(MailProfile profile, CancellationToken cancellationToke...
method RemoveAsync (line 17) | Task<bool> RemoveAsync(string profileId, CancellationToken cancellatio...
FILE: Sources/Mailozaurr.Application/IMailQueueService.cs
type IMailQueueService (line 6) | public interface IMailQueueService {
method ListAsync (line 10) | Task<IReadOnlyList<QueuedMessageSummary>> ListAsync(CancellationToken ...
method ListCompactAsync (line 15) | Task<IReadOnlyList<QueuedMessageCompact>> ListCompactAsync(Cancellatio...
method GetAsync (line 20) | Task<QueuedMessageSummary?> GetAsync(string messageId, CancellationTok...
method GetCompactAsync (line 25) | Task<QueuedMessageCompact?> GetCompactAsync(string messageId, Cancella...
method RemoveAsync (line 30) | Task<OperationResult> RemoveAsync(string messageId, CancellationToken ...
method ProcessAsync (line 35) | Task<QueueProcessResult> ProcessAsync(CancellationToken cancellationTo...
FILE: Sources/Mailozaurr.Application/IMailReadHandler.cs
type IMailReadHandler (line 6) | public interface IMailReadHandler {
method GetFoldersAsync (line 11) | Task<IReadOnlyList<FolderRef>> GetFoldersAsync(MailProfile profile, Ma...
method SearchAsync (line 14) | Task<IReadOnlyList<MessageSummary>> SearchAsync(MailProfile profile, M...
method GetMessageAsync (line 17) | Task<MessageDetail?> GetMessageAsync(MailProfile profile, GetMessageRe...
method SaveAttachmentAsync (line 20) | Task<OperationResult> SaveAttachmentAsync(MailProfile profile, SaveAtt...
FILE: Sources/Mailozaurr.Application/IMailReadService.cs
type IMailReadService (line 6) | public interface IMailReadService {
method GetFoldersAsync (line 8) | Task<IReadOnlyList<FolderRef>> GetFoldersAsync(MailFolderQuery query, ...
method GetFoldersCompactAsync (line 11) | Task<IReadOnlyList<FolderRefCompact>> GetFoldersCompactAsync(MailFolde...
method SearchAsync (line 14) | Task<IReadOnlyList<MessageSummary>> SearchAsync(MailSearchRequest requ...
method SearchCompactAsync (line 17) | Task<IReadOnlyList<MessageSummaryCompact>> SearchCompactAsync(MailSear...
method GetAttachmentsAsync (line 20) | Task<IReadOnlyList<AttachmentSummary>> GetAttachmentsAsync(ListAttachm...
method GetMessageAsync (line 23) | Task<MessageDetail?> GetMessageAsync(GetMessageRequest request, Cancel...
method GetMessagesAsync (line 26) | Task<IReadOnlyList<MessageDetail>> GetMessagesAsync(GetMessagesRequest...
method GetMessageCompactAsync (line 29) | Task<MessageDetailCompact?> GetMessageCompactAsync(GetMessageRequest r...
method GetMessagesCompactAsync (line 32) | Task<IReadOnlyList<MessageDetailCompact>> GetMessagesCompactAsync(GetM...
method SaveAttachmentsAsync (line 35) | Task<SaveAttachmentsResult> SaveAttachmentsAsync(SaveAttachmentsReques...
method SaveAttachmentsManyAsync (line 38) | Task<SaveAttachmentsManyResult> SaveAttachmentsManyAsync(SaveAttachmen...
method SaveAttachmentAsync (line 41) | Task<OperationResult> SaveAttachmentAsync(SaveAttachmentRequest reques...
FILE: Sources/Mailozaurr.Application/IMailSecretStore.cs
type IMailSecretStore (line 6) | public interface IMailSecretStore {
method GetSecretAsync (line 8) | Task<string?> GetSecretAsync(string profileId, string secretName, Canc...
method SetSecretAsync (line 11) | Task SetSecretAsync(string profileId, string secretName, string secret...
method RemoveSecretAsync (line 14) | Task<bool> RemoveSecretAsync(string profileId, string secretName, Canc...
FILE: Sources/Mailozaurr.Application/IMailSendHandler.cs
type IMailSendHandler (line 6) | public interface IMailSendHandler {
method SendAsync (line 11) | Task<SendResult> SendAsync(MailProfile profile, SendMessageRequest req...
FILE: Sources/Mailozaurr.Application/IMailSendService.cs
type IMailSendService (line 6) | public interface IMailSendService {
method SendAsync (line 8) | Task<SendResult> SendAsync(SendMessageRequest request, CancellationTok...
FILE: Sources/Mailozaurr.Application/ISmtpSessionFactory.cs
type ISmtpSessionFactory (line 8) | public interface ISmtpSessionFactory {
method ConnectAsync (line 10) | Task<Smtp> ConnectAsync(MailProfile profile, CancellationToken cancell...
FILE: Sources/Mailozaurr.Application/ImapMailMessageActionHandler.cs
class ImapMailMessageActionHandler (line 9) | public sealed class ImapMailMessageActionHandler : IMailMessageActionHan...
method ImapMailMessageActionHandler (line 18) | public ImapMailMessageActionHandler(
method SetReadStateAsync (line 33) | public async Task<MessageActionResult> SetReadStateAsync(MailProfile p...
method SetFlaggedStateAsync (line 39) | public async Task<MessageActionResult> SetFlaggedStateAsync(MailProfil...
method MoveAsync (line 69) | public async Task<MessageActionResult> MoveAsync(MailProfile profile, ...
method DeleteAsync (line 75) | public async Task<MessageActionResult> DeleteAsync(MailProfile profile...
method DefaultSetReadStateAsync (line 80) | private static async Task<MessageActionResult> DefaultSetReadStateAsyn...
method DefaultMoveAsync (line 108) | private static async Task<MessageActionResult> DefaultMoveAsync(ImapCl...
method DefaultDeleteAsync (line 135) | private static async Task<MessageActionResult> DefaultDeleteAsync(Imap...
method ParseUids (line 162) | private static IReadOnlyList<UniqueId> ParseUids(IEnumerable<string> m...
method ParseUid (line 165) | private static UniqueId ParseUid(string value) {
method ResolveFolder (line 173) | private static string ResolveFolder(string? folderId, MailProfile prof...
FILE: Sources/Mailozaurr.Application/ImapMailReadHandler.cs
class ImapMailReadHandler (line 10) | public sealed class ImapMailReadHandler : IMailReadHandler {
method ImapMailReadHandler (line 20) | public ImapMailReadHandler(
method GetFoldersAsync (line 37) | public async Task<IReadOnlyList<FolderRef>> GetFoldersAsync(MailProfil...
method SearchAsync (line 43) | public async Task<IReadOnlyList<MessageSummary>> SearchAsync(MailProfi...
method GetMessageAsync (line 49) | public async Task<MessageDetail?> GetMessageAsync(MailProfile profile,...
method SaveAttachmentAsync (line 55) | public async Task<OperationResult> SaveAttachmentAsync(MailProfile pro...
method DefaultGetFoldersAsync (line 60) | private static async Task<IReadOnlyList<FolderRef>> DefaultGetFoldersA...
method CollectFoldersAsync (line 79) | private static async Task CollectFoldersAsync(
method MapFolder (line 103) | private static FolderRef MapFolder(IMailFolder folder, string profileI...
method DefaultSearchAsync (line 114) | private static async Task<IReadOnlyList<MessageSummary>> DefaultSearch...
method DefaultGetMessageAsync (line 135) | private static async Task<MessageDetail?> DefaultGetMessageAsync(
method DefaultSaveAttachmentAsync (line 186) | private static async Task<OperationResult> DefaultSaveAttachmentAsync(
method MapSummary (line 214) | private static MessageSummary MapSummary(string profileId, string fold...
method ParseUid (line 238) | private static UniqueId ParseUid(string value) {
method ResolveFolder (line 246) | private static string ResolveFolder(string? folderId, MailProfile prof...
method GetMaxBodyBytes (line 256) | private static long GetMaxBodyBytes(MailProfile profile) {
method SplitAddresses (line 266) | private static List<MessageRecipient> SplitAddresses(string? addresses) {
method ResolveAttachment (line 278) | private static MimeEntity? ResolveAttachment(IReadOnlyList<MimeEntity>...
FILE: Sources/Mailozaurr.Application/ImapSessionFactory.cs
class ImapSessionFactory (line 9) | public sealed class ImapSessionFactory : IImapSessionFactory {
method ImapSessionFactory (line 16) | public ImapSessionFactory(
method ConnectAsync (line 24) | public async Task<ImapClient> ConnectAsync(MailProfile profile, Cancel...
method CreateRequestAsync (line 36) | private async Task<ImapSessionRequest> CreateRequestAsync(MailProfile ...
method ResolveSecretAsync (line 60) | private async Task<string> ResolveSecretAsync(MailProfile profile, Pro...
method ResolveUserName (line 82) | private static string ResolveUserName(MailProfile profile) {
method RequireSetting (line 97) | private static string RequireSetting(MailProfile profile, string key) {
method GetAuthMode (line 105) | private static ProtocolAuthMode GetAuthMode(MailProfile profile) {
method GetSecureSocketOptions (line 110) | private static SecureSocketOptions GetSecureSocketOptions(MailProfile ...
method GetIntSetting (line 122) | private static int? GetIntSetting(MailProfile profile, string key) {
method GetDoubleSetting (line 133) | private static double? GetDoubleSetting(MailProfile profile, string ke...
method GetBoolSetting (line 144) | private static bool? GetBoolSetting(MailProfile profile, string key) {
FILE: Sources/Mailozaurr.Application/JsonMailDraftExchangeService.cs
class JsonMailDraftExchangeService (line 8) | public sealed class JsonMailDraftExchangeService : IMailDraftExchangeSer...
method LoadAsync (line 15) | public async Task<MailDraft> LoadAsync(string path, CancellationToken ...
method SaveAsync (line 31) | public async Task SaveAsync(string path, MailDraft draft, Cancellation...
FILE: Sources/Mailozaurr.Application/JsonMailMessageActionPlanExchangeService.cs
class JsonMailMessageActionPlanExchangeService (line 8) | public sealed class JsonMailMessageActionPlanExchangeService : IMailMess...
method LoadAsync (line 15) | public async Task<MessageActionExecutionPlan> LoadAsync(string path, C...
method SaveAsync (line 31) | public async Task SaveAsync(string path, MessageActionExecutionPlan pl...
method LoadBatchAsync (line 51) | public async Task<IReadOnlyList<MessageActionExecutionPlan>> LoadBatch...
method SaveBatchAsync (line 67) | public async Task SaveBatchAsync(string path, IReadOnlyList<MessageAct...
FILE: Sources/Mailozaurr.Application/ListAttachmentsRequest.cs
class ListAttachmentsRequest (line 6) | public sealed class ListAttachmentsRequest {
FILE: Sources/Mailozaurr.Application/MailApplication.cs
class MailApplication (line 6) | public sealed class MailApplication {
method MailApplication (line 7) | internal MailApplication(
FILE: Sources/Mailozaurr.Application/MailApplicationBuilder.cs
class MailApplicationBuilder (line 6) | public sealed class MailApplicationBuilder {
method MailApplicationBuilder (line 43) | public MailApplicationBuilder() {
method MailApplicationBuilder (line 49) | public MailApplicationBuilder(MailApplicationOptions options) {
method Configure (line 54) | public MailApplicationBuilder Configure(MailApplicationOptions options) {
method UseProfileStore (line 60) | public MailApplicationBuilder UseProfileStore(IMailProfileStore profil...
method UseSecretStore (line 66) | public MailApplicationBuilder UseSecretStore(IMailSecretStore secretSt...
method UseDraftStore (line 72) | public MailApplicationBuilder UseDraftStore(IMailDraftStore draftStore) {
method UseMessageActionPlanBatchStore (line 78) | public MailApplicationBuilder UseMessageActionPlanBatchStore(IMailMess...
method UseProfileService (line 84) | public MailApplicationBuilder UseProfileService(IMailProfileService pr...
method UseProfileOverviewService (line 90) | public MailApplicationBuilder UseProfileOverviewService(IMailProfileOv...
method UseProfileConnectionService (line 96) | public MailApplicationBuilder UseProfileConnectionService(IMailProfile...
method UseProfileSecretService (line 102) | public MailApplicationBuilder UseProfileSecretService(IMailProfileSecr...
method UseProfileBootstrapService (line 108) | public MailApplicationBuilder UseProfileBootstrapService(IMailProfileB...
method UseProfileAuthService (line 114) | public MailApplicationBuilder UseProfileAuthService(IMailProfileAuthSe...
method UseFolderAliasService (line 120) | public MailApplicationBuilder UseFolderAliasService(IMailFolderAliasSe...
method UseDraftService (line 126) | public MailApplicationBuilder UseDraftService(IMailDraftService draftS...
method UseDraftExchangeService (line 132) | public MailApplicationBuilder UseDraftExchangeService(IMailDraftExchan...
method UseReadService (line 138) | public MailApplicationBuilder UseReadService(IMailReadService readServ...
method UseMessageActionPreviewService (line 144) | public MailApplicationBuilder UseMessageActionPreviewService(IMailMess...
method UseMessageActionPlanService (line 150) | public MailApplicationBuilder UseMessageActionPlanService(IMailMessage...
method UseMessageActionPlanExchangeService (line 156) | public MailApplicationBuilder UseMessageActionPlanExchangeService(IMai...
method UseMessageActionPlanRegistryService (line 162) | public MailApplicationBuilder UseMessageActionPlanRegistryService(IMai...
method UseMessageActionBatchService (line 168) | public MailApplicationBuilder UseMessageActionBatchService(IMailMessag...
method UseMessageActionService (line 174) | public MailApplicationBuilder UseMessageActionService(IMailMessageActi...
method UseSendService (line 180) | public MailApplicationBuilder UseSendService(IMailSendService sendServ...
method UseQueueService (line 186) | public MailApplicationBuilder UseQueueService(IMailQueueService queueS...
method UseDraftMimeMessageFactory (line 192) | public MailApplicationBuilder UseDraftMimeMessageFactory(IDraftMimeMes...
method UsePendingMessageRepository (line 198) | public MailApplicationBuilder UsePendingMessageRepository(IPendingMess...
method UseImapSessionFactory (line 204) | public MailApplicationBuilder UseImapSessionFactory(IImapSessionFactor...
method UseGraphSessionFactory (line 210) | public MailApplicationBuilder UseGraphSessionFactory(IGraphSessionFact...
method UseGmailSessionFactory (line 216) | public MailApplicationBuilder UseGmailSessionFactory(IGmailSessionFact...
method UseSmtpSessionFactory (line 222) | public MailApplicationBuilder UseSmtpSessionFactory(ISmtpSessionFactor...
method AddReadHandler (line 228) | public MailApplicationBuilder AddReadHandler(IMailReadHandler handler) {
method AddMessageActionHandler (line 234) | public MailApplicationBuilder AddMessageActionHandler(IMailMessageActi...
method AddSendHandler (line 240) | public MailApplicationBuilder AddSendHandler(IMailSendHandler handler) {
method Build (line 248) | public MailApplication Build() {
FILE: Sources/Mailozaurr.Application/MailApplicationOptions.cs
class MailApplicationOptions (line 6) | public sealed class MailApplicationOptions {
FILE: Sources/Mailozaurr.Application/MailApplicationPaths.cs
class MailApplicationPaths (line 6) | public static class MailApplicationPaths {
method ResolveProfilesDirectory (line 20) | public static string ResolveProfilesDirectory() => ResolveDirectory(
method ResolveSecretsDirectory (line 27) | public static string ResolveSecretsDirectory() => ResolveDirectory(
method ResolveDraftsDirectory (line 34) | public static string ResolveDraftsDirectory() => ResolveDirectory(
method ResolveActionPlanBatchesDirectory (line 41) | public static string ResolveActionPlanBatchesDirectory() => ResolveDir...
method ResolveDirectory (line 45) | private static string ResolveDirectory(string overrideVariableName, st...
method GetBaseDirectory (line 55) | private static string GetBaseDirectory() {
FILE: Sources/Mailozaurr.Application/MailCapability.cs
type MailCapability (line 6) | [Flags]
FILE: Sources/Mailozaurr.Application/MailCapabilityCatalog.cs
class MailCapabilityCatalog (line 6) | public static class MailCapabilityCatalog {
method For (line 10) | public static ProfileCapabilities For(MailProfileKind kind) {
FILE: Sources/Mailozaurr.Application/MailDraft.cs
class MailDraft (line 6) | public sealed class MailDraft {
FILE: Sources/Mailozaurr.Application/MailDraftCompact.cs
class MailDraftCompact (line 6) | public sealed class MailDraftCompact {
FILE: Sources/Mailozaurr.Application/MailDraftService.cs
class MailDraftService (line 6) | public sealed class MailDraftService : IMailDraftService {
method MailDraftService (line 13) | public MailDraftService(IMailDraftStore store, IMailProfileStore profi...
method GetDraftsAsync (line 19) | public Task<IReadOnlyList<MailDraft>> GetDraftsAsync(CancellationToken...
method GetDraftsCompactAsync (line 23) | public async Task<IReadOnlyList<MailDraftCompact>> GetDraftsCompactAsy...
method GetDraftAsync (line 29) | public Task<MailDraft?> GetDraftAsync(string draftId, CancellationToke...
method GetDraftCompactAsync (line 33) | public async Task<MailDraftCompact?> GetDraftCompactAsync(string draft...
method SaveAsync (line 39) | public async Task<OperationResult> SaveAsync(MailDraft draft, Cancella...
method DeleteAsync (line 50) | public async Task<OperationResult> DeleteAsync(string draftId, Cancell...
method ValidateAsync (line 61) | private async Task<OperationResult> ValidateAsync(MailDraft? draft, Ca...
method ToCompact (line 86) | private static MailDraftCompact ToCompact(MailDraft draft) => new() {
FILE: Sources/Mailozaurr.Application/MailDraftStoreOptions.cs
class MailDraftStoreOptions (line 6) | public sealed class MailDraftStoreOptions {
method GetFilePath (line 16) | public string GetFilePath() {
FILE: Sources/Mailozaurr.Application/MailFolderAliasService.cs
class MailFolderAliasService (line 6) | public sealed class MailFolderAliasService : IMailFolderAliasService {
method MailFolderAliasService (line 22) | public MailFolderAliasService(IMailProfileStore profileStore, IMailRea...
method GetAliasesAsync (line 28) | public async Task<IReadOnlyList<MailFolderAliasSummary>> GetAliasesAsync(
method ResolveAsync (line 63) | public async Task<MailFolderTargetResolution> ResolveAsync(
method GetProfileAsync (line 122) | private async Task<MailProfile> GetProfileAsync(string profileId, Canc...
method TryGetFoldersAsync (line 131) | private async Task<IReadOnlyList<FolderRef>> TryGetFoldersAsync(
method IsSupported (line 150) | private static bool IsSupported(MatchMode mode, ProfileCapabilities ca...
method TryResolveAlias (line 158) | private static FolderRef? TryResolveAlias(AliasDefinition alias, IRead...
method Matches (line 178) | private static bool Matches(string? value, IReadOnlyList<string> candi...
method Normalize (line 193) | private static string Normalize(string value) {
class AliasDefinition (line 205) | private sealed class AliasDefinition {
method AliasDefinition (line 206) | public AliasDefinition(
type MatchMode (line 230) | private enum MatchMode {
FILE: Sources/Mailozaurr.Application/MailFolderAliasSummary.cs
class MailFolderAliasSummary (line 6) | public sealed class MailFolderAliasSummary {
FILE: Sources/Mailozaurr.Application/MailFolderAliases.cs
class MailFolderAliases (line 6) | public static class MailFolderAliases {
method Canonicalize (line 38) | public static string? Canonicalize(string? value) {
FILE: Sources/Mailozaurr.Application/MailFolderQuery.cs
class MailFolderQuery (line 6) | public sealed class MailFolderQuery {
FILE: Sources/Mailozaurr.Application/MailFolderTargetResolution.cs
class MailFolderTargetResolution (line 6) | public sealed class MailFolderTargetResolution {
FILE: Sources/Mailozaurr.Application/MailMessageActionBatchService.cs
class MailMessageActionBatchService (line 6) | public sealed class MailMessageActionBatchService : IMailMessageActionBa...
method MailMessageActionBatchService (line 12) | public MailMessageActionBatchService(IMailMessageActionPlanService pla...
method ExecuteAsync (line 17) | public async Task<MessageActionBatchExecutionResult> ExecuteAsync(
method AddSkippedItems (line 84) | private static void AddSkippedItems(MessageActionBatchExecutionResult ...
FILE: Sources/Mailozaurr.Application/MailMessageActionPlanBatch.cs
class MailMessageActionPlanBatch (line 6) | public sealed class MailMessageActionPlanBatch {
FILE: Sources/Mailozaurr.Application/MailMessageActionPlanBatchCompact.cs
class MailMessageActionPlanBatchCompact (line 6) | public sealed class MailMessageActionPlanBatchCompact {
FILE: Sources/Mailozaurr.Application/MailMessageActionPlanBatchQuery.cs
class MailMessageActionPlanBatchQuery (line 6) | public sealed class MailMessageActionPlanBatchQuery {
FILE: Sources/Mailozaurr.Application/MailMessageActionPlanBatchSortBy.cs
type MailMessageActionPlanBatchSortBy (line 6) | public enum MailMessageActionPlanBatchSortBy {
FILE: Sources/Mailozaurr.Application/MailMessageActionPlanBatchStoreOptions.cs
class MailMessageActionPlanBatchStoreOptions (line 6) | public sealed class MailMessageActionPlanBatchStoreOptions {
method GetFilePath (line 16) | public string GetFilePath() {
FILE: Sources/Mailozaurr.Application/MailMessageActionPlanBatchSummary.cs
class MailMessageActionPlanBatchSummary (line 6) | public sealed class MailMessageActionPlanBatchSummary {
FILE: Sources/Mailozaurr.Application/MailMessageActionPlanBatchTransformPreview.cs
class MailMessageActionPlanBatchTransformPreview (line 6) | public sealed class MailMessageActionPlanBatchTransformPreview : Operati...
FILE: Sources/Mailozaurr.Application/MailMessageActionPlanRegistryService.cs
class MailMessageActionPlanRegistryService (line 6) | public sealed class MailMessageActionPlanRegistryService : IMailMessageA...
method MailMessageActionPlanRegistryService (line 17) | public MailMessageActionPlanRegistryService(
method GetBatchesAsync (line 33) | public async Task<IReadOnlyList<MailMessageActionPlanBatch>> GetBatche...
method GetBatchesCompactAsync (line 37) | public async Task<IReadOnlyList<MailMessageActionPlanBatchCompact>> Ge...
method GetBatchesSummaryAsync (line 43) | public async Task<IReadOnlyList<MailMessageActionPlanBatchSummary>> Ge...
method GetBatchAsync (line 49) | public Task<MailMessageActionPlanBatch?> GetBatchAsync(string batchId,...
method GetBatchCompactAsync (line 53) | public async Task<MailMessageActionPlanBatchCompact?> GetBatchCompactA...
method GetBatchSummaryAsync (line 59) | public async Task<MailMessageActionPlanBatchSummary?> GetBatchSummaryA...
method SaveAsync (line 65) | public async Task<OperationResult> SaveAsync(MailMessageActionPlanBatc...
method CreateCommonBatchAsync (line 76) | public async Task<OperationResult> CreateCommonBatchAsync(
method CreateCommonBatchFromPreviewAsync (line 92) | public async Task<OperationResult> CreateCommonBatchFromPreviewAsync(
method CloneAsync (line 134) | public async Task<OperationResult> CloneAsync(string sourceBatchId, st...
method TransformCloneAsync (line 159) | public async Task<OperationResult> TransformCloneAsync(
method PreviewTransformCloneAsync (line 198) | public async Task<MailMessageActionPlanBatchTransformPreview> PreviewT...
method AppendPlanAsync (line 293) | public async Task<OperationResult> AppendPlanAsync(string batchId, Mes...
method AppendImportedPlanAsync (line 311) | public async Task<OperationResult> AppendImportedPlanAsync(string batc...
method ReplacePlanAtAsync (line 317) | public async Task<OperationResult> ReplacePlanAtAsync(string batchId, ...
method ReplaceImportedPlanAtAsync (line 338) | public async Task<OperationResult> ReplaceImportedPlanAtAsync(string b...
method RemovePlanAtAsync (line 344) | public async Task<OperationResult> RemovePlanAtAsync(string batchId, i...
method DeleteAsync (line 365) | public async Task<OperationResult> DeleteAsync(string batchId, Cancell...
method ImportAsync (line 378) | public async Task<OperationResult> ImportAsync(string batchId, string ...
method ExportAsync (line 389) | public async Task<OperationResult> ExportAsync(string batchId, string ...
method ExecuteAsync (line 400) | public async Task<MessageActionBatchExecutionResult> ExecuteAsync(stri...
method ValidateAsync (line 417) | private async Task<OperationResult> ValidateAsync(MailMessageActionPla...
method ClonePlan (line 448) | private static MessageActionExecutionPlan ClonePlan(MessageActionExecu...
method TransformPlan (line 485) | private static MessageActionExecutionPlan TransformPlan(MessageActionE...
method SelectCommonActions (line 513) | private static IReadOnlyList<MessageActionPreviewItem> SelectCommonAct...
method ResolveDestinationFolderId (line 536) | private static string? ResolveDestinationFolderId(MessageActionPreview...
method CreateConfirmationToken (line 541) | private static string? CreateConfirmationToken(MessageActionExecutionP...
method BuildTransformSummary (line 571) | private static string BuildTransformSummary(MessageActionExecutionPlan...
method SelectPlans (line 594) | private static IReadOnlyList<SelectedPlan> SelectPlans(
method ToCompact (line 654) | private static MailMessageActionPlanBatchCompact ToCompact(MailMessage...
method ToSummary (line 677) | private static MailMessageActionPlanBatchSummary ToSummary(MailMessage...
method ApplyBatchQuery (line 707) | private static IReadOnlyList<MailMessageActionPlanBatch> ApplyBatchQuery(
method ApplyBatchQuerySort (line 742) | private static IEnumerable<MailMessageActionPlanBatch> ApplyBatchQuery...
method PlanMatchesName (line 766) | private static bool PlanMatchesName(MessageActionExecutionPlan plan, s...
method BuildStoredPlanSummary (line 770) | private static string BuildStoredPlanSummary(MessageActionExecutionPla...
class SelectedPlan (line 777) | private sealed class SelectedPlan {
method SelectedPlan (line 778) | public SelectedPlan(int index, MessageActionExecutionPlan plan) {
FILE: Sources/Mailozaurr.Application/MailMessageActionPlanService.cs
class MailMessageActionPlanService (line 6) | public sealed class MailMessageActionPlanService : IMailMessageActionPla...
method MailMessageActionPlanService (line 13) | public MailMessageActionPlanService(IMailMessageActionPreviewService p...
method CreatePlanAsync (line 19) | public async Task<MessageActionExecutionPlan> CreatePlanAsync(MessageA...
method ExecuteAsync (line 117) | public Task<MessageActionResult> ExecuteAsync(MessageActionExecutionPl...
method CreateStatePlan (line 168) | private static MessageActionExecutionPlan CreateStatePlan(
method CreateMovePlan (line 180) | private static MessageActionExecutionPlan CreateMovePlan(
method CreateDeletePlan (line 192) | private static MessageActionExecutionPlan CreateDeletePlan(
method CreateBasePlan (line 202) | private static MessageActionExecutionPlan CreateBasePlan(
method FinalizePlan (line 221) | private static MessageActionExecutionPlan FinalizePlan(
method BuildPlanName (line 260) | private static string BuildPlanName(MessageActionExecutionPlan plan) =>
method BuildPlanSummary (line 275) | private static string BuildPlanSummary(MessageActionExecutionPlan plan) {
FILE: Sources/Mailozaurr.Application/MailMessageActionPreviewService.cs
class MailMessageActionPreviewService (line 6) | public sealed class MailMessageActionPreviewService : IMailMessageAction...
method MailMessageActionPreviewService (line 13) | public MailMessageActionPreviewService(IMailProfileStore profileStore,...
method PreviewReadStateAsync (line 19) | public async Task<MessageStateChangePreview> PreviewReadStateAsync(Set...
method PreviewFlaggedStateAsync (line 29) | public async Task<MessageStateChangePreview> PreviewFlaggedStateAsync(...
method PreviewCommonActionsAsync (line 39) | public async Task<CommonMessageActionsPreview> PreviewCommonActionsAsy...
method PreviewMoveAsync (line 112) | public async Task<MoveMessagesPreview> PreviewMoveAsync(MoveMessagesPr...
method PreviewDeleteAsync (line 122) | public async Task<DeleteMessagesPreview> PreviewDeleteAsync(DeleteMess...
method PreviewStandardActionsAsync (line 132) | public async Task<StandardMessageActionsPreview> PreviewStandardAction...
method CreateContextAsync (line 198) | private async Task<PreviewContext> CreateContextAsync(string profileId...
method CreateMovePreviewAsync (line 212) | private async Task<MoveMessagesPreview> CreateMovePreviewAsync(
method CreateDeletePreview (line 257) | private DeleteMessagesPreview CreateDeletePreview(DeleteMessagesPrevie...
method CreateReadStatePreview (line 285) | private MessageStateChangePreview CreateReadStatePreview(SetReadStateR...
method CreateFlaggedStatePreview (line 319) | private MessageStateChangePreview CreateFlaggedStatePreview(SetFlagged...
method NormalizeMessageIds (line 353) | private static List<string> NormalizeMessageIds(IReadOnlyList<string> ...
method CreateMovePreview (line 360) | private static MoveMessagesPreview CreateMovePreview(
method CreateDeletePreview (line 383) | private static DeleteMessagesPreview CreateDeletePreview(
method CreateStandardPreview (line 405) | private static StandardMessageActionsPreview CreateStandardPreview(Sta...
method CreateStatePreview (line 427) | private static MessageStateChangePreview CreateStatePreview(
method ToActionItem (line 452) | private static MessageActionPreviewItem ToActionItem(string action, st...
method ToActionItem (line 465) | private static MessageActionPreviewItem ToActionItem(string action, st...
method ToActionItem (line 476) | private static MessageActionPreviewItem ToActionItem(string action, st...
method CreateCommonPreview (line 488) | private static CommonMessageActionsPreview CreateCommonPreview(CommonM...
class PreviewContext (line 510) | private sealed class PreviewContext {
method PreviewContext (line 511) | public PreviewContext(MailProfile profile, int requestedCount, List<...
FILE: Sources/Mailozaurr.Application/MailProfile.cs
class MailProfile (line 6) | public sealed class MailProfile {
method GetCapabilities (line 39) | public ProfileCapabilities GetCapabilities() => Capabilities ?? Profil...
FILE: Sources/Mailozaurr.Application/MailProfileAuthDefaults.cs
class MailProfileAuthDefaults (line 6) | public static class MailProfileAuthDefaults {
FILE: Sources/Mailozaurr.Application/MailProfileAuthFlowNames.cs
class MailProfileAuthFlowNames (line 6) | public static class MailProfileAuthFlowNames {
FILE: Sources/Mailozaurr.Application/MailProfileAuthService.cs
class MailProfileAuthService (line 6) | public sealed class MailProfileAuthService : IMailProfileAuthService {
method MailProfileAuthService (line 16) | public MailProfileAuthService(
method GetStatusAsync (line 30) | public async Task<MailProfileAuthStatus?> GetStatusAsync(string profil...
method LoginGmailAsync (line 94) | public async Task<MailProfileAuthenticationResult> LoginGmailAsync(Gma...
method LoginGraphAsync (line 183) | public async Task<MailProfileAuthenticationResult> LoginGraphAsync(Gra...
method RefreshAsync (line 250) | public async Task<MailProfileAuthenticationResult> RefreshAsync(string...
method LoadProfileAsync (line 278) | private async Task<(MailProfile? Profile, MailProfileAuthenticationRes...
method TryReadSecretAsync (line 294) | private Task<string?> TryReadSecretAsync(string profileId, string secr...
method PersistSecretAsync (line 297) | private async Task<MailProfileAuthenticationResult?> PersistSecretAsyn...
method DefaultLoginGmailAsync (line 309) | private static Task<OAuthCredential> DefaultLoginGmailAsync(GmailProfi...
method DefaultLoginGraphAsync (line 318) | private static Task<OAuthCredential> DefaultLoginGraphAsync(GraphProfi...
method CloneProfile (line 328) | private static MailProfile CloneProfile(MailProfile profile) => new() {
method NormalizeScopes (line 342) | private static IReadOnlyList<string> NormalizeScopes(IReadOnlyList<str...
method FirstNonEmpty (line 347) | private static string? FirstNonEmpty(params string?[] values) {
method TryParseTimestamp (line 357) | private static DateTimeOffset? TryParseTimestamp(string? value) =>
method DetermineMode (line 362) | private static string DetermineMode(
method DetermineCanLoginInteractively (line 392) | private static bool DetermineCanLoginInteractively(
method DetermineCanRefresh (line 404) | private static bool DetermineCanRefresh(
method BuildSummary (line 417) | private static string BuildSummary(
method UpsertSetting (line 437) | private static void UpsertSetting(IDictionary<string, string> settings...
method UpsertTokenExpiration (line 446) | private static void UpsertTokenExpiration(MailProfile profile, DateTim...
method Success (line 455) | private static MailProfileAuthenticationResult Success(string message,...
method Failure (line 464) | private static MailProfileAuthenticationResult Failure(string code, st...
method FromOperation (line 472) | private static MailProfileAuthenticationResult FromOperation(Operation...
FILE: Sources/Mailozaurr.Application/MailProfileAuthStatus.cs
class MailProfileAuthStatus (line 6) | public sealed class MailProfileAuthStatus {
FILE: Sources/Mailozaurr.Application/MailProfileAuthenticationResult.cs
class MailProfileAuthenticationResult (line 6) | public sealed class MailProfileAuthenticationResult : OperationResult {
FILE: Sources/Mailozaurr.Application/MailProfileBootstrapService.cs
class MailProfileBootstrapService (line 6) | public sealed class MailProfileBootstrapService : IMailProfileBootstrapS...
method MailProfileBootstrapService (line 14) | public MailProfileBootstrapService(IMailProfileService profiles, IMail...
method SaveGraphProfileAsync (line 21) | public async Task<OperationResult> SaveGraphProfileAsync(GraphProfileB...
method SaveGmailProfileAsync (line 135) | public async Task<OperationResult> SaveGmailProfileAsync(GmailProfileB...
method CloneProfile (line 240) | private static MailProfile CloneProfile(MailProfile profile) => new() {
method UpsertSetting (line 254) | private static void UpsertSetting(IDictionary<string, string> settings...
method FirstNonEmpty (line 264) | private static string? FirstNonEmpty(params string?[] values) {
method HasStoredSecretAsync (line 275) | private async Task<bool> HasStoredSecretAsync(string profileId, string...
FILE: Sources/Mailozaurr.Application/MailProfileConnectionService.cs
class MailProfileConnectionService (line 10) | public sealed class MailProfileConnectionService : IMailProfileConnectio...
method MailProfileConnectionService (line 27) | public MailProfileConnectionService(
method TestAsync (line 55) | public async Task<MailProfileConnectionTestResult> TestAsync(
method TestImapAsync (line 84) | private async Task<MailProfileConnectionTestResult> TestImapAsync(
method TestGraphAsync (line 103) | private async Task<MailProfileConnectionTestResult> TestGraphAsync(
method TestGmailAsync (line 122) | private async Task<MailProfileConnectionTestResult> TestGmailAsync(
method TestSmtpAsync (line 141) | private async Task<MailProfileConnectionTestResult> TestSmtpAsync(
method DefaultProbeImapAsync (line 165) | private static Task DefaultProbeImapAsync(ImapClient client, Cancellat...
method DefaultProbeImapMailboxAsync (line 176) | private static async Task DefaultProbeImapMailboxAsync(ImapClient clie...
method DefaultProbeGraphAsync (line 182) | private static async Task DefaultProbeGraphAsync(GraphSession session,...
method DefaultProbeGraphMailboxAsync (line 188) | private static async Task DefaultProbeGraphMailboxAsync(GraphSession s...
method DefaultProbeGmailAsync (line 193) | private static async Task DefaultProbeGmailAsync(GmailSession session,...
method DefaultProbeGmailMailboxAsync (line 200) | private static async Task DefaultProbeGmailMailboxAsync(GmailSession s...
method DefaultProbeSmtpAsync (line 205) | private static Task DefaultProbeSmtpAsync(Smtp smtp, CancellationToken...
method ResolveTarget (line 216) | private static string? ResolveTarget(MailProfile profile) {
method ResolveScope (line 235) | private static MailProfileConnectionTestScope ResolveScope(MailProfile...
method Success (line 250) | private static MailProfileConnectionTestResult Success(
method Failure (line 267) | private static MailProfileConnectionTestResult Failure(
FILE: Sources/Mailozaurr.Application/MailProfileConnectionTestResult.cs
class MailProfileConnectionTestResult (line 6) | public sealed class MailProfileConnectionTestResult : OperationResult {
FILE: Sources/Mailozaurr.Application/MailProfileConnectionTestScope.cs
type MailProfileConnectionTestScope (line 6) | public enum MailProfileConnectionTestScope {
FILE: Sources/Mailozaurr.Application/MailProfileKind.cs
type MailProfileKind (line 6) | public enum MailProfileKind {
FILE: Sources/Mailozaurr.Application/MailProfileKindParser.cs
class MailProfileKindParser (line 6) | public static class MailProfileKindParser {
method Parse (line 10) | public static MailProfileKind Parse(string? value) {
method TryParse (line 21) | public static bool TryParse(string? value, out MailProfileKind kind) {
FILE: Sources/Mailozaurr.Application/MailProfileOverview.cs
class MailProfileOverview (line 6) | public sealed class MailProfileOverview {
FILE: Sources/Mailozaurr.Application/MailProfileOverviewCompact.cs
class MailProfileOverviewCompact (line 6) | public sealed class MailProfileOverviewCompact {
FILE: Sources/Mailozaurr.Application/MailProfileOverviewQuery.cs
class MailProfileOverviewQuery (line 6) | public sealed class MailProfileOverviewQuery {
FILE: Sources/Mailozaurr.Application/MailProfileOverviewService.cs
class MailProfileOverviewService (line 6) | public sealed class MailProfileOverviewService : IMailProfileOverviewSer...
method MailProfileOverviewService (line 13) | public MailProfileOverviewService(IMailProfileService profiles, IMailP...
method GetOverviewsAsync (line 19) | public async Task<IReadOnlyList<MailProfileOverview>> GetOverviewsAsync(
method GetCompactOverviewsAsync (line 41) | public async Task<IReadOnlyList<MailProfileOverviewCompact>> GetCompac...
method GetOverviewAsync (line 49) | public async Task<MailProfileOverview?> GetOverviewAsync(string profil...
method GetCompactOverviewAsync (line 63) | public async Task<MailProfileOverviewCompact?> GetCompactOverviewAsync...
method BuildOverviewAsync (line 68) | private async Task<MailProfileOverview> BuildOverviewAsync(MailProfile...
method BuildSummary (line 89) | private static string BuildSummary(
method MatchesProfileFilter (line 104) | private static bool MatchesProfileFilter(MailProfile profile, MailProf...
method MatchesOverviewFilter (line 120) | private static bool MatchesOverviewFilter(MailProfileOverview overview...
method SortOverviews (line 140) | private static IReadOnlyList<MailProfileOverview> SortOverviews(
method ToCompact (line 179) | private static MailProfileOverviewCompact ToCompact(MailProfileOvervie...
FILE: Sources/Mailozaurr.Application/MailProfileOverviewSortBy.cs
type MailProfileOverviewSortBy (line 6) | public enum MailProfileOverviewSortBy {
FILE: Sources/Mailozaurr.Application/MailProfileSecretService.cs
class MailProfileSecretService (line 6) | public sealed class MailProfileSecretService : IMailProfileSecretService {
method MailProfileSecretService (line 13) | public MailProfileSecretService(IMailProfileStore profileStore, IMailS...
method SetSecretAsync (line 19) | public Task<OperationResult> SetSecretAsync(string profileId, string s...
method SetSecretAsync (line 23) | public async Task<OperationResult> SetSecretAsync(
method RemoveSecretAsync (line 56) | public async Task<OperationResult> RemoveSecretAsync(string profileId,...
method ValidateAsync (line 68) | private async Task<OperationResult> ValidateAsync(string profileId, st...
FILE: Sources/Mailozaurr.Application/MailProfileService.cs
class MailProfileService (line 6) | public sealed class MailProfileService : IMailProfileService {
method MailProfileService (line 13) | public MailProfileService(IMailProfileStore profileStore, IMailSecretS...
method GetProfilesAsync (line 19) | public Task<IReadOnlyList<MailProfile>> GetProfilesAsync(CancellationT...
method GetProfileAsync (line 23) | public Task<MailProfile?> GetProfileAsync(string profileId, Cancellati...
method ValidateAsync (line 27) | public Task<MailProfileValidationResult> ValidateAsync(MailProfile pro...
method DiagnoseAsync (line 31) | public async Task<MailProfileValidationResult> DiagnoseAsync(string pr...
method SaveAsync (line 52) | public async Task<OperationResult> SaveAsync(MailProfile profile, Canc...
method DeleteAsync (line 63) | public async Task<OperationResult> DeleteAsync(string profileId, Cance...
method SetDefaultAsync (line 77) | public async Task<OperationResult> SetDefaultAsync(string profileId, C...
method GetCapabilitiesAsync (line 90) | public async Task<ProfileCapabilities?> GetCapabilitiesAsync(string pr...
method AddProviderReadinessChecksAsync (line 95) | private async Task AddProviderReadinessChecksAsync(MailProfile profile...
method RemoveKnownSecretsAsync (line 124) | private async Task RemoveKnownSecretsAsync(string profileId, Cancellat...
method HasSecretAsync (line 138) | private async Task<bool> HasSecretAsync(string profileId, string secre...
method HasSetting (line 141) | private static bool HasSetting(MailProfile profile, string key) =>
method CreateFailure (line 144) | private static MailProfileValidationResult CreateFailure(string code, ...
FILE: Sources/Mailozaurr.Application/MailProfileSettingsKeys.cs
class MailProfileSettingsKeys (line 6) | public static class MailProfileSettingsKeys {
FILE: Sources/Mailozaurr.Application/MailProfileStoreOptions.cs
class MailProfileStoreOptions (line 6) | public sealed class MailProfileStoreOptions {
method GetFilePath (line 16) | public string GetFilePath() {
FILE: Sources/Mailozaurr.Application/MailProfileValidationResult.cs
class MailProfileValidationResult (line 6) | public sealed class MailProfileValidationResult : OperationResult {
FILE: Sources/Mailozaurr.Application/MailProfileValidator.cs
class MailProfileValidator (line 6) | public static class MailProfileValidator {
method Validate (line 10) | public static MailProfileValidationResult Validate(MailProfile? profil...
method RequireSetting (line 68) | private static void RequireSetting(MailProfile profile, string key, Ma...
method RequireOneOf (line 74) | private static void RequireOneOf(MailProfile profile, MailProfileValid...
method ValidateOptionalPort (line 88) | private static void ValidateOptionalPort(MailProfile profile, MailProf...
FILE: Sources/Mailozaurr.Application/MailSearchRequest.cs
class MailSearchRequest (line 6) | public sealed class MailSearchRequest {
FILE: Sources/Mailozaurr.Application/MailSecretNames.cs
class MailSecretNames (line 6) | public static class MailSecretNames {
FILE: Sources/Mailozaurr.Application/MailSecretReferenceResolver.cs
class MailSecretReferenceResolver (line 3) | internal static class MailSecretReferenceResolver {
method ResolveAsync (line 4) | public static async Task<string?> ResolveAsync(
method Parse (line 36) | public static (string ProfileId, string SecretName) Parse(string secre...
FILE: Sources/Mailozaurr.Application/MailSecretStoreOptions.cs
class MailSecretStoreOptions (line 6) | public sealed class MailSecretStoreOptions {
method GetFilePath (line 16) | public string GetFilePath() {
FILE: Sources/Mailozaurr.Application/MailboxRef.cs
class MailboxRef (line 6) | public sealed class MailboxRef {
FILE: Sources/Mailozaurr.Application/MessageActionBatchExecutionItemResult.cs
class MessageActionBatchExecutionItemResult (line 6) | public sealed class MessageActionBatchExecutionItemResult : OperationRes...
FILE: Sources/Mailozaurr.Application/MessageActionBatchExecutionResult.cs
class MessageActionBatchExecutionResult (line 6) | public sealed class MessageActionBatchExecutionResult : OperationResult {
FILE: Sources/Mailozaurr.Application/MessageActionConfirmationTokens.cs
class MessageActionConfirmationTokens (line 9) | public static class MessageActionConfirmationTokens {
method CreateMoveToken (line 11) | public static string CreateMoveToken(
method CreateDeleteToken (line 20) | public static string CreateDeleteToken(
method CreateReadStateToken (line 28) | public static string CreateReadStateToken(
method CreateFlaggedStateToken (line 37) | public static string CreateFlaggedStateToken(
method CreateToken (line 45) | private static string CreateToken(
FILE: Sources/Mailozaurr.Application/MessageActionExecutionPlan.cs
class MessageActionExecutionPlan (line 6) | public sealed class MessageActionExecutionPlan : OperationResult {
FILE: Sources/Mailozaurr.Application/MessageActionExecutionPlanRequest.cs
class MessageActionExecutionPlanRequest (line 6) | public sealed class MessageActionExecutionPlanRequest {
FILE: Sources/Mailozaurr.Application/MessageActionItemResult.cs
class MessageActionItemResult (line 6) | public sealed class MessageActionItemResult {
FILE: Sources/Mailozaurr.Application/MessageActionPlanBatchTransformPreviewItem.cs
class MessageActionPlanBatchTransformPreviewItem (line 6) | public sealed class MessageActionPlanBatchTransformPreviewItem {
FILE: Sources/Mailozaurr.Application/MessageActionPlanBatchTransformRequest.cs
class MessageActionPlanBatchTransformRequest (line 6) | public sealed class MessageActionPlanBatchTransformRequest {
FILE: Sources/Mailozaurr.Application/MessageActionPreviewItem.cs
class MessageActionPreviewItem (line 6) | public sealed class MessageActionPreviewItem : OperationResult {
FILE: Sources/Mailozaurr.Application/MessageActionResult.cs
class MessageActionResult (line 6) | public sealed class MessageActionResult : OperationResult {
FILE: Sources/Mailozaurr.Application/MessageDetail.cs
class MessageDetail (line 6) | public sealed class MessageDetail {
FILE: Sources/Mailozaurr.Application/MessageDetailCompact.cs
class MessageDetailCompact (line 6) | public sealed class MessageDetailCompact {
FILE: Sources/Mailozaurr.Application/MessageRecipient.cs
class MessageRecipient (line 6) | public sealed class MessageRecipient {
method ToString (line 14) | public override string ToString() => string.IsNullOrWhiteSpace(Name) ?...
FILE: Sources/Mailozaurr.Application/MessageStateChangePreview.cs
class MessageStateChangePreview (line 6) | public sealed class MessageStateChangePreview : OperationResult {
FILE: Sources/Mailozaurr.Application/MessageSummary.cs
class MessageSummary (line 6) | public sealed class MessageSummary {
FILE: Sources/Mailozaurr.Application/MessageSummaryCompact.cs
class MessageSummaryCompact (line 6) | public sealed class MessageSummaryCompact {
FILE: Sources/Mailozaurr.Application/MimeAttachmentStorage.cs
class MimeAttachmentStorage (line 5) | internal static class MimeAttachmentStorage {
method ResolveAttachment (line 6) | public static MimeEntity? ResolveAttachment(IReadOnlyList<MimeEntity> ...
method ResolveDestinationPath (line 15) | public static string ResolveDestinationPath(string requestedPath, Mime...
method GetAttachmentFileName (line 29) | public static string GetAttachmentFileName(MimeEntity attachment) => a...
method SaveAttachment (line 35) | public static void SaveAttachment(MimeEntity attachment, string destin...
FILE: Sources/Mailozaurr.Application/MoveMessagesPreview.cs
class MoveMessagesPreview (line 6) | public sealed class MoveMessagesPreview : OperationResult {
FILE: Sources/Mailozaurr.Application/MoveMessagesPreviewRequest.cs
class MoveMessagesPreviewRequest (line 6) | public sealed class MoveMessagesPreviewRequest {
FILE: Sources/Mailozaurr.Application/MoveMessagesRequest.cs
class MoveMessagesRequest (line 6) | public sealed class MoveMessagesRequest {
FILE: Sources/Mailozaurr.Application/OperationResult.cs
class OperationResult (line 6) | public class OperationResult {
method Success (line 19) | public static OperationResult Success(string? message = null) => new() {
method Failure (line 27) | public static OperationResult Failure(string code, string? message = n...
FILE: Sources/Mailozaurr.Application/PendingMailQueueService.cs
class PendingMailQueueService (line 6) | public sealed class PendingMailQueueService : IMailQueueService {
method PendingMailQueueService (line 13) | public PendingMailQueueService(
method ListAsync (line 21) | public async Task<IReadOnlyList<QueuedMessageSummary>> ListAsync(Cance...
method ListCompactAsync (line 38) | public async Task<IReadOnlyList<QueuedMessageCompact>> ListCompactAsyn...
method GetAsync (line 44) | public async Task<QueuedMessageSummary?> GetAsync(string messageId, Ca...
method GetCompactAsync (line 54) | public async Task<QueuedMessageCompact?> GetCompactAsync(string messag...
method RemoveAsync (line 60) | public async Task<OperationResult> RemoveAsync(string messageId, Cance...
method ProcessAsync (line 76) | public async Task<QueueProcessResult> ProcessAsync(CancellationToken c...
method DefaultProcessAsync (line 82) | private static Task DefaultProcessAsync(
method Map (line 90) | private static QueuedMessageSummary Map(PendingMessageRecord record) =...
method ToCompact (line 100) | private static QueuedMessageCompact ToCompact(QueuedMessageSummary mes...
method MapProfileKind (line 111) | private static MailProfileKind MapProfileKind(EmailProvider provider) ...
class CountingObserver (line 120) | private sealed class CountingObserver : IPendingMessageProcessorObserv...
method MessageSkipped (line 126) | public void MessageSkipped(PendingMessageRecord record, PendingMessa...
method MessageAttemptStarted (line 130) | public void MessageAttemptStarted(PendingMessageRecord record, int a...
method MessageSent (line 134) | public void MessageSent(PendingMessageRecord record, int attempt, Ti...
method MessageFailed (line 138) | public void MessageFailed(
method MessageDropped (line 149) | public void MessageDropped(
method CreateResult (line 160) | public QueueProcessResult CreateResult() => _result;
FILE: Sources/Mailozaurr.Application/ProfileCapabilities.cs
class ProfileCapabilities (line 6) | public sealed class ProfileCapabilities {
method ProfileCapabilities (line 12) | public ProfileCapabilities(MailProfileKind kind, MailCapability capabi...
method Supports (line 26) | public bool Supports(MailCapability capability) => (Capabilities & cap...
method CreateDefault (line 31) | public static ProfileCapabilities CreateDefault(MailProfileKind kind) ...
FILE: Sources/Mailozaurr.Application/QueueProcessResult.cs
class QueueProcessResult (line 6) | public sealed class QueueProcessResult : OperationResult {
FILE: Sources/Mailozaurr.Application/QueuedMessageCompact.cs
class QueuedMessageCompact (line 6) | public sealed class QueuedMessageCompact {
FILE: Sources/Mailozaurr.Application/QueuedMessageSummary.cs
class QueuedMessageSummary (line 6) | public sealed class QueuedMessageSummary {
FILE: Sources/Mailozaurr.Application/RoutedMailMessageActionService.cs
class RoutedMailMessageActionService (line 6) | public sealed class RoutedMailMessageActionService : IMailMessageActionS...
method RoutedMailMessageActionService (line 14) | public RoutedMailMessageActionService(
method SetReadStateAsync (line 28) | public async Task<MessageActionResult> SetReadStateAsync(SetReadStateR...
method SetFlaggedStateAsync (line 46) | public async Task<MessageActionResult> SetFlaggedStateAsync(SetFlagged...
method MoveAsync (line 64) | public async Task<MessageActionResult> MoveAsync(MoveMessagesRequest r...
method DeleteAsync (line 83) | public async Task<MessageActionResult> DeleteAsync(DeleteMessagesReque...
method GetProfileAsync (line 100) | private async Task<MailProfile> GetProfileAsync(string profileId, Canc...
method GetHandler (line 109) | private IMailMessageActionHandler GetHandler(MailProfileKind kind) =>
method NormalizeMoveRequestAsync (line 114) | private async Task<MoveMessagesRequest> NormalizeMoveRequestAsync(
method CloneMoveRequest (line 144) | private static MoveMessagesRequest CloneMoveRequest(MoveMessagesReques...
method ValidateMoveConfirmation (line 154) | private static MessageActionResult? ValidateMoveConfirmation(MoveMessa...
method ValidateDeleteConfirmation (line 178) | private static MessageActionResult? ValidateDeleteConfirmation(DeleteM...
method ValidateReadStateConfirmation (line 201) | private static MessageActionResult? ValidateReadStateConfirmation(SetR...
method ValidateFlaggedStateConfirmation (line 225) | private static MessageActionResult? ValidateFlaggedStateConfirmation(S...
method EnsureCapability (line 249) | private static void EnsureCapability(MailProfile profile, MailCapabili...
FILE: Sources/Mailozaurr.Application/RoutedMailReadService.cs
class RoutedMailReadService (line 6) | public sealed class RoutedMailReadService : IMailReadService {
method RoutedMailReadService (line 13) | public RoutedMailReadService(IMailProfileStore profileStore, IEnumerab...
method GetFoldersAsync (line 23) | public async Task<IReadOnlyList<FolderRef>> GetFoldersAsync(MailFolder...
method GetFoldersCompactAsync (line 30) | public async Task<IReadOnlyList<FolderRefCompact>> GetFoldersCompactAs...
method SearchAsync (line 36) | public async Task<IReadOnlyList<MessageSummary>> SearchAsync(MailSearc...
method SearchCompactAsync (line 43) | public async Task<IReadOnlyList<MessageSummaryCompact>> SearchCompactA...
method GetAttachmentsAsync (line 49) | public async Task<IReadOnlyList<AttachmentSummary>> GetAttachmentsAsyn...
method SaveAttachmentsAsync (line 62) | public async Task<SaveAttachmentsResult> SaveAttachmentsAsync(SaveAtta...
method SaveAttachmentsManyAsync (line 131) | public async Task<SaveAttachmentsManyResult> SaveAttachmentsManyAsync(...
method GetMessageAsync (line 194) | public async Task<MessageDetail?> GetMessageAsync(GetMessageRequest re...
method GetMessagesAsync (line 201) | public async Task<IReadOnlyList<MessageDetail>> GetMessagesAsync(GetMe...
method GetMessageCompactAsync (line 227) | public async Task<MessageDetailCompact?> GetMessageCompactAsync(GetMes...
method GetMessagesCompactAsync (line 233) | public async Task<IReadOnlyList<MessageDetailCompact>> GetMessagesComp...
method SaveAttachmentAsync (line 239) | public async Task<OperationResult> SaveAttachmentAsync(SaveAttachmentR...
method GetProfileAsync (line 245) | private async Task<MailProfile> GetProfileAsync(string profileId, Canc...
method GetHandler (line 254) | private IMailReadHandler GetHandler(MailProfileKind kind) =>
method EnsureCapability (line 259) | private static void EnsureCapability(MailProfile profile, MailCapabili...
method ToCompact (line 265) | private static MessageSummaryCompact ToCompact(MessageSummary summary)...
method ToCompact (line 278) | private static MessageDetailCompact ToCompact(MessageDetail detail) =>...
method FilterAttachments (line 289) | private static IEnumerable<AttachmentSummary> FilterAttachments(
method ToCompact (line 334) | private static FolderRefCompact ToCompact(FolderRef folder) => new() {
method ToCopy (line 346) | private static AttachmentSummary ToCopy(AttachmentSummary attachment) ...
method CreatePreview (line 356) | private static string? CreatePreview(string? value) {
method FormatRecipient (line 368) | private static string? FormatRecipient(MessageRecipient recipient) {
FILE: Sources/Mailozaurr.Application/RoutedMailSendService.cs
class RoutedMailSendService (line 6) | public sealed class RoutedMailSendService : IMailSendService {
method RoutedMailSendService (line 13) | public RoutedMailSendService(IMailProfileStore profileStore, IEnumerab...
method SendAsync (line 23) | public async Task<SendResult> SendAsync(SendMessageRequest request, Ca...
FILE: Sources/Mailozaurr.Application/SaveAttachmentRequest.cs
class SaveAttachmentRequest (line 6) | public sealed class SaveAttachmentRequest {
FILE: Sources/Mailozaurr.Application/SaveAttachmentsManyRequest.cs
class SaveAttachmentsManyRequest (line 6) | public sealed class SaveAttachmentsManyRequest {
FILE: Sources/Mailozaurr.Application/SaveAttachmentsManyResult.cs
class SaveAttachmentsManyResult (line 6) | public sealed class SaveAttachmentsManyResult : OperationResult {
FILE: Sources/Mailozaurr.Application/SaveAttachmentsRequest.cs
class SaveAttachmentsRequest (line 6) | public sealed class SaveAttachmentsRequest {
FILE: Sources/Mailozaurr.Application/SaveAttachmentsResult.cs
class SaveAttachmentsResult (line 6) | public sealed class SaveAttachmentsResult : OperationResult {
FILE: Sources/Mailozaurr.Application/SavedAttachmentResult.cs
class SavedAttachmentResult (line 6) | public sealed class SavedAttachmentResult : OperationResult {
FILE: Sources/Mailozaurr.Application/SendMessageRequest.cs
class SendMessageRequest (line 6) | public sealed class SendMessageRequest {
FILE: Sources/Mailozaurr.Application/SendResult.cs
class SendResult (line 6) | public sealed class SendResult : OperationResult {
FILE: Sources/Mailozaurr.Application/SetFlaggedStateRequest.cs
class SetFlaggedStateRequest (line 6) | public sealed class SetFlaggedStateRequest {
FILE: Sources/Mailozaurr.Application/SetReadStateRequest.cs
class SetReadStateRequest (line 6) | public sealed class SetReadStateRequest {
FILE: Sources/Mailozaurr.Application/SmtpMailSendHandler.cs
class SmtpMailSendHandler (line 9) | public sealed class SmtpMailSendHandler : IMailSendHandler {
method SmtpMailSendHandler (line 18) | public SmtpMailSendHandler(
method SendAsync (line 33) | public async Task<SendResult> SendAsync(MailProfile profile, SendMessa...
method DefaultSendAsync (line 91) | private static Task<SmtpResult> DefaultSendAsync(
FILE: Sources/Mailozaurr.Application/SmtpSessionFactory.cs
class SmtpSessionFactory (line 9) | public sealed class SmtpSessionFactory : ISmtpSessionFactory {
method SmtpSessionFactory (line 16) | public SmtpSessionFactory(
method ConnectAsync (line 24) | public async Task<Smtp> ConnectAsync(MailProfile profile, Cancellation...
method CreateRequestAsync (line 36) | private async Task<SmtpSessionRequest> CreateRequestAsync(MailProfile ...
method ResolveSecretAsync (line 60) | private async Task<string> ResolveSecretAsync(MailProfile profile, Pro...
method DefaultConnectAsync (line 82) | private static async Task<Smtp> DefaultConnectAsync(SmtpSessionRequest...
method ResolveUserName (line 95) | private static string ResolveUserName(MailProfile profile) {
method RequireSetting (line 112) | private static string RequireSetting(MailProfile profile, string key) {
method GetAuthMode (line 120) | private static ProtocolAuthMode GetAuthMode(MailProfile profile) {
method GetSecureSocketOptions (line 125) | private static SecureSocketOptions GetSecureSocketOptions(MailProfile ...
method GetIntSetting (line 137) | private static int? GetIntSetting(MailProfile profile, string key) {
method GetDoubleSetting (line 148) | private static double? GetDoubleSetting(MailProfile profile, string ke...
method GetBoolSetting (line 159) | private static bool? GetBoolSetting(MailProfile profile, string key) {
FILE: Sources/Mailozaurr.Application/StandardMessageActionsPreview.cs
class StandardMessageActionsPreview (line 6) | public sealed class StandardMessageActionsPreview : OperationResult {
FILE: Sources/Mailozaurr.Application/StandardMessageActionsPreviewRequest.cs
class StandardMessageActionsPreviewRequest (line 6) | public sealed class StandardMessageActionsPreviewRequest {
FILE: Sources/Mailozaurr.Cli/CliArguments.cs
class CliArguments (line 3) | internal sealed class CliArguments {
method HasFlag (line 10) | public bool HasFlag(string name) {
method GetOption (line 15) | public string? GetOption(string name) =>
method GetOptionValues (line 20) | public IReadOnlyList<string?> GetOptionValues(string name) =>
method GetIntOption (line 25) | public int? GetIntOption(string name) {
method GetIntOptionValues (line 37) | public IReadOnlyList<int> GetIntOptionValues(string name) {
method Parse (line 59) | public static CliArguments Parse(IReadOnlyList<string> args) {
FILE: Sources/Mailozaurr.Cli/CliRunner.cs
class CliRunner (line 8) | public static class CliRunner {
method RunAsync (line 13) | public static async Task<int> RunAsync(
method ExecuteAsync (line 66) | private static async Task<int> ExecuteAsync(
method ExecuteProfileAsync (line 84) | private static async Task<int> ExecuteProfileAsync(
method ExecuteMailAsync (line 287) | private static async Task<int> ExecuteMailAsync(
method ExecuteDraftAsync (line 810) | private static async Task<int> ExecuteDraftAsync(
method ExecuteQueueAsync (line 875) | private static async Task<int> ExecuteQueueAsync(
method ExecuteSendAsync (line 931) | private static async Task<int> ExecuteSendAsync(
method ExecuteMcpAsync (line 945) | private static async Task<int> ExecuteMcpAsync(
method WriteUnknownCommandAsync (line 964) | private static async Task<int> WriteUnknownCommandAsync(string command...
method RequireOption (line 969) | private static string RequireOption(CliArguments parseResult, string n...
method BuildProfile (line 978) | private static MailProfile BuildProfile(CliArguments parseResult) {
method BuildMessageActionExecutionPlanRequest (line 1011) | private static MessageActionExecutionPlanRequest BuildMessageActionExe...
method BuildCommonActionsPreviewRequest (line 1024) | private static CommonMessageActionsPreviewRequest BuildCommonActionsPr...
method BuildMessageActionPlanBatchTransformRequest (line 1035) | private static MessageActionPlanBatchTransformRequest BuildMessageActi...
method BuildMessageActionPlanBatchQuery (line 1047) | private static MailMessageActionPlanBatchQuery? BuildMessageActionPlan...
method ParseBatchSortBy (line 1080) | private static MailMessageActionPlanBatchSortBy ParseBatchSortBy(strin...
method BuildSendRequestAsync (line 1096) | private static async Task<SendMessageRequest> BuildSendRequestAsync(Ma...
method BuildMailDraftAsync (line 1133) | private static async Task<MailDraft> BuildMailDraftAsync(MailApplicati...
method CreateSendRequestFromDraft (line 1163) | private static SendMessageRequest CreateSendRequestFromDraft(DraftMess...
method ToRecipient (line 1171) | private static MessageRecipient ToRecipient(string value) => new() {
method BuildDraftMessage (line 1175) | private static DraftMessage BuildDraftMessage(CliArguments parseResult...
method CloneDraftMessage (line 1219) | private static DraftMessage CloneDraftMessage(DraftMessage draft) => n...
method ToRecipientCopy (line 1242) | private static MessageRecipient ToRecipientCopy(MessageRecipient recip...
method WriteItemAsync (line 1247) | private static async Task WriteItemAsync<T>(
method WriteSequenceAsync (line 1260) | private static async Task WriteSequenceAsync<T>(
method ResolveSensitiveOptionAsync (line 1275) | private static async Task<string?> ResolveSensitiveOptionAsync(
method WriteExceptionAsync (line 1318) | private static async Task WriteExceptionAsync(TextWriter error, Except...
method WriteHelp (line 1333) | private static void WriteHelp(TextWriter output) {
method ParseConnectionTestScope (line 1421) | private static MailProfileConnectionTestScope ParseConnectionTestScope...
method BuildProfileOverviewQuery (line 1433) | private static MailProfileOverviewQuery BuildProfileOverviewQuery(CliA...
method ParseProfileOverviewSortBy (line 1455) | private static MailProfileOverviewSortBy ParseProfileOverviewSortBy(st...
class CliErrorEnvelope (line 1463) | private sealed class CliErrorEnvelope {
class CliError (line 1467) | private sealed class CliError {
FILE: Sources/Mailozaurr.Cli/Mcp/MailMcpTools.cs
class MailMcpTools (line 7) | [McpServerToolType]
method MailMcpTools (line 11) | public MailMcpTools(MailApplication application) {
method mail_profiles_list (line 15) | [McpServerTool]
method mail_profiles_summary_list (line 20) | [McpServerTool]
method mail_profiles_summary_compact_list (line 43) | [McpServerTool]
method mail_capabilities_get (line 66) | [McpServerTool]
method mail_profile_get (line 75) | [McpServerTool]
method mail_profile_doctor (line 84) | [McpServerTool]
method mail_profile_summary (line 91) | [McpServerTool]
method mail_profile_summary_compact (line 100) | [McpServerTool]
method mail_profile_validate (line 109) | [McpServerTool]
method mail_profile_save (line 122) | [McpServerTool]
method mail_profile_graph_bootstrap (line 155) | [McpServerTool]
method mail_profile_gmail_bootstrap (line 198) | [McpServerTool]
method mail_profile_graph_login (line 237) | [McpServerTool]
method mail_profile_gmail_login (line 258) | [McpServerTool]
method mail_profile_refresh_auth (line 277) | [McpServerTool]
method mail_profile_auth_status (line 284) | [McpServerTool]
method mail_profile_test (line 293) | [McpServerTool]
method mail_profile_delete (line 301) | [McpServerTool]
method mail_profile_set_default (line 308) | [McpServerTool]
method mail_profile_secret_set (line 315) | [McpServerTool]
method mail_profile_secret_remove (line 330) | [McpServerTool]
method mail_folders_list (line 338) | [McpServerTool]
method mail_folders_compact_list (line 353) | [McpServerTool]
method mail_folder_aliases_list (line 368) | [McpServerTool]
method mail_folder_resolve (line 376) | [McpServerTool]
method mail_action_plan (line 385) | [McpServerTool]
method mail_action_batch_store_list (line 406) | [McpServerTool]
method mail_action_batch_store_compact_list (line 417) | [McpServerTool]
method mail_action_batch_store_summary_list (line 428) | [McpServerTool]
method mail_action_batch_store_get (line 439) | [McpServerTool]
method mail_action_batch_store_compact_get (line 448) | [McpServerTool]
method mail_action_batch_store_summary_get (line 457) | [McpServerTool]
method mail_action_batch_store_import (line 466) | [McpServerTool]
method mail_action_batch_store_export (line 476) | [McpServerTool]
method mail_action_batch_store_create_common (line 484) | [McpServerTool]
method mail_action_batch_store_create_from_preview (line 511) | [McpServerTool]
method mail_action_batch_store_clone (line 528) | [McpServerTool]
method mail_action_batch_store_transform_clone (line 538) | [McpServerTool]
method mail_action_batch_store_transform_preview (line 567) | [McpServerTool]
method mail_action_batch_store_append_plan (line 590) | [McpServerTool]
method mail_action_batch_store_append_imported_plan (line 615) | [McpServerTool]
method mail_action_batch_store_replace_plan (line 623) | [McpServerTool]
method mail_action_batch_store_replace_imported_plan (line 649) | [McpServerTool]
method mail_action_batch_store_remove_plan (line 658) | [McpServerTool]
method mail_action_batch_store_delete (line 666) | [McpServerTool]
method mail_action_batch_store_execute (line 673) | [McpServerTool]
method mail_action_plan_export (line 681) | [McpServerTool]
method mail_action_plan_import (line 707) | [McpServerTool]
method mail_action_batch_export (line 714) | [McpServerTool]
method mail_action_batch_import (line 727) | [McpServerTool]
method mail_action_execute (line 734) | [McpServerTool]
method mail_action_batch_execute (line 758) | [McpServerTool]
method mail_actions_bundle_preview (line 769) | [McpServerTool]
method mail_actions_preview (line 786) | [McpServerTool]
method mail_move_preview (line 803) | [McpServerTool]
method mail_delete_preview (line 820) | [McpServerTool]
method mail_search (line 835) | [McpServerTool]
method mail_search_compact (line 860) | [McpServerTool]
method mail_get (line 885) | [McpServerTool]
method mail_get_compact (line 905) | [McpServerTool]
method mail_get_many (line 925) | [McpServerTool]
method mail_get_many_compact (line 942) | [McpServerTool]
method mail_mark_read_preview (line 959) | [McpServerTool]
method mail_mark_read (line 976) | [McpServerTool]
method mail_flag_preview (line 995) | [McpServerTool]
method mail_flag (line 1012) | [McpServerTool]
method mail_archive (line 1031) | [McpServerTool]
method mail_trash (line 1049) | [McpServerTool]
method mail_move (line 1067) | [McpServerTool]
method mail_delete (line 1086) | [McpServerTool]
method mail_attachments_list (line 1103) | [McpServerTool]
method mail_attachment_save (line 1118) | [McpServerTool]
method mail_attachments_save (line 1139) | [McpServerTool]
method mail_attachments_save_many (line 1164) | [McpServerTool]
method mail_send (line 1189) | [McpServerTool]
method mail_draft_list (line 1211) | [McpServerTool]
method mail_draft_compact_list (line 1216) | [McpServerTool]
method mail_draft_get (line 1221) | [McpServerTool]
method mail_draft_compact_get (line 1230) | [McpServerTool]
method mail_draft_save (line 1239) | [McpServerTool]
method mail_draft_delete (line 1261) | [McpServerTool]
method mail_draft_import (line 1268) | [McpServerTool]
method mail_draft_export (line 1291) | [McpServerTool]
method mail_draft_send (line 1306) | [McpServerTool]
method mail_queue_list (line 1325) | [McpServerTool]
method mail_queue_compact_list (line 1330) | [McpServerTool]
method mail_queue_get (line 1335) | [McpServerTool]
method mail_queue_compact_get (line 1344) | [McpServerTool]
method mail_queue_remove (line 1353) | [McpServerTool]
method mail_queue_process (line 1360) | [McpServerTool]
method BuildDraftMessage (line 1365) | private static DraftMessage BuildDraftMessage(
method CloneDraftMessage (line 1405) | private static DraftMessage CloneDraftMessage(DraftMessage draft) => n...
method AddRecipients (line 1428) | private static void AddRecipients(ICollection<MessageRecipient> destin...
method ToRecipientCopy (line 1440) | private static MessageRecipient ToRecipientCopy(MessageRecipient recip...
method BuildBatchQuery (line 1445) | private static MailMessageActionPlanBatchQuery? BuildBatchQuery(IReadO...
method ParseBatchSortBy (line 1477) | private static MailMessageActionPlanBatchSortBy ParseBatchSortBy(strin...
method ParseConnectionTestScope (line 1493) | private static MailProfileConnectionTestScope ParseConnectionTestScope...
FILE: Sources/Mailozaurr.Cli/Mcp/McpServerHost.cs
class McpServerHost (line 7) | internal static class McpServerHost {
method RunAsync (line 8) | public static async Task RunAsync(MailApplication application, Cancell...
FILE: Sources/Mailozaurr.Examples/AcquireGoogleTokenInteractive.cs
class AcquireGoogleTokenInteractive (line 8) | public static class AcquireGoogleTokenInteractive {
method RunAsync (line 10) | public static async Task RunAsync() {
FILE: Sources/Mailozaurr.Examples/AcquireO365TokenDeviceCode.cs
class AcquireO365TokenDeviceCode (line 8) | public static class AcquireO365TokenDeviceCode {
method RunAsync (line 10) | public static async Task RunAsync() {
FILE: Sources/Mailozaurr.Examples/AcquireO365TokenInteractive.cs
class AcquireO365TokenInteractive (line 8) | public static class AcquireO365TokenInteractive {
method RunAsync (line 10) | public static async Task RunAsync() {
FILE: Sources/Mailozaurr.Examples/BuildGraphUriExample.cs
class BuildGraphUriExample (line 6) | public static class BuildGraphUriExample {
method Run (line 7) | public static void Run() {
FILE: Sources/Mailozaurr.Examples/DetectNonDeliveryReportExample.cs
class DetectNonDeliveryReportExample (line 10) | public static class DetectNonDeliveryReportExample {
method Run (line 12) | public static void Run() {
FILE: Sources/Mailozaurr.Examples/FetchGmailMessages.cs
class FetchGmailMessages (line 8) | public static class FetchGmailMessages {
method RunAsync (line 10) | public static async Task RunAsync() {
FILE: Sources/Mailozaurr.Examples/FetchImapMessages.cs
class FetchImapMessages (line 12) | public static class FetchImapMessages {
method RunAsync (line 14) | public static async Task RunAsync() {
FILE: Sources/Mailozaurr.Examples/FetchPopMessages.cs
class FetchPopMessages (line 10) | public static class FetchPopMessages {
method RunAsync (line 12) | public static async Task RunAsync() {
FILE: Sources/Mailozaurr.Examples/GenerateTemporaryMailCrypto.cs
class GenerateTemporaryMailCrypto (line 7) | public static class GenerateTemporaryMailCrypto
method Run (line 10) | public static void Run()
FILE: Sources/Mailozaurr.Examples/GenerateTemporaryPgpKeyPair.cs
class GenerateTemporaryPgpKeyPair (line 7) | public static class GenerateTemporaryPgpKeyPair
method Run (line 10) | public static void Run()
FILE: Sources/Mailozaurr.Examples/GenerateTemporarySmimeCertificate.cs
class GenerateTemporarySmimeCertificate (line 7) | public static class GenerateTemporarySmimeCertificate
method Run (line 10) | public static void Run()
FILE: Sources/Mailozaurr.Examples/ImapIdleListenerExample.cs
class ImapIdleListenerExample (line 10) | public static class ImapIdleListenerExample {
method RunAsync (line 12) | public static async Task RunAsync() {
FILE: Sources/Mailozaurr.Examples/ImapIdleListenerFilteredExample.cs
class ImapIdleListenerFilteredExample (line 10) | public static class ImapIdleListenerFilteredExample {
method RunAsync (line 12) | public static async Task RunAsync() {
FILE: Sources/Mailozaurr.Examples/NonDeliveryReportServiceExample.cs
class NonDeliveryReportServiceExample (line 11) | public static class NonDeliveryReportServiceExample {
method RunAsync (line 13) | public static async Task RunAsync() {
FILE: Sources/Mailozaurr.Examples/ParseNonDeliveryReportExample.cs
class ParseNonDeliveryReportExample (line 8) | public static class ParseNonDeliveryReportExample {
method Run (line 10) | public static void Run() {
FILE: Sources/Mailozaurr.Examples/PendingMessageRepositoryExample.cs
class PendingMessageRepositoryExample (line 9) | public static class PendingMessageRepositoryExample {
method RunAsync (line 11) | public static async Task RunAsync() {
FILE: Sources/Mailozaurr.Examples/Program.cs
class Program (line 3) | class Program {
method Main (line 4) | static async Task Main(string[] args) {
FILE: Sources/Mailozaurr.Examples/RetrieveAndCorrelateNonDeliveryReportsExample.cs
class RetrieveAndCorrelateNonDeliveryReportsExample (line 12) | public static class RetrieveAndCorrelateNonDeliveryReportsExample {
method RunAsync (line 14) | public static async Task RunAsync() {
FILE: Sources/Mailozaurr.Examples/RetrieveDmarcReportsExample.cs
class RetrieveDmarcReportsExample (line 9) | public static class RetrieveDmarcReportsExample {
method RunAsync (line 10) | public static async Task RunAsync(ImapClient client) {
class DomainDetective (line 22) | public static class DomainDetective {
method Process (line 23) | public static void Process(Stream zip, string name) {
FILE: Sources/Mailozaurr.Examples/SearchBodyContainsExample.cs
class SearchBodyContainsExample (line 11) | public static class SearchBodyContainsExample {
method RunAsync (line 13) | public static async Task RunAsync() {
FILE: Sources/Mailozaurr.Examples/SearchNonDeliveryReportsExample.cs
class SearchNonDeliveryReportsExample (line 11) | public static class SearchNonDeliveryReportsExample {
method RunAsync (line 13) | public static async Task RunAsync() {
FILE: Sources/Mailozaurr.Examples/SendEmailAttachments.cs
class SendEmailAttachments (line 6) | public static class SendEmailAttachments
method Run (line 10) | public static void Run()
FILE: Sources/Mailozaurr.Examples/SendEmailGmail.cs
class SendEmailGmail (line 8) | public static class SendEmailGmail {
method Run (line 10) | public static void Run() {
FILE: Sources/Mailozaurr.Examples/SendEmailGmailApi.cs
class SendEmailGmailApi (line 9) | public static class SendEmailGmailApi {
method RunAsync (line 11) | public static async Task RunAsync() {
FILE: Sources/Mailozaurr.Examples/SendEmailGraphCertificate.cs
class SendEmailGraphCertificate (line 5) | public static class SendEmailGraphCertificate {
method RunAsync (line 6) | public static async Task RunAsync() {
FILE: Sources/Mailozaurr.Examples/SendEmailGraphClientSecret.cs
class SendEmailGraphClientSecret (line 6) | public static class SendEmailGraphClientSecret {
method RunAsync (line 7) | public static async Task RunAsync() {
FILE: Sources/Mailozaurr.Examples/SendEmailGraphWithPolicy.cs
class SendEmailGraphWithPolicy (line 7) | public static class SendEmailGraphWithPolicy
method RunAsync (line 9) | public static async Task RunAsync()
FILE: Sources/Mailozaurr.Examples/SendEmailHeadersGraph.cs
class SendEmailHeadersGraph (line 7) | public static class SendEmailHeadersGraph
method RunAsync (line 9) | public static async Task RunAsync()
FILE: Sources/Mailozaurr.Examples/SendEmailHeadersSendGrid.cs
class SendEmailHeadersSendGrid (line 7) | public static class SendEmailHeadersSendGrid
method RunAsync (line 9) | public static async Task RunAsync()
FILE: Sources/Mailozaurr.Examples/SendEmailHeadersSmtp.cs
class SendEmailHeadersSmtp (line 5) | public static class SendEmailHeadersSmtp
method Run (line 7) | public static void Run()
FILE: Sources/Mailozaurr.Examples/SendEmailMailgun.cs
class SendEmailMailgun (line 10) | public static class SendEmailMailgun {
method RunAsync (line 12) | public static async Task RunAsync() {
FILE: Sources/Mailozaurr.Examples/SendEmailPgp.cs
class SendEmailPgp (line 7) | public static class SendEmailPgp {
method Run (line 9) | public static void Run() {
FILE: Sources/Mailozaurr.Examples/SendEmailRemoteImages.cs
class SendEmailRemoteImages (line 6) | public static class SendEmailRemoteImages
method Run (line 8) | public static void Run()
FILE: Sources/Mailozaurr.Examples/SendEmailSasl.cs
class SendEmailSasl (line 7) | public static class SendEmailSasl {
method Run (line 9) | public static void Run() {
FILE: Sources/Mailozaurr.Examples/SendEmailSmtpAsync.cs
class SendEmailSmtpAsync (line 10) | public static class SendEmailSmtpAsync {
method RunAsync (line 12) | public static async Task RunAsync() {
FILE: Sources/Mailozaurr.Examples/SendEmailVerifyAttachments.cs
class SendEmailVerifyAttachments (line 4) | public static class SendEmailVerifyAttachments
method Run (line 6) | public static void Run()
FILE: Sources/Mailozaurr.Examples/SendTemplatedEmailSes.cs
class SendTemplatedEmailSes (line 11) | public static class SendTemplatedEmailSes {
method RunAsync (line 13) | public static async Task RunAsync() {
FILE: Sources/Mailozaurr.Examples/SmtpPendingMessageExample.cs
class SmtpPendingMessageExample (line 7) | public static class SmtpPendingMessageExample {
method RunAsync (line 9) | public static async Task RunAsync() {
FILE: Sources/Mailozaurr.Examples/SmtpProcessPendingMessagesExample.cs
class SmtpProcessPendingMessagesExample (line 7) | public static class SmtpProcessPendingMessagesExample {
method RunAsync (line 9) | public static async Task RunAsync() {
FILE: Sources/Mailozaurr.Msg/Definitions/EmlConversionResult.cs
class EmlConversionResult (line 10) | public class EmlConversionResult {
FILE: Sources/Mailozaurr.Msg/Definitions/MsgConversionResult.cs
class MsgConversionResult (line 10) | public class MsgConversionResult {
FILE: Sources/Mailozaurr.Msg/EmailMessage.cs
class EmailMessage (line 9) | public static class EmailMessage {
method ConvertEmlToMsg (line 17) | public static IEnumerable<EmlConversionResult> ConvertEmlToMsg(string[...
method ConvertEmlToMsg (line 29) | public static EmlConversionResult ConvertEmlToMsg(FileInfo emlFile, Fi...
method ConvertMsgToEml (line 62) | public static IEnumerable<MsgConversionResult> ConvertMsgToEml(string[...
method ConvertMsgToEml (line 74) | public static MsgConversionResult ConvertMsgToEml(FileInfo msgFile, Fi...
method ConvertFiles (line 100) | private static IEnumerable<TResult> ConvertFiles<TResult>(string[] inp...
method CreateTempOutputPath (line 111) | private static string CreateTempOutputPath(FileInfo targetFile) {
method TryFinalizeConvertedFile (line 119) | private static bool TryFinalizeConvertedFile(string tempFile, string t...
method TryReplaceFile (line 137) | private static bool TryReplaceFile(string sourceFile, string destinati...
method SafeDelete (line 162) | private static void SafeDelete(string path) {
FILE: Sources/Mailozaurr.Msg/MailFileModels.cs
type MailFileFormat (line 4) | public enum MailFileFormat {
type MailFileRecipientType (line 12) | public enum MailFileRecipientType {
class MailFileAddress (line 28) | public sealed class MailFileAddress {
method MailFileAddress (line 33) | public MailFileAddress(string? address, string? displayName = null, st...
method ToString (line 47) | public override string ToString() {
class MailFileRecipient (line 59) | public sealed class MailFileRecipient {
method MailFileRecipient (line 63) | public MailFileRecipient(MailFileRecipientType type, MailFileAddress a...
class MailFileAttachment (line 75) | public sealed class MailFileAttachment {
class MailFileMessage (line 91) | public sealed class MailFileMessage {
FILE: Sources/Mailozaurr.Msg/MailFileReader.cs
class MailFileReader (line 14) | public static class MailFileReader {
method Read (line 19) | public static MailFileMessage Read(string path, MailFileReaderOptions?...
method Read (line 31) | public static MailFileMessage Read(FileInfo fileInfo, MailFileReaderOp...
method TryRead (line 59) | public static bool TryRead(string path, out MailFileMessage? message, ...
method ReadMsg (line 85) | private static MailFileMessage ReadMsg(FileInfo fileInfo, MailFileRead...
method ReadEml (line 125) | private static MailFileMessage ReadEml(FileInfo fileInfo, MailFileRead...
method BuildRecipients (line 162) | private static List<MailFileRecipient> BuildRecipients(List<MsgReader....
method BuildRecipients (line 181) | private static List<MailFileAddress> BuildRecipients(IEnumerable<RfcMa...
method MapRecipientType (line 200) | private static MailFileRecipientType MapRecipientType(MsgReader.Outloo...
method CreateAddress (line 211) | private static MailFileAddress? CreateAddress(RfcMailAddress? address) {
method CreateAddress (line 219) | private static MailFileAddress? CreateAddress(string? address, string?...
method DecodeBody (line 227) | private static string? DecodeBody(MessagePart? part) {
method BuildMsgAttachments (line 250) | private static IReadOnlyList<MailFileAttachment> BuildMsgAttachments(L...
method BuildEmlAttachments (line 276) | private static IReadOnlyList<MailFileAttachment> BuildEmlAttachments(I...
method ResolveAttachmentFileName (line 297) | private static string? ResolveAttachmentFileName(MessagePart attachmen...
method ExtractHeaders (line 315) | private static IReadOnlyDictionary<string, string>? ExtractHeaders(Mes...
method MergeHeaders (line 323) | private static IReadOnlyDictionary<string, string> MergeHeaders(NameVa...
method AddHeaders (line 333) | private static void AddHeaders(IDictionary<string, string> destination...
FILE: Sources/Mailozaurr.Msg/MailFileReaderOptions.cs
class MailFileReaderOptions (line 4) | public sealed class MailFileReaderOptions {
FILE: Sources/Mailozaurr.PowerShell/CmdletAddGraphMailboxPermission.cs
class CmdletAddGraphMailboxPermission (line 13) | [Cmdlet(VerbsCommon.Add, "GraphMailboxPermission", SupportsShouldProcess...
method ProcessRecordAsync (line 79) | protected override async Task ProcessRecordAsync() {
method ProcessCsvAsync (line 110) | private async Task ProcessCsvAsync(GraphCredential cred) {
method ProcessGraphAsync (line 120) | private async Task ProcessGraphAsync(GraphCredential cred, object perm...
method ProcessMgGraph (line 156) | private void ProcessMgGraph() {
method InvokeMgGraph (line 182) | private void InvokeMgGraph(string body) {
FILE: Sources/Mailozaurr.PowerShell/CmdletClearGraphJunk.cs
class CmdletClearGraphJunk (line 13) | [Cmdlet(VerbsCommon.Clear, "GraphJunk", SupportsShouldProcess = true, Co...
method ProcessRecordAsync (line 111) | protected override Task ProcessRecordAsync() {
method ProcessGraphAsync (line 135) | private async Task ProcessGraphAsync(GraphCredential cred) {
method ProcessPreviewGraphAsync (line 189) | private async Task ProcessPreviewGraphAsync(GraphCredential cred) {
method ProcessMgGraph (line 215) | private void ProcessMgGraph() {
method ProcessPreviewMgGraph (line 282) | private void ProcessPreviewMgGraph() {
FILE: Sources/Mailozaurr.PowerShell/CmdletClearIMAPJunk.cs
class CmdletClearIMAPJunk (line 13) | [Cmdlet(VerbsCommon.Clear, "IMAPJunk", SupportsShouldProcess = true, Con...
method ProcessRecordAsync (line 73) | protected override async Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletClearSmtpConnectionPool.cs
class CmdletClearSmtpConnectionPool (line 17) | [Cmdlet(VerbsCommon.Clear, "SmtpConnectionPool", SupportsShouldProcess =...
method ProcessRecordAsync (line 20) | protected override Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletConnectEmailGraph.cs
class CmdletConnectEmailGraph (line 25) | [Cmdlet(VerbsCommunications.Connect, "EmailGraph")]
method ProcessRecordAsync (line 238) | protected override async Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletConnectIMAP.cs
class CmdletConnectIMAP (line 36) | [Cmdlet(VerbsCommunications.Connect, "IMAP")]
method ProcessRecordAsync (line 145) | protected override async Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletConnectOAuthGoogle.cs
class CmdletConnectOAuthGoogle (line 26) | [Cmdlet(VerbsCommunications.Connect, "OAuthGoogle", DefaultParameterSetN...
method ProcessRecordAsync (line 79) | protected override async Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletConnectOAuthO365.cs
class CmdletConnectOAuthO365 (line 20) | [Cmdlet(VerbsCommunications.Connect, "OAuthO365")]
method ProcessRecordAsync (line 64) | protected override async Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletConnectPOP3.cs
class CmdletConnectPOP3 (line 34) | [Cmdlet(VerbsCommunications.Connect, "POP3")]
method ProcessRecordAsync (line 151) | protected override async Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletConvertFromEmlToMsg.cs
class CmdletConvertFromEmlToMsg (line 19) | [Cmdlet(VerbsData.ConvertFrom, "EmlToMsg")]
method BeginProcessingAsync (line 48) | protected override Task BeginProcessingAsync() {
method ProcessRecordAsync (line 58) | protected override Task ProcessRecordAsync() {
method EndProcessingAsync (line 73) | protected override Task EndProcessingAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletConvertFromMsgToEml.cs
class CmdletConvertFromMsgToEml (line 15) | [Cmdlet(VerbsData.ConvertFrom, "MsgToEml")]
method BeginProcessingAsync (line 43) | protected override Task BeginProcessingAsync() {
method ProcessRecordAsync (line 53) | protected override Task ProcessRecordAsync() {
method EndProcessingAsync (line 68) | protected override Task EndProcessingAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletConvertFromOAuth2Credential.cs
class CmdletConvertFromOAuth2Credential (line 13) | [Cmdlet(VerbsData.ConvertFrom, "OAuth2Credential")]
method ProcessRecord (line 25) | protected override void ProcessRecord() {
FILE: Sources/Mailozaurr.PowerShell/CmdletConvertToGraphCertificateCredential.cs
class CmdletConvertToGraphCertificateCredential (line 24) | [Cmdlet(VerbsData.ConvertTo, "GraphCertificateCredential", DefaultParame...
method ProcessRecordAsync (line 84) | protected override async Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletConvertToGraphCredential.cs
class CmdletConvertToGraphCredential (line 24) | [Cmdlet(VerbsData.ConvertTo, "GraphCredential", DefaultParameterSetName ...
method ProcessRecord (line 84) | protected override void ProcessRecord() {
FILE: Sources/Mailozaurr.PowerShell/CmdletConvertToMailgunCredential.cs
class CmdletConvertToMailgunCredential (line 20) | [Cmdlet(VerbsData.ConvertTo, "MailgunCredential", DefaultParameterSetNam...
method ProcessRecord (line 53) | protected override void ProcessRecord() {
FILE: Sources/Mailozaurr.PowerShell/CmdletConvertToOAuth2Credential.cs
class CmdletConvertToOAuth2Credential (line 24) | [Cmdlet(VerbsData.ConvertTo, "OAuth2Credential", DefaultParameterSetName...
method ProcessRecord (line 63) | protected override void ProcessRecord() {
FILE: Sources/Mailozaurr.PowerShell/CmdletConvertToSendGridCredential.cs
class CmdletConvertToSendGridCredential (line 24) | [Cmdlet(VerbsData.ConvertTo, "SendGridCredential", DefaultParameterSetNa...
method ProcessRecord (line 57) | protected override void ProcessRecord() {
FILE: Sources/Mailozaurr.PowerShell/CmdletDisconnectEmailGraph.cs
class CmdletDisconnectEmailGraph (line 22) | [Cmdlet(VerbsCommunications.Disconnect, "EmailGraph")]
method ProcessRecordAsync (line 32) | protected override Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletDisconnectIMAP.cs
class CmdletDisconnectIMAP (line 18) | [Cmdlet(VerbsCommunications.Disconnect, "IMAP")]
method ProcessRecordAsync (line 30) | protected override Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletDisconnectPOP3.cs
class CmdletDisconnectPOP3 (line 20) | [Cmdlet(VerbsCommunications.Disconnect, "POP3")]
method ProcessRecordAsync (line 32) | protected override Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletGetDmarcReport.cs
class CmdletGetDmarcReport (line 12) | [Cmdlet(VerbsCommon.Get, "DmarcReport")]
method ProcessRecordAsync (line 79) | protected override async Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletGetEmailDeliveryMatch.cs
class CmdletGetEmailDeliveryMatch (line 13) | [Cmdlet(VerbsCommon.Get, "EmailDeliveryMatch")]
method ProcessRecordAsync (line 74) | protected override async Task ProcessRecordAsync()
FILE: Sources/Mailozaurr.PowerShell/CmdletGetEmailDeliveryStatus.cs
class CmdletGetEmailDeliveryStatus (line 13) | [Cmdlet(VerbsCommon.Get, "EmailDeliveryStatus")]
method ProcessRecordAsync (line 87) | protected override async Task ProcessRecordAsync()
FILE: Sources/Mailozaurr.PowerShell/CmdletGetEmailGraphFolder.cs
class CmdletGetEmailGraphFolder (line 26) | [Cmdlet(VerbsCommon.Get, "EmailGraphFolder")]
method ProcessRecordAsync (line 77) | protected override Task ProcessRecordAsync() {
method ProcessGraphAsync (line 91) | private async Task ProcessGraphAsync(GraphCredential cred) {
method ProcessMgGraph (line 125) | private Task ProcessMgGraph() {
FILE: Sources/Mailozaurr.PowerShell/CmdletGetEmailGraphMessage.cs
class CmdletGetEmailGraphMessage (line 15) | [Cmdlet(VerbsCommon.Get, "EmailGraphMessage", SupportsShouldProcess = tr...
method ProcessRecordAsync (line 143) | protected override Task ProcessRecordAsync() {
method ProcessGraphAsync (line 162) | private async Task ProcessGraphAsync(GraphCredential cred, string user...
method ProcessMgGraph (line 214) | private Task ProcessMgGraph(string userPrincipalName) {
method BuildFilter (line 239) | private string BuildFilter(string? rawFilter) {
FILE: Sources/Mailozaurr.PowerShell/CmdletGetEmailGraphMessageAttachment.cs
class CmdletGetEmailGraphMessageAttachment (line 23) | [Cmdlet(VerbsCommon.Get, "EmailGraphMessageAttachment")]
method ProcessRecordAsync (line 85) | protected override async Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletGetEmailGraphMessageMime.cs
class CmdletGetEmailGraphMessageMime (line 9) | [Cmdlet(VerbsCommon.Get, "EmailGraphMessageMime")]
method ProcessRecordAsync (line 29) | protected override async Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletGetEmailPendingMessage.cs
class CmdletGetEmailPendingMessage (line 9) | [Cmdlet(VerbsCommon.Get, "EmailPendingMessage")]
method ProcessRecordAsync (line 18) | protected override async Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletGetGmailMessage.cs
class CmdletGetGmailMessage (line 10) | [Cmdlet(VerbsCommon.Get, "GmailMessage")]
method ProcessRecordAsync (line 48) | protected override async Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletGetGmailThread.cs
class CmdletGetGmailThread (line 10) | [Cmdlet(VerbsCommon.Get, "GmailThread")]
method ProcessRecordAsync (line 49) | protected override async Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletGetGraphEvent.cs
class CmdletGetGraphEvent (line 11) | [Cmdlet(VerbsCommon.Get, "GraphEvent")]
method ProcessRecordAsync (line 67) | protected override Task ProcessRecordAsync() {
method ProcessGraphAsync (line 76) | private async Task ProcessGraphAsync(GraphCredential cred) {
FILE: Sources/Mailozaurr.PowerShell/CmdletGetGraphInboxRule.cs
class CmdletGetGraphInboxRule (line 13) | [Cmdlet(VerbsCommon.Get, "GraphInboxRule")]
method ProcessRecordAsync (line 65) | protected override Task ProcessRecordAsync() {
method ProcessGraphAsync (line 79) | private async Task ProcessGraphAsync(GraphCredential cred) {
method ProcessMgGraph (line 108) | private Task ProcessMgGraph() {
FILE: Sources/Mailozaurr.PowerShell/CmdletGetGraphMailboxPermission.cs
class CmdletGetGraphMailboxPermission (line 11) | [Cmdlet(VerbsCommon.Get, "GraphMailboxPermission")]
method ProcessRecordAsync (line 47) | protected override Task ProcessRecordAsync() {
method ProcessGraphAsync (line 62) | private async Task ProcessGraphAsync(GraphCredential cred) {
method ProcessMgGraph (line 89) | private void ProcessMgGraph() {
FILE: Sources/Mailozaurr.PowerShell/CmdletGetGraphMailboxStatistics.cs
class CmdletGetGraphMailboxStatistics (line 12) | [Cmdlet(VerbsCommon.Get, "GraphMailboxStatistics")]
method ProcessRecordAsync (line 51) | protected override Task ProcessRecordAsync() {
method ProcessGraphAsync (line 61) | private async Task ProcessGraphAsync(GraphCredential cred) {
FILE: Sources/Mailozaurr.PowerShell/CmdletGetIMAPFolder.cs
class CmdletGetIMAPFolder (line 22) | [Cmdlet(VerbsCommon.Get, "IMAPFolder")]
method ProcessRecordAsync (line 54) | protected override async Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletGetIMAPMessage.cs
class CmdletGetIMAPMessage (line 28) | [Cmdlet(
method ProcessRecordAsync (line 138) | protected override async Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletGetMimeMessageContent.cs
class CmdletGetMimeMessageContent (line 9) | [Cmdlet(VerbsCommon.Get, "MimeMessageContent")]
method ProcessRecord (line 18) | protected override void ProcessRecord() {
FILE: Sources/Mailozaurr.PowerShell/CmdletGetPOP3Message.cs
class CmdletGetPOP3Message (line 24) | [Cmdlet(VerbsCommon.Get, "POP3Message", SupportsShouldProcess = true, Co...
method ProcessRecordAsync (line 103) | protected override async Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletGetSmtpConnectionPool.cs
class CmdletGetSmtpConnectionPool (line 14) | [Cmdlet(VerbsCommon.Get, "SmtpConnectionPool")]
method ProcessRecordAsync (line 26) | protected override async Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletImportMailFile.cs
class CmdletImportMailFile (line 23) | [Cmdlet(VerbsData.Import, "MailFile")]
method ProcessRecordAsync (line 37) | protected override Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletMoveGraphFolder.cs
class CmdletMoveGraphFolder (line 12) | [Cmdlet(VerbsCommon.Move, "GraphFolder", SupportsShouldProcess = true, C...
method ProcessRecordAsync (line 66) | protected override Task ProcessRecordAsync() {
method ProcessGraphAsync (line 84) | private async Task ProcessGraphAsync(GraphCredential cred) {
method ProcessMgGraph (line 121) | private void ProcessMgGraph() {
FILE: Sources/Mailozaurr.PowerShell/CmdletMoveGraphMessage.cs
class CmdletMoveGraphMessage (line 12) | [Cmdlet(VerbsCommon.Move, "GraphMessage", SupportsShouldProcess = true, ...
method ProcessRecordAsync (line 77) | protected override Task ProcessRecordAsync() {
method ProcessGraphAsync (line 98) | private async Task ProcessGraphAsync(GraphCredential cred) {
method ProcessMgGraph (line 137) | private void ProcessMgGraph() {
FILE: Sources/Mailozaurr.PowerShell/CmdletMoveIMAPFolder.cs
class CmdletMoveIMAPFolder (line 11) | [Cmdlet(VerbsCommon.Move, "IMAPFolder", SupportsShouldProcess = true, Co...
method ProcessRecordAsync (line 38) | protected override async Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletMoveIMAPMessage.cs
class CmdletMoveIMAPMessage (line 22) | [Cmdlet(VerbsCommon.Move, "IMAPMessage", SupportsShouldProcess = true, C...
method ProcessRecordAsync (line 53) | protected override Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletNewGraphEvent.cs
class CmdletNewGraphEvent (line 10) | [Cmdlet(VerbsCommon.New, "GraphEvent", SupportsShouldProcess = true, Con...
method ProcessRecordAsync (line 63) | protected override Task ProcessRecordAsync() {
method ProcessGraphAsync (line 72) | private async Task ProcessGraphAsync(GraphCredential cred) {
FILE: Sources/Mailozaurr.PowerShell/CmdletNewGraphEventBuilder.cs
class CmdletNewGraphEventBuilder (line 10) | [Cmdlet(VerbsCommon.New, "GraphEventBuilder")]
method ProcessRecord (line 65) | protected override void ProcessRecord()
FILE: Sources/Mailozaurr.PowerShell/CmdletNewGraphInboxRule.cs
class CmdletNewGraphInboxRule (line 16) | [Cmdlet(VerbsCommon.New, "GraphInboxRule", SupportsShouldProcess = true,...
method ProcessRecordAsync (line 160) | protected override Task ProcessRecordAsync() {
method ProcessGraphAsync (line 175) | private async Task ProcessGraphAsync(GraphCredential cred) {
method ProcessMgGraph (line 221) | private void ProcessMgGraph() {
method BuildFromParams (line 248) | private GraphInboxRule BuildFromParams() {
FILE: Sources/Mailozaurr.PowerShell/CmdletNewGraphInboxRuleBuilder.cs
class CmdletNewGraphInboxRuleBuilder (line 10) | [Cmdlet(VerbsCommon.New, "GraphInboxRuleBuilder")]
method ProcessRecord (line 95) | protected override void ProcessRecord()
FILE: Sources/Mailozaurr.PowerShell/CmdletNewGraphInboxRuleObject.cs
class CmdletNewGraphInboxRuleObject (line 11) | [Cmdlet(VerbsCommon.New, "GraphInboxRuleObject")]
method ProcessRecord (line 102) | protected override void ProcessRecord()
FILE: Sources/Mailozaurr.PowerShell/CmdletNewGraphMailboxPermissionBuilder.cs
class CmdletNewGraphMailboxPermissionBuilder (line 9) | [Cmdlet(VerbsCommon.New, "GraphMailboxPermissionBuilder")]
method ProcessRecord (line 39) | protected override void ProcessRecord() {
FILE: Sources/Mailozaurr.PowerShell/CmdletNewGraphMailboxPermissionObject.cs
class CmdletNewGraphMailboxPermissionObject (line 9) | [Cmdlet(VerbsCommon.New, "GraphMailboxPermissionObject")]
method ProcessRecord (line 45) | protected override void ProcessRecord() {
FILE: Sources/Mailozaurr.PowerShell/CmdletNewTemporaryMailCrypto.cs
class CmdletNewTemporaryMailCrypto (line 9) | [Cmdlet(VerbsCommon.New, "TemporaryMailCrypto")]
method ProcessRecord (line 53) | protected override void ProcessRecord()
FILE: Sources/Mailozaurr.PowerShell/CmdletRemoveEmailPendingMessage.cs
class CmdletRemoveEmailPendingMessage (line 9) | [Cmdlet(VerbsCommon.Remove, "EmailPendingMessage", SupportsShouldProcess...
method ProcessRecordAsync (line 21) | protected override async Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletRemoveGmailMessage.cs
class CmdletRemoveGmailMessage (line 9) | [Cmdlet(VerbsCommon.Remove, "GmailMessage", SupportsShouldProcess = true...
method ProcessRecordAsync (line 34) | protected override async Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletRemoveGraphEvent.cs
class CmdletRemoveGraphEvent (line 10) | [Cmdlet(VerbsCommon.Remove, "GraphEvent", SupportsShouldProcess = true, ...
method ProcessRecordAsync (line 53) | protected override Task ProcessRecordAsync() {
method ProcessGraphAsync (line 62) | private async Task ProcessGraphAsync(GraphCredential cred) {
FILE: Sources/Mailozaurr.PowerShell/CmdletRemoveGraphFolder.cs
class CmdletRemoveGraphFolder (line 11) | [Cmdlet(VerbsCommon.Remove, "GraphFolder", SupportsShouldProcess = true,...
method ProcessRecordAsync (line 58) | protected override Task ProcessRecordAsync() {
method ProcessGraphAsync (line 75) | private async Task ProcessGraphAsync(GraphCredential cred) {
method ProcessMgGraph (line 111) | private void ProcessMgGraph() {
FILE: Sources/Mailozaurr.PowerShell/CmdletRemoveGraphInboxRule.cs
class CmdletRemoveGraphInboxRule (line 12) | [Cmdlet(VerbsCommon.Remove, "GraphInboxRule", SupportsShouldProcess = tr...
method ProcessRecordAsync (line 62) | protected override Task ProcessRecordAsync() {
method ProcessGraphAsync (line 79) | private async Task ProcessGraphAsync(GraphCredential cred) {
method ProcessMgGraph (line 112) | private void ProcessMgGraph() {
FILE: Sources/Mailozaurr.PowerShell/CmdletRemoveGraphMailboxPermission.cs
class CmdletRemoveGraphMailboxPermission (line 13) | [Cmdlet(VerbsCommon.Remove, "GraphMailboxPermission", SupportsShouldProc...
method ProcessRecordAsync (line 92) | protected override async Task ProcessRecordAsync() {
method ProcessCsvAsync (line 132) | private async Task ProcessCsvAsync(GraphCredential cred) {
method ProcessFilterAsync (line 143) | private async Task ProcessFilterAsync(GraphCredential cred) {
method ProcessGraphAsync (line 154) | private async Task ProcessGraphAsync(GraphCredential cred, object perm...
method ProcessMgGraph (line 191) | private void ProcessMgGraph() {
method InvokeMgGraph (line 216) | private void InvokeMgGraph(string id) {
FILE: Sources/Mailozaurr.PowerShell/CmdletRemoveGraphMessage.cs
class CmdletRemoveGraphMessage (line 11) | [Cmdlet(VerbsCommon.Remove, "GraphMessage", SupportsShouldProcess = true...
method ProcessRecordAsync (line 57) | protected override Task ProcessRecordAsync() {
method ProcessGraphAsync (line 74) | private async Task ProcessGraphAsync(GraphCredential cred) {
method ProcessMgGraph (line 110) | private void ProcessMgGraph() {
FILE: Sources/Mailozaurr.PowerShell/CmdletRemoveGraphMessageAttachment.cs
class CmdletRemoveGraphMessageAttachment (line 8) | [Cmdlet(VerbsCommon.Remove, "GraphMessageAttachment", SupportsShouldProc...
method ProcessRecord (line 19) | protected override void ProcessRecord() {
FILE: Sources/Mailozaurr.PowerShell/CmdletRemoveIMAPFolder.cs
class CmdletRemoveIMAPFolder (line 11) | [Cmdlet(VerbsCommon.Remove, "IMAPFolder", SupportsShouldProcess = true, ...
method ProcessRecordAsync (line 30) | protected override async Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletRemoveIMAPMessage.cs
class CmdletRemoveIMAPMessage (line 13) | [Cmdlet(VerbsCommon.Remove, "IMAPMessage", SupportsShouldProcess = true,...
method ProcessRecordAsync (line 29) | protected override async Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletRemoveIMAPMessageAttachment.cs
class CmdletRemoveIMAPMessageAttachment (line 9) | [Cmdlet(VerbsCommon.Remove, "IMAPMessageAttachment", SupportsShouldProce...
method ProcessRecord (line 20) | protected override void ProcessRecord() {
method RemoveMimeAttachments (line 32) | private static void RemoveMimeAttachments(MimeEntity? entity) {
FILE: Sources/Mailozaurr.PowerShell/CmdletRemovePOP3Message.cs
class CmdletRemovePOP3Message (line 11) | [Cmdlet(VerbsCommon.Remove, "POP3Message", SupportsShouldProcess = true,...
method ProcessRecordAsync (line 23) | protected override async Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletRemovePOP3MessageAttachment.cs
class CmdletRemovePOP3MessageAttachment (line 9) | [Cmdlet(VerbsCommon.Remove, "POP3MessageAttachment", SupportsShouldProce...
method ProcessRecord (line 20) | protected override void ProcessRecord() {
method RemoveMimeAttachments (line 32) | private static void RemoveMimeAttachments(MimeEntity? entity) {
FILE: Sources/Mailozaurr.PowerShell/CmdletRenameGraphFolder.cs
class CmdletRenameGraphFolder (line 12) | [Cmdlet("Rename", "GraphFolder", SupportsShouldProcess = true, ConfirmIm...
method ProcessRecordAsync (line 60) | protected override Task ProcessRecordAsync() {
method ProcessGraphAsync (line 77) | private async Task ProcessGraphAsync(GraphCredential cred) {
method ProcessMgGraph (line 113) | private void ProcessMgGraph() {
FILE: Sources/Mailozaurr.PowerShell/CmdletRenameIMAPFolder.cs
class CmdletRenameIMAPFolder (line 11) | [Cmdlet("Rename", "IMAPFolder", SupportsShouldProcess = true, ConfirmImp...
method ProcessRecordAsync (line 32) | protected override async Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletSaveGmailMessageAttachment.cs
class CmdletSaveGmailMessageAttachment (line 10) | [Cmdlet(VerbsData.Save, "GmailMessageAttachment")]
method ProcessRecordAsync (line 42) | protected override async Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletSaveGraphMessage.cs
class CmdletSaveGraphMessage (line 18) | [Cmdlet(VerbsData.Save, "GraphMessage")]
method ProcessRecord (line 36) | protected override void ProcessRecord() {
FILE: Sources/Mailozaurr.PowerShell/CmdletSaveGraphMessageAttachment.cs
class CmdletSaveGraphMessageAttachment (line 9) | [Cmdlet(VerbsData.Save, "GraphMessageAttachment")]
method ProcessRecord (line 28) | protected override void ProcessRecord() {
FILE: Sources/Mailozaurr.PowerShell/CmdletSaveIMAPMessage.cs
class CmdletSaveIMAPMessage (line 25) | [Cmdlet(VerbsData.Save, "IMAPMessage")]
method ProcessRecordAsync (line 57) | protected override Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletSaveIMAPMessageAttachment.cs
class CmdletSaveIMAPMessageAttachment (line 13) | [Cmdlet(VerbsData.Save, "IMAPMessageAttachment")]
method ProcessRecordAsync (line 44) | protected override Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletSaveMimeMessage.cs
class CmdletSaveMimeMessage (line 9) | [Cmdlet(VerbsData.Save, "MimeMessage")]
method ProcessRecord (line 21) | protected override void ProcessRecord() {
FILE: Sources/Mailozaurr.PowerShell/CmdletSavePOP3Message.cs
class CmdletSavePOP3Message (line 23) | [Cmdlet(VerbsData.Save, "POP3Message")]
method ProcessRecordAsync (line 49) | protected override Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletSavePOP3MessageAttachment.cs
class CmdletSavePOP3MessageAttachment (line 11) | [Cmdlet(VerbsData.Save, "POP3MessageAttachment")]
method ProcessRecordAsync (line 36) | protected override Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletSearchGraphMailbox.cs
class CmdletSearchGraphMailbox (line 11) | [Cmdlet(VerbsCommon.Search, "GraphMailbox")]
method ProcessRecordAsync (line 58) | protected override async Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletSearchIMAPMailbox.cs
class CmdletSearchIMAPMailbox (line 12) | [Cmdlet(VerbsCommon.Search, "IMAPMailbox")]
method ProcessRecordAsync (line 99) | protected override async Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletSearchPOP3Mailbox.cs
class CmdletSearchPOP3Mailbox (line 11) | [Cmdlet(VerbsCommon.Search, "POP3Mailbox")]
method ProcessRecordAsync (line 86) | protected override async Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletSendEmailMessage.Parameters.cs
class CmdletSendEmailMessage (line 9) | public sealed partial class CmdletSendEmailMessage : PSCmdlet
FILE: Sources/Mailozaurr.PowerShell/CmdletSendEmailMessage.Process.cs
class CmdletSendEmailMessage (line 12) | public sealed partial class CmdletSendEmailMessage : PSCmdlet
method BeginProcessing (line 26) | protected override void BeginProcessing() {
method ProcessRecord (line 62) | protected override void ProcessRecord() {
method ProcessSendGrid (line 92) | private void ProcessSendGrid(string fromEmail, string fromName) {
method ProcessMailgun (line 132) | private void ProcessMailgun(string fromEmail, string fromName) {
method ProcessSes (line 171) | private void ProcessSes(string fromEmail, string fromName) {
method ProcessGmail (line 214) | private void ProcessGmail(string fromEmail, string fromName) {
method ProcessGraph (line 260) | private void ProcessGraph(string fromEmail, string fromName) {
method ProcessMgGraphRequest (line 364) | private async Task ProcessMgGraphRequest(string fromEmail, string from...
method ProcessSmtp (line 431) | private void ProcessSmtp(string fromEmail, string fromName) {
method InvokeMgGraphRequest (line 588) | private void InvokeMgGraphRequest(string uri, EmailAction action, stri...
method InvokeMgGraphRequestPUT (line 619) | private async Task InvokeMgGraphRequestPUT(string uri, EmailAction act...
method InvokeMgGraphRequestPOST (line 656) | private string InvokeMgGraphRequestPOST(string uri, EmailAction action...
method InvokeMgGraphRequestPOST1 (line 702) | private string InvokeMgGraphRequestPOST1(string uri, EmailAction actio...
method ConvertToAttachmentDescriptors (line 747) | private static List<AttachmentDescriptor>? ConvertToAttachmentDescript...
method FilterExistingPaths (line 764) | private object[]? FilterExistingPaths(object[]? paths, string paramete...
method EndProcessing (line 811) | protected override void EndProcessing()
FILE: Sources/Mailozaurr.PowerShell/CmdletSendEmailMessage.cs
class CmdletSendEmailMessage (line 37) | [Cmdlet(VerbsCommunications.Send, "EmailMessage", DefaultParameterSetNam...
FILE: Sources/Mailozaurr.PowerShell/CmdletSendEmailPendingMessage.cs
class CmdletSendEmailPendingMessage (line 14) | [Cmdlet(VerbsCommunications.Send, "EmailPendingMessage", SupportsShouldP...
method ProcessRecordAsync (line 45) | protected override async Task ProcessRecordAsync() {
method NormalizeMessageIds (line 87) | private static IReadOnlyCollection<string>? NormalizeMessageIds(string...
class CmdletPendingMessageObserver (line 101) | private sealed class CmdletPendingMessageObserver : IPendingMessagePro...
method CmdletPendingMessageObserver (line 104) | internal CmdletPendingMessageObserver(CmdletSendEmailPendingMessage ...
method MessageSkipped (line 108) | public void MessageSkipped(PendingMessageRecord record, PendingMessa...
method MessageAttemptStarted (line 116) | public void MessageAttemptStarted(PendingMessageRecord record, int a...
method MessageSent (line 120) | public void MessageSent(PendingMessageRecord record, int attempt, Ti...
method MessageFailed (line 124) | public void MessageFailed(
method MessageDropped (line 139) | public void MessageDropped(
class FilteredPendingMessageRepository (line 152) | private sealed class FilteredPendingMessageRepository : IPendingMessag...
method FilteredPendingMessageRepository (line 159) | internal FilteredPendingMessageRepository(
method SaveAsync (line 174) | public Task SaveAsync(PendingMessageRecord record, CancellationToken...
method TryAcquireLeaseAsync (line 177) | public async Task<PendingMessageRecord?> TryAcquireLeaseAsync(
method GetByMessageIdAsync (line 199) | public Task<PendingMessageRecord?> GetByMessageIdAsync(string messag...
method GetAllAsync (line 202) | public async IAsyncEnumerable<PendingMessageRecord> GetAllAsync(
method RemoveAsync (line 230) | public Task RemoveAsync(string messageId, CancellationToken cancella...
method ContainsMessageId (line 233) | private bool ContainsMessageId(string? id) {
FILE: Sources/Mailozaurr.PowerShell/CmdletSendGmailMessage.cs
class CmdletSendGmailMessage (line 15) | [Cmdlet(VerbsCommunications.Send, "GmailMessage", SupportsShouldProcess ...
method ProcessRecordAsync (line 76) | protected override async Task ProcessRecordAsync() {
method ConvertAttachments (line 109) | private static List<AttachmentDescriptor>? ConvertAttachments(object[]...
FILE: Sources/Mailozaurr.PowerShell/CmdletSetGraphEvent.cs
class CmdletSetGraphEvent (line 10) | [Cmdlet(VerbsCommon.Set, "GraphEvent", SupportsShouldProcess = true)]
method ProcessRecordAsync (line 61) | protected override Task ProcessRecordAsync() {
method ProcessGraphAsync (line 70) | private async Task ProcessGraphAsync(GraphCredential cred) {
FILE: Sources/Mailozaurr.PowerShell/CmdletSetGraphInboxRule.cs
class CmdletSetGraphInboxRule (line 16) | [Cmdlet(VerbsCommon.Set, "GraphInboxRule", SupportsShouldProcess = true)]
method ProcessRecordAsync (line 80) | protected override Task ProcessRecordAsync()
method ProcessGraphAsync (line 98) | private async Task ProcessGraphAsync(GraphCredential cred)
method ProcessMgGraph (line 147) | private void ProcessMgGraph()
FILE: Sources/Mailozaurr.PowerShell/CmdletSetGraphMessage.cs
class CmdletSetGraphMessage (line 12) | [Cmdlet(VerbsCommon.Set, "GraphMessage", SupportsShouldProcess = true, C...
method ProcessRecordAsync (line 76) | protected override Task ProcessRecordAsync() {
method ProcessGraphAsync (line 97) | private async Task ProcessGraphAsync(GraphCredential cred) {
method ProcessMgGraph (line 136) | private void ProcessMgGraph() {
FILE: Sources/Mailozaurr.PowerShell/CmdletSetIMAPFolder.cs
class CmdletSetIMAPFolder (line 11) | [Cmdlet(VerbsCommon.Set, "IMAPFolder", SupportsShouldProcess = true, Con...
method ProcessRecordAsync (line 29) | protected override Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletSetIMAPMessage.cs
class CmdletSetIMAPMessage (line 11) | [Cmdlet(VerbsCommon.Set, "IMAPMessage", SupportsShouldProcess = true, Co...
method ProcessRecordAsync (line 37) | protected override async Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletSetPOP3Message.cs
class CmdletSetPOP3Message (line 10) | [Cmdlet(VerbsCommon.Set, "POP3Message", SupportsShouldProcess = true, Co...
method ProcessRecordAsync (line 32) | protected override Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletTestEmailAddress.cs
class CmdletTestEmailAddress (line 27) | [Cmdlet(VerbsDiagnostic.Test, "EmailAddress")]
method BeginProcessingAsync (line 55) | protected override Task BeginProcessingAsync() {
method ProcessRecordAsync (line 65) | protected override Task ProcessRecordAsync() {
method EndProcessingAsync (line 82) | protected override Task EndProcessingAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletTestMimeMessageSignature.cs
class CmdletTestMimeMessageSignature (line 10) | [Cmdlet(VerbsDiagnostic.Test, "MimeMessageSignature", DefaultParameterSe...
method ProcessRecord (line 27) | protected override void ProcessRecord() {
FILE: Sources/Mailozaurr.PowerShell/CmdletTestSmtpConnection.cs
class CmdletTestSmtpConnection (line 19) | [Cmdlet(VerbsDiagnostic.Test, "SmtpConnection")]
method ProcessRecordAsync (line 43) | protected override Task ProcessRecordAsync() {
FILE: Sources/Mailozaurr.PowerShell/CmdletUnprotectMimeMessage.cs
class CmdletUnprotectMimeMessage (line 10) | [Cmdlet(VerbsSecurity.Unprotect, "MimeMessage")]
method ProcessRecord (line 31) | protected override void ProcessRecord() {
FILE: Sources/Mailozaurr.PowerShell/CmdletWaitGraphMessage.cs
class CmdletWaitGraphMessage (line 17) | [Cmdlet(VerbsLifecycle.Wait, "GraphMessage")]
method ProcessRecordAsync (line 66) | protected override async Task ProcessRecordAsync() {
method OnMessageArrived (line 89) | private void OnMessageArrived(object? sender, System.Collections.Gener...
method EndProcessingAsync (line 107) | protected override Task EndProcessingAsync() {
method Dispose (line 118) | public new void Dispose() {
method StopProcessing (line 128) | protected override void StopProcessing() {
FILE: Sources/Mailozaurr.PowerShell/CmdletWaitIMAPMessage.cs
class CmdletWaitIMAPMessage (line 23) | [Cmdlet(VerbsLifecycle.Wait, "IMAPMessage")]
method ProcessRecordAsync (line 77) | protected override async Task ProcessRecordAsync() {
method OnMessageArrived (line 112) | private void OnMessageArrived(object? sender, ImapEmailMessage message) {
method EndProcessingAsync (line 130) | protected override Task EndProcessingAsync() {
method Dispose (line 141) | public new void Dispose() {
method StopProcessing (line 151) | protected override void StopProcessing() {
FILE: Sources/Mailozaurr.PowerShell/CmdletWaitPOP3Message.cs
class CmdletWaitPOP3Message (line 11) | [Cmdlet(VerbsLifecycle.Wait, "POP3Message")]
method ProcessRecordAsync (line 53) | protected override async Task ProcessRecordAsync() {
method OnMessageArrived (line 80) | private void OnMessageArrived(object? sender, Pop3EmailMessage message) {
method EndProcessingAsync (line 98) | protected override Task EndProcessingAsync() {
method Dispose (line 109) | public new void Dispose() {
method StopProcessing (line 119) | protected override void StopProcessing() {
FILE: Sources/Mailozaurr.PowerShell/CmdletWatchSmtpConnectionPool.cs
class CmdletWatchSmtpConnectionPool (line 17) | [Cmdlet("Watch", "SmtpConnectionPool")]
method ProcessRecord (line 26) | protected override void ProcessRecord()
FILE: Sources/Mailozaurr.PowerShell/Communication/AsyncPSCmdlet.cs
class AsyncPSCmdlet (line 12) | public abstract class AsyncPSCmdlet : PSCmdlet, IDisposable {
type PipelineType (line 16) | private enum PipelineType {
method BeginProcessing (line 44) | protected override void BeginProcessing()
method BeginProcessingAsync (line 51) | protected virtual Task BeginProcessingAsync()
method ProcessRecord (line 57) | protected override void ProcessRecord()
method ProcessRecordAsync (line 64) | protected virtual Task ProcessRecordAsync()
method EndProcessing (line 70) | protected override void EndProcessing()
method EndProcessingAsync (line 77) | protected virtual Task EndProcessingAsync()
method StopProcessing (line 83) | protected override void StopProcessing()
method RunBlockInAsync (line 90) | private void RunBlockInAsync(Func<Task> task) {
method ShouldProcess (line 157) | public new bool ShouldProcess(string target, string action) {
method WriteObject (line 167) | public new void WriteObject(object? sendToPipeline) => WriteObject(sen...
method WriteObject (line 174) | public new void WriteObject(object? sendToPipeline, bool enumerateColl...
method WriteError (line 184) | public new void WriteError(ErrorRecord errorRecord) {
method WriteWarning (line 193) | public new void WriteWarning(string message) {
method WriteVerbose (line 202) | public new void WriteVerbose(string message) {
method WriteDebug (line 211) | public new void WriteDebug(string message) {
method WriteInformation (line 220) | public new void WriteInformation(InformationRecord informationRecord) {
method WriteProgress (line 229) | public new void WriteProgress(ProgressRecord progressRecord) {
method ThrowIfStopped (line 237) | internal void ThrowIfStopped() {
method Dispose (line 246) | public void Dispose() {
FILE: Sources/Mailozaurr.PowerShell/Communication/InternalLoggerPowerShell.cs
class InternalLoggerPowerShell (line 9) | public class InternalLoggerPowerShell : IDisposable {
method InternalLoggerPowerShell (line 28) | public InternalLoggerPowerShell(InternalLogger logger, Action<string>?...
method Logger_OnVerboseMessage (line 67) | private void Logger_OnVerboseMessage(object? sender, LogEventArgs e) {
method Logger_OnDebugMessage (line 75) | private void Logger_OnDebugMessage(object? sender, LogEventArgs e) {
method Logger_OnWarningMessage (line 79) | private void Logger_OnWarningMessage(object? sender, LogEventArgs e) {
method Logger_OnErrorMessage (line 83) | private void Logger_OnErrorMessage(object? sender, LogEventArgs e) {
method GetNextActivityId (line 92) | private int GetNextActivityId() {
method Logger_OnProgressMessage (line 96) | private void Logger_OnProgressMessage(object? sender, LogEventArgs e) {
method Logger_OnInformationMessage (line 119) | private void Logger_OnInformationMessage(object? sender, LogEventArgs ...
method WriteVerbose (line 123) | private void WriteVerbose(string message) {
method WriteVerbose (line 132) | private void WriteVerbose(string message, object[] eArgs) {
method WriteDebug (line 137) | private void WriteDebug(string message) {
method WriteInformation (line 141) | private void WriteInformation(string message) {
method WriteWarning (line 146) | private void WriteWarning(string message) {
method WriteError (line 150) | private void WriteError(ErrorRecord errorRecord) {
method WriteProgress (line 154) | private void WriteProgress(ProgressRecord progressRecord) {
method Dispose (line 159) | public void Dispose() {
FILE: Sources/Mailozaurr.PowerShell/Communication/LogEmitter.cs
class LogEmitter (line 9) | public static class LogEmitter {
method EmitLogs (line 15) | public static void EmitLogs(LogCollector collector, PSCmdlet cmdlet) {
FILE: Sources/Mailozaurr.PowerShell/CredentialHelpers.cs
class CredentialHelpers (line 11) | public static class CredentialHelpers {
method ToSecureString (line 17) | public static SecureString ToSecureString(string? s) {
method ToPlainText (line 37) | public static string ToPlainText(SecureString? secureString) {
method ResolveSecretFromVault (line 51) | public static SecureString ResolveSecretFromVault(string secretName, s...
FILE: Sources/Mailozaurr.PowerShell/Definitions/ConnectionInfoBase.cs
class ConnectionInfoBase (line 6) | public class ConnectionInfoBase {
FILE: Sources/Mailozaurr.PowerShell/Definitions/DefaultSessions.cs
class DefaultSessions (line 11) | public static class DefaultSessions {
FILE: Sources/Mailozaurr.PowerShell/Definitions/EmailProtocol.cs
type EmailProtocol (line 6) | public enum EmailProtocol
FILE: Sources/Mailozaurr.PowerShell/Definitions/EmlConversionResult.cs
class EmlConversionResult (line 6) | public class EmlConversionResult {
FILE: Sources/Mailozaurr.PowerShell/Definitions/GraphConnectionInfo.cs
class GraphConnectionInfo (line 8) | public class GraphConnectionInfo : ConnectionInfoBase {
FILE: Sources/Mailozaurr.PowerShell/Definitions/ImapConnectionInfo.cs
class ImapConnectionInfo (line 12) | public class ImapConnectionInfo : ConnectionInfoBase {
FILE: Sources/Mailozaurr.PowerShell/Definitions/MsgConversionResult.cs
class MsgConversionResult (line 6) | public class MsgConversionResult {
FILE: Sources/Mailozaurr.PowerShell/Definitions/PopConnectionInfo.cs
class PopConnectionInfo (line 12) | public class PopConnectionInfo : ConnectionInfoBase {
FILE: Sources/Mailozaurr.PowerShell/OnImportAndRemove.cs
class OnModuleImportAndRemove (line 12) | public class OnModuleImportAndRemove : IModuleAssemblyInitializer, IModu...
method OnImport (line 16) | public void OnImport() {
method OnRemove (line 31) | public void OnRemove(PSModuleInfo module) {
method MyResolveEventHandler (line 48) | private static Assembly? MyResolveEventHandler(object? sender, Resolve...
class LoadContext (line 78) | private sealed class LoadContext : AssemblyLoadContext {
method LoadContext (line 81) | public LoadContext(string assemblyDir)
method Load (line 86) | protected override Assembly? Load(AssemblyName assemblyName) {
method ResolveAlc (line 97) | private static Assembly? ResolveAlc(AssemblyLoadContext defaultAlc, As...
method IsSatisfyingAssembly (line 106) | private static bool IsSatisfyingAssembly(AssemblyName requiredAssembly...
method IsNetFramework (line 122) | private bool IsNetFramework() {
method IsNetCore (line 127) | private bool IsNetCore() {
method IsNet5OrHigher (line 135) | private bool IsNet5OrHigher() {
FILE: Sources/Mailozaurr.Tests/AdditionalCoverageTests.cs
class AdditionalCoverageTests (line 12) | public class AdditionalCoverageTests
class FakeFolder (line 14) | private class FakeFolder : MessageFlagSetter.IImapFolder
method AddFlagsAsync (line 18) | public Task AddFlagsAsync(UniqueId uid, MessageFlags flags, bool sil...
method RemoveFlagsAsync (line 23) | public Task RemoveFlagsAsync(UniqueId uid, MessageFlags flags, bool ...
method MessageFlagSetter_AddOrRemoveFlags (line 30) | [Fact]
method MessageFlagSetter_Pop3ReadState (line 41) | [Fact]
method MimeKitUtils_SavesAttachments (line 49) | [Fact]
method EmailMessage_ConvertMissingFiles (line 66) | [Fact]
method LoggingMessages_PropertyDelegates (line 81) | [Fact]
method InternalLogger_WarningEventRaised (line 90) | [Fact]
FILE: Sources/Mailozaurr.Tests/ApplicationBuilderTests.cs
class ApplicationBuilderTests (line 6) | public sealed class ApplicationBuilderTests {
method BuildCreatesDefaultApplicationWithBuiltInReadAndSendHandlers (line 7) | [Fact]
method BuildHonorsDisabledImapHandlerOption (line 49) | [Fact]
method BuildUsesInjectedHandlersAndFactories (line 72) | [Fact]
method CreateTemporaryDirectory (line 99) | private static string CreateTemporaryDirectory() {
class FakeImapSessionFactory (line 105) | private sealed class FakeImapSessionFactory : IImapSessionFactory {
method ConnectAsync (line 106) | public Task<ImapClient> ConnectAsync(MailProfile profile, Cancellati...
class FakeGraphSessionFactory (line 110) | private sealed class FakeGraphSessionFactory : IGraphSessionFactory {
method ConnectAsync (line 111) | public Task<GraphSession> ConnectAsync(MailProfile profile, Cancella...
class FakeGmailSessionFactory (line 119) | private sealed class FakeGmailSessionFactory : IGmailSessionFactory {
method ConnectAsync (line 120) | public Task<GmailSession> ConnectAsync(MailProfile profile, Cancella...
class FakeSmtpSessionFactory (line 128) | private sealed class FakeSmtpSessionFactory : ISmtpSessionFactory {
method ConnectAsync (line 129) | public Task<Smtp> ConnectAsync(MailProfile profile, CancellationToke...
class FakeReadHandler (line 133) | private sealed class FakeReadHandler : IMailReadHandler {
method FakeReadHandler (line 134) | public FakeReadHandler(MailProfileKind kind) {
method GetFoldersAsync (line 140) | public Task<IReadOnlyList<FolderRef>> GetFoldersAsync(MailProfile pr...
method GetMessageAsync (line 143) | public Task<MessageDetail?> GetMessageAsync(MailProfile profile, Get...
method SaveAttachmentAsync (line 146) | public Task<OperationResult> SaveAttachmentAsync(MailProfile profile...
method SearchAsync (line 149) | public Task<IReadOnlyList<MessageSummary>> SearchAsync(MailProfile p...
class FakeSendHandler (line 153) | private sealed class FakeSendHandler : IMailSendHandler {
method FakeSendHandler (line 154) | public FakeSendHandler(MailProfileKind kind) {
method SendAsync (line 160) | public Task<SendResult> SendAsync(MailProfile profile, SendMessageRe...
class FakeMessageActionHandler (line 164) | private sealed class FakeMessageActionHandler : IMailMessageActionHand...
method FakeMessageActionHandler (line 165) | public FakeMessageActionHandler(MailProfileKind kind) {
method SetReadStateAsync (line 171) | public Task<MessageActionResult> SetReadStateAsync(MailProfile profi...
method SetFlaggedStateAsync (line 174) | public Task<MessageActionResult> SetFlaggedStateAsync(MailProfile pr...
method MoveAsync (line 177) | public Task<MessageActionResult> MoveAsync(MailProfile profile, Move...
method DeleteAsync (line 180) | public Task<MessageActionResult> DeleteAsync(MailProfile profile, De...
FILE: Sources/Mailozaurr.Tests/ApplicationCapabilitiesTests.cs
class ApplicationCapabilitiesTests (line 5) | public sealed class ApplicationCapabilitiesTests {
method CatalogExposesExpectedCapabilities (line 6) | [Theory]
method ProfileFallsBackToDefaultCapabilitiesWhenOverrideIsMissing (line 20) | [Fact]
method OperationResultHelpersProduceExpectedStatus (line 35) | [Fact]
FILE: Sources/Mailozaurr.Tests/ApplicationDraftServiceTests.cs
class ApplicationDraftServiceTests (line 5) | public sealed class ApplicationDraftServiceTests {
method SaveAsyncRejectsDraftWhenProfileIsMissing (line 6) | [Fact]
method SaveAsyncStoresDraftWhenProfileExists (line 24) | [Fact]
method GetDraftsCompactReturnsLightweightProjection (line 51) | [Fact]
method CreateTemporaryFilePath (line 79) | private static string CreateTemporaryFilePath(string fileName) {
FILE: Sources/Mailozaurr.Tests/ApplicationDraftStoreTests.cs
class ApplicationDraftStoreTests (line 5) | public sealed class ApplicationDraftStoreTests {
method FileDraftStoreRoundTripsDrafts (line 6) | [Fact]
method CreateTemporaryFilePath (line 33) | private static string CreateTemporaryFilePath(string fileName) {
FILE: Sources/Mailozaurr.Tests/ApplicationFolderAliasServiceTests.cs
class ApplicationFolderAliasServiceTests (line 5) | public sealed class ApplicationFolderAliasServiceTests {
method FolderAliasServiceResolvesKnownAliasesFromFolderMetadata (line 6) | [Fact]
method FolderAliasServiceFallsBackToAliasOnlyWhenFolderLookupFails (line 30) | [Fact]
method FolderAliasServiceResolvesExplicitFolderTargetsWithoutAliasLookup (line 51) | [Fact]
method FolderAliasServiceResolvesKnownAliasesToEffectiveFolderTargets (line 72) | [Fact]
method CreateTemporaryFilePath (line 96) | private static string CreateTemporaryFilePath(string fileName) {
class FakeReadService (line 102) | private sealed class FakeReadService : IMailReadService {
method GetFoldersAsync (line 103) | public Task<IReadOnlyList<FolderRef>> GetFoldersAsync(MailFolderQuer...
method GetFoldersCompactAsync (line 131) | public Task<IReadOnlyList<FolderRefCompact>> GetFoldersCompactAsync(...
method SearchAsync (line 134) | public Task<IReadOnlyList<MessageSummary>> SearchAsync(MailSearchReq...
method SearchCompactAsync (line 137) | public Task<IReadOnlyList<MessageSummaryCompact>> SearchCompactAsync...
method GetAttachmentsAsync (line 140) | public Task<IReadOnlyList<AttachmentSummary>> GetAttachmentsAsync(Li...
method GetMessageAsync (line 143) | public Task<MessageDetail?> GetMessageAsync(GetMessageRequest reques...
method GetMessagesAsync (line 146) | public Task<IReadOnlyList<MessageDetail>> GetMessagesAsync(GetMessag...
method GetMessageCompactAsync (line 149) | public Task<MessageDetailCompact?> GetMessageCompactAsync(GetMessage...
method GetMessagesCompactAsync (line 152) | public Task<IReadOnlyList<MessageDetailCompact>> GetMessagesCompactA...
method SaveAttachmentsAsync (line 155) | public Task<SaveAttachmentsResult> SaveAttachmentsAsync(SaveAttachme...
method SaveAttachmentsManyAsync (line 158) | public Task<SaveAttachmentsManyResult> SaveAttachmentsManyAsync(Save...
method SaveAttachmentAsync (line 161) | public Task<OperationResult> SaveAttachmentAsync(SaveAttachmentReque...
class ThrowingReadService (line 165) | private sealed class ThrowingReadService : IMailReadService {
method GetFoldersAsync (line 166) | public Task<IReadOnlyList<FolderRef>> GetFoldersAsync(MailFolderQuer...
method GetFoldersCompactAsync (line 169) | public Task<IReadOnlyList<FolderRefCompact>> GetFoldersCompactAsync(...
method SearchAsync (line 172) | public Task<IReadOnlyList<MessageSummary>> SearchAsync(MailSearchReq...
method SearchCompactAsync (line 175) | public Task<IReadOnlyList<MessageSummaryCompact>> SearchCompactAsync...
method GetAttachmentsAsync (line 178) | public Task<IReadOnlyList<AttachmentSummary>> GetAttachmentsAsync(Li...
method GetMessageAsync (line 181) | public Task<MessageDetail?> GetMessageAsync(GetMessageRequest reques...
method GetMessagesAsync (line 184) | public Task<IReadOnlyList<MessageDetail>> GetMessagesAsync(GetMessag...
method GetMessageCompactAsync (line 187) | public Task<MessageDetailCompact?> GetMessageCompactAsync(GetMessage...
method GetMessagesCompactAsync (line 190) | public Task<IReadOnlyList<MessageDetailCompact>> GetMessagesCompactA...
method SaveAttachmentsAsync (line 193) | public Task<SaveAttachmentsResult> SaveAttachmentsAsync(SaveAttachme...
method SaveAttachmentsManyAsync (line 196) | public Task<SaveAttachmentsManyResult> SaveAttachmentsManyAsync(Save...
method SaveAttachmentAsync (line 199) | public Task<OperationResult> SaveAttachmentAsync(SaveAttachmentReque...
FILE: Sources/Mailozaurr.Tests/ApplicationGmailMailReadHandlerTests.cs
class ApplicationGmailMailReadHandlerTests (line 5) | public sealed class ApplicationGmailMailReadHandlerTests {
method HandlerUsesInjectedFolderDelegate (line 6) | [Fact]
method HandlerUsesInjectedSearchDelegate (line 35) | [Fact]
class FakeGmailSessionFactory (line 64) | private sealed class FakeGmailSessionFactory : IGmailSessionFactory {
method ConnectAsync (line 65) | public Task<GmailSession> ConnectAsync(MailProfile profile, Cancella...
FILE: Sources/Mailozaurr.Tests/ApplicationGmailMailSendHandlerTests.cs
class ApplicationGmailMailSendHandlerTests (line 6) | public sealed class ApplicationGmailMailSendHandlerTests {
method HandlerUsesInjectedSendDelegate (line 7) | [Fact]
method HandlerReturnsQueuedResultWhenRepositoryCapturesFailedSend (line 47) | [Fact]
method CreateTemporaryDirectory (line 94) | private static string CreateTemporaryDirectory() {
class FakeGmailSessionFactory (line 100) | private sealed class FakeGmailSessionFactory : IGmailSessionFactory {
method ConnectAsync (line 101) | public Task<GmailSession> ConnectAsync(MailProfile profile, Cancella...
FILE: Sources/Mailozaurr.Tests/ApplicationGmailSessionFactoryTests.cs
class ApplicationGmailSessionFactoryTests (line 5) | public sealed class ApplicationGmailSessionFactoryTests {
method FactoryUsesAccessTokenSecretWhenAvailable (line 6) | [Fact]
method FactoryRefreshesAccessTokenWhenOnlyRefreshTokenIsAvailable (line 32) | [Fact]
method FactoryRefreshesExpiredAccessTokenWhenRefreshTokenIsAvailable (line 74) | [Fact]
class InMemorySecretStore (line 116) | private sealed class InMemorySecretStore : IMailSecretStore {
method GetSecretAsync (line 119) | public Task<string?> GetSecretAsync(string profileId, string secretN...
method RemoveSecretAsync (line 124) | public Task<bool> RemoveSecretAsync(string profileId, string secretN...
method SetSecretAsync (line 127) | public Task SetSecretAsync(string profileId, string secretName, stri...
FILE: Sources/Mailozaurr.Tests/ApplicationGraphMailReadHandlerTests.cs
class ApplicationGraphMailReadHandlerTests (line 5) | public sealed class ApplicationGraphMailReadHandlerTests {
method HandlerUsesInjectedFolderDelegate (line 6) | [Fact]
method HandlerUsesInjectedSearchDelegate (line 36) | [Fact]
class FakeGraphSessionFactory (line 65) | private sealed class FakeGraphSessionFactory : IGraphSessionFactory {
method ConnectAsync (line 66) | public Task<GraphSession> ConnectAsync(MailProfile profile, Cancella...
FILE: Sources/Mailozaurr.Tests/ApplicationGraphMailSendHandlerTests.cs
class ApplicationGraphMailSendHandlerTests (line 5) | public sealed class ApplicationGraphMailSendHandlerTests {
method HandlerUsesInjectedSendDelegate (line 6) | [Fact]
method HandlerQueuesMessageWhenQueueIsPreferred (line 47) | [Fact]
method HandlerQueuesScheduledSendRequests (line 87) | [Fact]
class FakeGraphSessionFactory (line 133) | private sealed class FakeGraphSessionFactory : IGraphSessionFactory {
method ConnectAsync (line 134) | public Task<GraphSession> ConnectAsync(MailProfile profile, Cancella...
method CreateTemporaryDirectory (line 154) | private static string CreateTemporaryDirectory() {
FILE: Sources/Mailozaurr.Tests/ApplicationGraphSessionFactoryTests.cs
class ApplicationGraphSessionFactoryTests (line 5) | public sealed class ApplicationGraphSessionFactoryTests {
method FactoryUsesAccessTokenSecretWhenAvailable (line 6) | [Fact]
method FactoryBuildsClientCredentialRequestWhenAccessTokenIsMissing (line 32) | [Fact]
method FactoryUsesSilentInteractiveRefreshWhenStoredTokenIsExpired (line 68) | [Fact]
class InMemorySecretStore (line 106) | private sealed class InMemorySecretStore : IMailSecretStore {
method GetSecretAsync (line 109) | public Task<string?> GetSecretAsync(string profileId, string secretN...
method RemoveSecretAsync (line 114) | public Task<bool> RemoveSecretAsync(string profileId, string secretN...
method SetSecretAsync (line 117) | public Task SetSecretAsync(string profileId, string secretName, stri...
FILE: Sources/Mailozaurr.Tests/ApplicationImapMailReadHandlerTests.cs
class ApplicationImapMailReadHandlerTests (line 6) | public sealed class ApplicationImapMailReadHandlerTests {
method HandlerUsesInjectedSearchDelegate (line 7) | [Fact]
method HandlerUsesInjectedAttachmentDelegate (line 38) | [Fact]
class FakeImapSessionFactory (line 65) | private sealed class FakeImapSessionFactory : IImapSessionFactory {
method ConnectAsync (line 66) | public Task<ImapClient> ConnectAsync(MailProfile profile, Cancellati...
FILE: Sources/Mailozaurr.Tests/ApplicationImapSessionFactoryTests.cs
class ApplicationImapSessionFactoryTests (line 7) | public sealed class ApplicationImapSessionFactoryTests {
method FactoryBuildsBasicAuthSessionRequestFromProfileAndSecrets (line 8) | [Fact]
method FactoryUsesOAuthAccessTokenWhenConfigured (line 40) | [Fact]
class InMemorySecretStore (line 67) | private sealed class InMemorySecretStore : IMailSecretStore {
method GetSecretAsync (line 70) | public Task<string?> GetSecretAsync(string profileId, string secretN...
method RemoveSecretAsync (line 75) | public Task<bool> RemoveSecretAsync(string profileId, string secretN...
method SetSecretAsync (line 78) | public Task SetSecretAsync(string profileId, string secretName, stri...
FILE: Sources/Mailozaurr.Tests/ApplicationMessageActionBatchServiceTests.cs
class ApplicationMessageActionBatchServiceTests (line 5) | public sealed class ApplicationMessageActionBatchServiceTests {
method ExecuteAggregatesSuccessfulPlans (line 6) | [Fact]
method ExecuteStopsAfterFailureWhenContinueOnErrorIsFalse (line 32) | [Fact]
method CreatePlan (line 68) | private static MessageActionExecutionPlan CreatePlan(string action, st...
class FakePlanService (line 79) | private sealed class FakePlanService : IMailMessageActionPlanService {
method FakePlanService (line 82) | public FakePlanService(Func<MessageActionExecutionPlan, Task<Message...
method CreatePlanAsync (line 88) | public Task<MessageActionExecutionPlan> CreatePlanAsync(MessageActio...
method ExecuteAsync (line 91) | public async Task<MessageActionResult> ExecuteAsync(MessageActionExe...
FILE: Sources/Mailozaurr.Tests/ApplicationMessageActionConfirmationTokensTests.cs
class ApplicationMessageActionConfirmationTokensTests (line 6) | public class ApplicationMessageActionConfirmationTokensTests {
method CreateDeleteTokenPreservesMessageIdCasing (line 7) | [Fact]
method CreateDeleteTokenIgnoresMessageIdOrdering (line 24) | [Fact]
FILE: Sources/Mailozaurr.Tests/ApplicationMessageActionPlanBatchStoreTests.cs
class ApplicationMessageActionPlanBatchStoreTests (line 5) | public sealed class ApplicationMessageActionPlanBatchStoreTests {
method FileActionPlanBatchStoreRoundTripsBatches (line 6) | [Fact]
method CreateTemporaryFilePath (line 41) | private static string CreateTemporaryFilePath(string fileName) {
FILE: Sources/Mailozaurr.Tests/ApplicationMessageActionPlanRegistryServiceTests.cs
class ApplicationMessageActionPlanRegistryServiceTests (line 5) | public sealed class ApplicationMessageActionPlanRegistryServiceTests {
method SaveAsyncRejectsBatchWhenPlanProfileIsMissing (line 6) | [Fact]
method ImportAndExecuteUsesSharedRegistryPipeline (line 40) | [Fact]
method GetBatchesCompactCanFilterByPlanNames (line 80) | [Fact]
method GetBatchesCompactCanFilterByProfileIds (line 142) | [Fact]
method GetBatchesCompactCanFilterByActions (line 209) | [Fact]
method GetBatchSummaryProvidesProfileIdsAndActionCounts (line 271) | [Fact]
method GetBatchesSummaryCanSortByPlanCountDescending (line 343) | [Fact]
method AppendAndRemovePlanMutateStoredBatch (line 409) | [Fact]
method CloneAndReplacePlanMutateStoredBatch (line 477) | [Fact]
method CreateCommonBatchBuildsAndStoresSupportedPlans (line 536) | [Fact]
method CreateCommonBatchFromPreviewUsesPreviewedActionsWithoutRestatingSelection (line 632) | [Fact]
method TransformCloneRewritesTargetsAndRegeneratesConfirmationTokens (line 711) | [Fact]
method PreviewTransformCloneReportsChangesAndValidationState (line 840) | [Fact]
method PreviewTransformCloneFailsWhenTargetProfileIsMissing (line 933) | [Fact]
method TransformCloneCanLimitSelectionToSpecificPlanIndexes (line 981) | [Fact]
method TransformCloneCanLimitSelectionToSpecificPlanNames (line 1068) | [Fact]
method CreateTemporaryFilePath (line 1159) | private static string CreateTemporaryFilePath(string fileName) {
class PassThroughPlanService (line 1165) | private sealed class PassThroughPlanService : IMailMessageActionPlanSe...
method CreatePlanAsync (line 1166) | public Task<MessageActionExecutionPlan> CreatePlanAsync(MessageActio...
method ExecuteAsync (line 1169) | public Task<MessageActionResult> ExecuteAsync(MessageActionExecution...
class RecordingPlanService (line 1180) | private sealed class RecordingPlanService : IMailMessageActionPlanServ...
method CreatePlanAsync (line 1183) | public Task<MessageActionExecutionPlan> CreatePlanAsync(MessageActio...
method ExecuteAsync (line 1236) | public Task<MessageActionResult> ExecuteAsync(MessageActionExecution...
class FakePreviewService (line 1247) | private sealed class FakePreviewService : IMailMessageActionPreviewSer...
method PreviewCommonActionsAsync (line 1252) | public Task<CommonMessageActionsPreview> PreviewCommonActionsAsync(C...
method PreviewReadStateAsync (line 1274) | public Task<MessageStateChangePreview> PreviewReadStateAsync(SetRead...
method PreviewFlaggedStateAsync (line 1277) | public Task<MessageStateChangePreview> PreviewFlaggedStateAsync(SetF...
method PreviewMoveAsync (line 1280) | public Task<MoveMessagesPreview> PreviewMoveAsync(MoveMessagesPrevie...
method PreviewDeleteAsync (line 1283) | public Task<DeleteMessagesPreview> PreviewDeleteAsync(DeleteMessages...
method PreviewStandardActionsAsync (line 1286) | public Task<StandardMessageActionsPreview> PreviewStandardActionsAsy...
FILE: Sources/Mailozaurr.Tests/ApplicationMessageActionPlanServiceTests.cs
class ApplicationMessageActionPlanServiceTests (line 5) | public sealed class ApplicationMessageActionPlanServiceTests {
method CreatePlanResolvesMoveDestinationAndValidatesToken (line 6) | [Fact]
method CreatePlanRejectsMismatchedToken (line 46) | [Fact]
method ExecutePlanDispatchesNormalizedReadStateRequest (line 75) | [Fact]
method CreateTemporaryFilePath (line 110) | private static string CreateTemporaryFilePath(string fileName) {
class CapturingMessageActionService (line 116) | private sealed class CapturingMessageActionService : IMailMessageActio...
method SetReadStateAsync (line 119) | public Task<MessageActionResult> SetReadStateAsync(SetReadStateReque...
method SetFlaggedStateAsync (line 129) | public Task<MessageActionResult> SetFlaggedStateAsync(SetFlaggedStat...
method MoveAsync (line 137) | public Task<MessageActionResult> MoveAsync(MoveMessagesRequest reque...
method DeleteAsync (line 145) | public Task<MessageActionResult> DeleteAsync(DeleteMessagesRequest r...
class FakeFolderAliasService (line 154) | private sealed class FakeFolderAliasService : IMailFolderAliasService {
method GetAliasesAsync (line 155) | public Task<IReadOnlyList<MailFolderAliasSummary>> GetAliasesAsync(s...
method ResolveAsync (line 171) | public Task<MailFolderTargetResolution> ResolveAsync(string profileI...
FILE: Sources/Mailozaurr.Tests/ApplicationMessageActionPreviewServiceTests.cs
class ApplicationMessageActionPreviewServiceTests (line 5) | public sealed class ApplicationMessageActionPreviewServiceTests {
method PreviewReadStateNormalizesMessageIdsAndProducesToken (line 6) | [Fact]
method PreviewFlaggedStateNormalizesMessageIdsAndProducesToken (line 36) | [Fact]
method PreviewMoveNormalizesMessageIdsAndResolvesDestination (line 66) | [Fact]
method PreviewMoveFailsWhenDestinationIsUnsupported (line 99) | [Fact]
method PreviewDeleteNormalizesMessageIds (line 122) | [Fact]
method PreviewDeleteFailsWhenCapabilityIsUnsupported (line 151) | [Fact]
method PreviewStandardActionsCombinesArchiveTrashMoveAndDelete (line 173) | [Fact]
method PreviewStandardActionsReportsUnsupportedActions (line 219) | [Fact]
method PreviewCommonActionsIncludesStateAndMailboxActions (line 248) | [Fact]
method CreateTemporaryFilePath (line 283) | private static string CreateTemporaryFilePath(string fileName) {
class FakeFolderAliasService (line 289) | private sealed class FakeFolderAliasService : IMailFolderAliasService {
method GetAliasesAsync (line 290) | public Task<IReadOnlyList<MailFolderAliasSummary>> GetAliasesAsync(s...
method ResolveAsync (line 318) | public Task<MailFolderTargetResolution> ResolveAsync(string profileI...
class UnsupportedFolderAliasService (line 366) | private sealed class UnsupportedFolderAliasService : IMailFolderAliasS...
method GetAliasesAsync (line 367) | public Task<IReadOnlyList<MailFolderAliasSummary>> GetAliasesAsync(s...
method ResolveAsync (line 370) | public Task<MailFolderTargetResolution> ResolveAsync(string profileI...
FILE: Sources/Mailozaurr.Tests/ApplicationProfileAuthServiceTests.cs
class ApplicationProfileAuthServiceTests (line 5) | public sealed class ApplicationProfileAuthServiceTests {
method GetStatusAsyncReportsInteractiveGmailProfileState (line 6) | [Fact]
method GetStatusAsyncReportsGraphAppOnlyState (line 48) | [Fact]
method LoginGmailAsyncPersistsTokensAndProfileSettings (line 81) | [Fact]
method LoginGmailAsyncSupportsClientSecretReferences (line 126) | [Fact]
method LoginGraphAsyncPersistsAccessTokenAndProfileSettings (line 167) | [Fact]
method RefreshAsyncRoutesToSavedGmailProfile (line 209) | [Fact]
method RefreshAsyncReturnsUnsupportedForNonOauthProfiles (line 243) | [Fact]
class InMemoryProfileStore (line 264) | private sealed class InMemoryProfileStore : IMailProfileStore {
method InMemoryProfileStore (line 267) | public InMemoryProfileStore(IEnumerable<MailProfile> profiles) {
method GetAllAsync (line 271) | public Task<IReadOnlyList<MailProfile>> GetAllAsync(CancellationToke...
method GetByIdAsync (line 274) | public Task<MailProfile?> GetByIdAsync(string profileId, Cancellatio...
method RemoveAsync (line 279) | public Task<bool> RemoveAsync(string profileId, CancellationToken ca...
method SaveAsync (line 282) | public Task SaveAsync(MailProfile profile, CancellationToken cancell...
method CloneProfile (line 287) | private static MailProfile CloneProfile(MailProfile profile) => new() {
class InMemorySecretStore (line 302) | private sealed class InMemorySecretStore : IMailSecretStore {
method GetSecretAsync (line 305) | public Task<string?> GetSecretAsync(string profileId, string secretN...
method RemoveSecretAsync (line 310) | public Task<bool> RemoveSecretAsync(string profileId, string secretN...
method SetSecretAsync (line 313) | public Task SetSecretAsync(string profileId, string secretName, stri...
FILE: Sources/Mailozaurr.Tests/ApplicationProfileBootstrapServiceTests.cs
class ApplicationProfileBootstrapServiceTests (line 5) | public sealed class ApplicationProfileBootstrapServiceTests {
method SaveGraphProfileAsyncPersistsProfileSettingsAndSecrets (line 6) | [Fact]
method SaveGraphProfileAsyncSupportsSecretReferences (line 40) | [Fact]
method SaveGraphProfileAsyncRequiresAuthenticationMaterial (line 65) | [Fact]
method SaveGmailProfileAsyncPersistsProfileSettingsAndSecrets (line 84) | [Fact]
method SaveGmailProfileAsyncRequiresAuthenticationMaterial (line 119) | [Fact]
method DiagnoseAsyncReportsMissingGmailSecrets (line 137) | [Fact]
class InMemoryProfileStore (line 160) | private sealed class InMemoryProfileStore : IMailProfileStore {
method GetAllAsync (line 163) | public Task<IReadOnlyList<MailProfile>> GetAllAsync(CancellationToke...
method GetByIdAsync (line 166) | public Task<MailProfile?> GetByIdAsync(string profileId, Cancellatio...
method RemoveAsync (line 171) | public Task<bool> RemoveAsync(string profileId, CancellationToken ca...
method SaveAsync (line 174) | public Task SaveAsync(MailProfile profile, CancellationToken cancell...
class InMemorySecretStore (line 180) | private sealed class InMemorySecretStore : IMailSecretStore {
method GetSecretAsync (line 183) | public Task<string?> GetSecretAsync(string profileId, string secretN...
method RemoveSecretAsync (line 188) | public Task<bool> RemoveSecretAsync(string profileId, string secretN...
method SetSecretAsync (line 191) | public Task SetSecretAsync(string profileId, string secretName, stri...
FILE: Sources/Mailozaurr.Tests/ApplicationProfileConnectionServiceTests.cs
class ApplicationProfileConnectionServiceTests (line 7) | public sealed class ApplicationProfileConnectionServiceTests {
method TestAsyncUsesMailboxScopeByDefaultForGmail (line 8) | [Fact]
method TestAsyncUsesAuthScopeWhenRequestedForGraph (line 43) | [Fact]
method TestAsyncFallsBackFromSendToAuthForImap (line 77) | [Fact]
class InMemoryProfileStore (line 101) | private sealed class InMemoryProfileStore : IMailProfileStore {
method InMemoryProfileStore (line 104) | public InMemoryProfileStore(IEnumerable<MailProfile> profiles) {
method GetAllAsync (line 108) | public Task<IReadOnlyList<MailProfile>> GetAllAsync(CancellationToke...
method GetByIdAsync (line 111) | public Task<MailProfile?> GetByIdAsync(string profileId, Cancellatio...
method RemoveAsync (line 116) | public Task<bool> RemoveAsync(string profileId, CancellationToken ca...
method SaveAsync (line 119) | public Task SaveAsync(MailProfile profile, CancellationToken cancell...
method CloneProfile (line 124) | private static MailProfile CloneProfile(MailProfile profile) => new() {
class FakeImapSessionFactory (line 139) | private sealed class FakeImapSessionFactory : IImapSessionFactory {
method ConnectAsync (line 140) | public Task<ImapClient> ConnectAsync(MailProfile profile, Cancellati...
class FakeGraphSessionFactory (line 144) | private sealed class FakeGraphSessionFactory : IGraphSessionFactory {
method ConnectAsync (line 145) | public Task<GraphSession> ConnectAsync(MailProfile profile, Cancella...
class FakeGmailSessionFactory (line 153) | private sealed class FakeGmailSessionFactory : IGmailSessionFactory {
method ConnectAsync (line 154) | public Task<GmailSession> ConnectAsync(MailProfile profile, Cancella...
FILE: Sources/Mailozaurr.Tests/ApplicationProfileOverviewServiceTests.cs
class ApplicationProfileOverviewServiceTests (line 5) | public sealed class ApplicationProfileOverviewServiceTests {
method GetOverviewAggregatesCapabilitiesAuthAndReadiness (line 6) | [Fact]
method GetOverviewReturnsNullWhenProfileDoesNotExist (line 45) | [Fact]
method GetOverviewsReturnsAggregatedSummariesForAllProfiles (line 55) | [Fact]
method GetOverviewsAppliesSharedFilters (line 89) | [Fact]
method GetOverviewsSupportsReadinessSorting (line 126) | [Fact]
method GetCompactOverviewsReturnsLightweightProjection (line 164) | [Fact]
class FakeProfileAuthService (line 190) | private sealed class FakeProfileAuthService : IMailProfileAuthService {
method GetStatusAsync (line 193) | public Task<MailProfileAuthStatus?> GetStatusAsync(string profileId,...
method LoginGmailAsync (line 207) | public Task<MailProfileAuthenticationResult> LoginGmailAsync(GmailPr...
method LoginGraphAsync (line 210) | public Task<MailProfileAuthenticationResult> LoginGraphAsync(GraphPr...
method RefreshAsync (line 213) | public Task<MailProfileAuthenticationResult> RefreshAsync(string pro...
class InMemoryProfileStore (line 217) | private sealed class InMemoryProfileStore : IMailProfileStore {
method InMemoryProfileStore (line 220) | public InMemoryProfileStore(IEnumerable<MailProfile> profiles) {
method GetAllAsync (line 224) | public Task<IReadOnlyList<MailProfile>> GetAllAsync(CancellationToke...
method GetByIdAsync (line 227) | public Task<MailProfile?> GetByIdAsync(string profileId, Cancellatio...
method SaveAsync (line 232) | public Task SaveAsync(MailProfile profile, CancellationToken cancell...
method RemoveAsync (line 237) | public Task<bool> RemoveAsync(string profileId, CancellationToken ca...
method CloneProfile (line 240) | private static MailProfile CloneProfile(MailProfile profile) => new() {
class InMemorySecretStore (line 255) | private sealed class InMemorySecretStore : IMailSecretStore {
method GetSecretAsync (line 258) | public Task<string?> GetSecretAsync(string profileId, string secretN...
method SetSecretAsync (line 263) | public Task SetSecretAsync(string profileId, string secretName, stri...
method RemoveSecretAsync (line 268) | public Task<bool> RemoveSecretAsync(string profileId, string secretN...
method CreateKey (line 271) | private static string CreateKey(string profileId, string secretName)...
FILE: Sources/Mailozaurr.Tests/ApplicationProfileSecretServiceTests.cs
class ApplicationProfileSecretServiceTests (line 5) | public sealed class ApplicationProfileSecretServiceTests {
method SetSecretAsyncRequiresExistingProfile (line 6) | [Fact]
method SetSecretAsyncPersistsSecretForExistingProfile (line 18) | [Fact]
method SetSecretAsyncSupportsReferenceCopyForExistingProfile (line 40) | [Fact]
method CreateTemporaryFilePath (line 72) | private static string CreateTemporaryFilePath(string fileName) {
class TestCredentialProtector (line 78) | private sealed class TestCredentialProtector : ICredentialProtector {
method Protect (line 79) | public string Protect(string plainText) => Convert.ToBase64String(Sy...
method Unprotect (line 81) | public string Unprotect(string protectedData) {
FILE: Sources/Mailozaurr.Tests/ApplicationProfileServiceTests.cs
class ApplicationProfileServiceTests (line 5) | public sealed class ApplicationProfileServiceTests {
method SaveAsyncReturnsValidationErrorForInvalidProfile (line 6) | [Fact]
method SetDefaultAsyncMarksRequestedProfileAsDefault (line 17) | [Fact]
method DeleteAsyncRemovesKnownSecretsWhenSecretStoreIsProvided (line 43) | [Fact]
method CreateTemporaryFilePath (line 66) | private static string CreateTemporaryFilePath(string fileName) {
class TestCredentialProtector (line 72) | private sealed class TestCredentialProtector : ICredentialProtector {
method Protect (line 73) | public string Protect(string plainText) => Convert.ToBase64String(Sy...
method Unprotect (line 75) | public string Unprotect(string protectedData) {
FILE: Sources/Mailozaurr.Tests/ApplicationProfileStoreTests.cs
class ApplicationProfileStoreTests (line 5) | public sealed class ApplicationProfileStoreTests {
method FileProfileStoreRoundTripsProfiles (line 6) | [Fact]
method SavingDefaultProfileClearsPreviousDefault (line 31) | [Fact]
method RemoveReturnsFalseWhenProfileDoesNotExist (line 56) | [Fact]
method CreateTemporaryFilePath (line 66) | private static string CreateTemporaryFilePath() {
FILE: Sources/Mailozaurr.Tests/ApplicationQueueServiceTests.cs
class ApplicationQueueServiceTests (line 5) | public sealed class ApplicationQueueServiceTests {
method ListAsyncReturnsQueuedMessagesInScheduleOrder (line 6) | [Fact]
method RemoveAsyncReturnsFailureWhenMessageDoesNotExist (line 37) | [Fact]
method ProcessAsyncReturnsObserverCounts (line 50) | [Fact]
method CreateTemporaryDirectory (line 81) | private static string CreateTemporaryDirectory() {
FILE: Sources/Mailozaurr.Tests/ApplicationRoutingServicesTests.cs
class ApplicationRoutingServicesTests (line 5) | public sealed class ApplicationRoutingServicesTests {
method RoutedReadServiceDispatchesToMatchingHandler (line 6) | [Fact]
method RoutedReadServiceBuildsCompactFolderProjection (line 29) | [Fact]
method RoutedReadServiceBuildsCompactSearchProjection (line 52) | [Fact]
method RoutedReadServiceListsAttachmentsThroughSharedMessageProjection (line 77) | [Fact]
method RoutedReadServiceBuildsCompactMessageProjection (line 100) | [Fact]
method RoutedReadServiceBuildsBatchCompactMessageProjection (line 126) | [Fact]
method RoutedReadServiceSavesFilteredAttachmentsThroughSharedBatchWorkflow (line 151) | [Fact]
method RoutedReadServiceSavesFilteredAttachmentsAcrossMultipleMessages (line 177) | [Fact]
method RoutedSendServiceDispatchesToMatchingHandler (line 207) | [Fact]
method RoutedMessageActionServiceDispatchesToMatchingHandler (line 235) | [Fact]
method RoutedMessageActionServiceRejectsMismatchedReadStateConfirmationToken (line 258) | [Fact]
method RoutedMessageActionServiceDispatchesFlaggedStateToMatchingHandler (line 285) | [Fact]
method RoutedMessageActionServiceRejectsMismatchedFlaggedStateConfirmationToken (line 308) | [Fact]
method RoutedMessageActionServiceCanonicalizesKnownFolderAlias (line 335) | [Fact]
method RoutedMessageActionServiceResolvesKnownFolderAliasThroughSharedAliasService (line 359) | [Fact]
method RoutedMessageActionServiceRejectsMismatchedMoveConfirmationToken (line 387) | [Fact]
method RoutedMessageActionServiceAcceptsMatchingMoveConfirmationToken (line 415) | [Fact]
method RoutedMessageActionServiceAcceptsPreviewGeneratedDeleteConfirmationTokenWithCaseDistinctIds (line 449) | [Fact]
method RoutedMessageActionServiceRejectsMismatchedDeleteConfirmationToken (line 485) | [Fact]
method RoutedReadServiceRejectsUnsupportedCapabilities (line 510) | [Fact]
method CreateTemporaryFilePath (line 532) | private static string CreateTemporaryFilePath(string fileName) {
class FakeReadHandler (line 538) | private sealed class FakeReadHandler : IMailReadHandler {
method FakeReadHandler (line 539) | public FakeReadHandler(MailProfileKind kind) {
method GetFoldersAsync (line 549) | public Task<IReadOnlyList<FolderRef>> GetFoldersAsync(MailProfile pr...
method GetMessageAsync (line 560) | public Task<MessageDetail?> GetMessageAsync(MailProfile profile, Get...
method SaveAttachmentAsync (line 581) | public Task<OperationResult> SaveAttachmentAsync(MailProfile profile...
method SearchAsync (line 586) | public Task<IReadOnlyList<MessageSummary>> SearchAsync(MailProfile p...
class FakeSendHandler (line 604) | private sealed class FakeSendHandler : IMailSendHandler {
method FakeSendHandler (line 605) | public FakeSendHandler(MailProfileKind kind) {
method SendAsync (line 613) | public Task<SendResult> SendAsync(MailProfile profile, SendMessageRe...
class FakeMessageActionHandler (line 623) | private sealed class FakeMessageActionHandler : IMailMessageActionHand...
method FakeMessageActionHandler (line 624) | public FakeMessageActionHandler(MailProfileKind kind) {
method SetReadStateAsync (line 638) | public Task<MessageActionResult> SetReadStateAsync(MailProfile profi...
method SetFlaggedStateAsync (line 648) | public Task<MessageActionResult> SetFlaggedStateAsync(MailProfile pr...
method MoveAsync (line 658) | public Task<MessageActionResult> MoveAsync(MailProfile profile, Move...
method DeleteAsync (line 668) | public Task<MessageActionResult> DeleteAsync(MailProfile profile, De...
class FakeFolderAliasService (line 679) | private sealed class FakeFolderAliasService : IMailFolderAliasService {
method GetAliasesAsync (line 684) | public Task<IReadOnlyList<MailFolderAliasSummary>> GetAliasesAsync(s...
method ResolveAsync (line 703) | public Task<MailFolderTargetResolution> ResolveAsync(string profileI...
FILE: Sources/Mailozaurr.Tests/ApplicationSecretStoreTests.cs
class ApplicationSecretStoreTests (line 5) | public sealed class ApplicationSecretStoreTests {
method SecretStoreProtectsAndReturnsValues (line 6) | [Fact]
method RemoveSecretReturnsFalseWhenEntryDoesNotExist (line 21) | [Fact]
method RemoveSecretDeletesStoredValue (line 32) | [Fact]
method UpdatingSecretReplacesFileWithoutLeavingTemporaryArtifacts (line 46) | [Fact]
method CreateTemporaryFilePath (line 63) | private static string CreateTemporaryFilePath() {
class TestCredentialProtector (line 69) | private sealed class TestCredentialProtector : ICredentialProtector {
method Protect (line 70) | public string Protect(string plainText) => Convert.ToBase64String(Sy...
method Unprotect (line 72) | public string Unprotect(string protectedData) {
FILE: Sources/Mailozaurr.Tests/ApplicationSmtpMailSendHandlerTests.cs
class ApplicationSmtpMailSendHandlerTests (line 6) | public sealed class ApplicationSmtpMailSendHandlerTests {
method HandlerUsesInjectedSendDelegate (line 7) | [Fact]
method HandlerReturnsQueuedResultWhenRepositoryCapturesFailedSend (line 48) | [Fact]
method CreateTemporaryDirectory (line 99) | private static string CreateTemporaryDirectory() {
class FakeSmtpSessionFactory (line 105) | private sealed class FakeSmtpSessionFactory : ISmtpSessionFactory {
method ConnectAsync (line 106) | public Task<Smtp> ConnectAsync(MailProfile profile, CancellationToke...
FILE: Sources/Mailozaurr.Tests/ApplicationSmtpSessionFactoryTests.cs
class ApplicationSmtpSessionFactoryTests (line 7) | public sealed class ApplicationSmtpSessionFactoryTests {
method FactoryBuildsBasicAuthSessionRequestFromProfileAndSecrets (line 8) | [Fact]
method FactoryUsesOAuthAccessTokenWhenConfigured (line 42) | [Fact]
class InMemorySecretStore (line 70) | private sealed class InMemorySecretStore : IMailSecretStore {
method GetSecretAsync (line 73) | public Task<string?> GetSecretAsync(string profileId, string secretN...
method RemoveSecretAsync (line 78) | public Task<bool> RemoveSecretAsync(string profileId, string secretN...
method SetSecretAsync (line 81) | public Task SetSecretAsync(string profileId, string secretName, stri...
FILE: Sources/Mailozaurr.Tests/CliRunnerTests.cs
class CliRunnerTests (line 8) | public sealed class CliRunnerTests {
method HelpIsShownWhenNoArgumentsAreProvided (line 9) | [Fact]
method ProfileListUsesApplicationProfilesService (line 21) | [Fact]
method ProfileListSummaryUsesSharedOverviewService (line 37) | [Fact]
method ProfileListSummaryCompactUsesSharedCompactProjection (line 55) | [Fact]
method ProfileListSummarySupportsSharedFilters (line 72) | [Fact]
method ProfileListSummarySupportsSharedSorting (line 90) | [Fact]
method ProfileCreateSavesProfileThroughApplicationService (line 117) | [Fact]
method ProfileGraphBootstrapSavesProfileA
Condensed preview — 982 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,538K chars).
[
{
"path": ".editorconfig",
"chars": 9931,
"preview": "# Remove the line below if you want to inherit .editorconfig settings from higher directories\nroot = true\n\n# Default set"
},
{
"path": ".gitattributes",
"chars": 202,
"preview": "* text=auto eol=lf\n\n*.png binary\n*.psd binary\n*.jpg binary\n*.jpeg binary\n*.gif binary\n*.bmp binary\n*.ico binary\n*.pdf bi"
},
{
"path": ".github/FUNDING.yml",
"chars": 111,
"preview": "# These are supported funding model platforms\n\ngithub: PrzemyslawKlys\ncustom: https://paypal.me/PrzemyslawKlys"
},
{
"path": ".github/workflows/claude-code-review.yml",
"chars": 3033,
"preview": "name: Claude Code Review\n\non:\n pull_request:\n types: [opened, synchronize]\n # Optional: Only run on specific file"
},
{
"path": ".github/workflows/claude.yml",
"chars": 2313,
"preview": "name: Claude Code\n\non:\n issue_comment:\n types: [created]\n pull_request_review_comment:\n types: [created]\n issue"
},
{
"path": ".github/workflows/dotnet-tests.yml",
"chars": 8302,
"preview": "# .NET Testing Workflow\nname: Test .NET Libraries\n\non:\n push:\n branches:\n - v2-speedygonzales\n paths-ignore:"
},
{
"path": ".github/workflows/powershell-tests-all.yml",
"chars": 6491,
"preview": "name: Test PowerShell Module (All)\n\n# This workflow is disabled but ready for use\non:\n workflow_dispatch: # Manual tri"
},
{
"path": ".gitignore",
"chars": 344,
"preview": "Ignore/*\n.vs/*\n.vscode/*\nExamples/Output/*\nExamples/Input/*\nExamples/Documents/*\nReleases/*\nArtefacts/*\nReleasedUnpacked"
},
{
"path": "Build/Artefacts/ProjectBuild/project.build.plan.json",
"chars": 922,
"preview": "{\n \"Success\": true,\n \"ResolvedVersion\": \"2.0.5\",\n \"ResolvedVersionsByProject\": {\n \"Mailozaurr.Msg\": \"2.0.5\",\n \""
},
{
"path": "Build/Build-Module.ps1",
"chars": 6279,
"preview": "# Install-Module PSPublishModule -Force\nImport-Module PSPublishModule -Force\n\nBuild-Module -ModuleName 'Mailozaurr' {\n "
},
{
"path": "Build/Build-Project.ps1",
"chars": 821,
"preview": "param(\n [string] $ConfigPath = \"$PSScriptRoot\\project.build.json\",\n [Nullable[bool]] $UpdateVersions,\n [Nullabl"
},
{
"path": "Build/Refresh-DisposableDomains.ps1",
"chars": 1537,
"preview": "[CmdletBinding()]\nparam(\n [string]$OutputPath = (Join-Path $PSScriptRoot '..\\Sources\\Mailozaurr\\Resources')\n)\n\n$lists"
},
{
"path": "Build/project.build.json",
"chars": 1421,
"preview": "{\n \"$schema\": \"https://raw.githubusercontent.com/EvotecIT/PSPublishModule/main/Schemas/project.build.schema.json\",\n \"R"
},
{
"path": "CHANGELOG.MD",
"chars": 11607,
"preview": "#### 2.0.0 - Preview 6\n##### What's Changed\n* docs: fix permissions typo in README by @PrzemyslawKlys in https://github"
},
{
"path": "Docs/Configuration-and-Usage.md",
"chars": 9172,
"preview": "# Mailozaurr Configuration and Usage\n\nThis document collects the practical configuration model for Mailozaurr across its"
},
{
"path": "Docs/OAuthFlows.md",
"chars": 1011,
"preview": "# OAuth device code and on-behalf-of flows\n\nMailozaurr can acquire delegated Microsoft Graph tokens using additional OAu"
},
{
"path": "Docs/PGP.md",
"chars": 1254,
"preview": "# PGP Support in Mailozaurr\n\nMailozaurr is able to sign and encrypt messages using OpenPGP. The implementation relies on"
},
{
"path": "Docs/Platform-Architecture.md",
"chars": 10955,
"preview": "# Mailozaurr Platform Architecture\n\nThis document defines how Mailozaurr should evolve across its library, PowerShell, C"
},
{
"path": "Examples/Example-AcquireGoogleTokenInteractive.ps1",
"chars": 1072,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$GmailAccount = 'user@gmail.com'\n$ClientID = 'Your-Client-ID'\n$Cl"
},
{
"path": "Examples/Example-AcquireO365TokenInteractive.ps1",
"chars": 1302,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$Login = 'user@example.com'\n$ClientID = 'Your-Application-ID'\n$Te"
},
{
"path": "Examples/Example-ClearGraphJunk.ps1",
"chars": 1963,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$graph = Connect-EmailGraph -ClientId 'id' -DirectoryId 'tenant' "
},
{
"path": "Examples/Example-ClearImapJunk.ps1",
"chars": 1433,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$cred = Get-Credential\n$imap = Connect-IMAP -Server 'imap.example"
},
{
"path": "Examples/Example-ConnecToImap-01.ps1",
"chars": 361,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$UserName = 'email@gmail.com'\n$Password = ''\n\n$Client = Connect-I"
},
{
"path": "Examples/Example-ConnecToImap-02.ps1",
"chars": 331,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$Credential = Get-Credential\n$Client = Connect-IMAP -Server 'imap"
},
{
"path": "Examples/Example-ConnecToImap-03-oAuth.ps1",
"chars": 612,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$ClientID = '9393330741'\n$ClientSecret = 'gk2ztAGU'\n\n$oAuth2 = Co"
},
{
"path": "Examples/Example-ConnecToPop3-01.ps1",
"chars": 504,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$UserName = 'Test@gmail.com'\n$Password = 'TextPassword'\n\n$Client"
},
{
"path": "Examples/Example-ConnecToPop3-02.ps1",
"chars": 472,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$Credentials = Get-Credential\n$Client = Connect-POP3 -Server 'po"
},
{
"path": "Examples/Example-ConnecToPop3-03-oAuth.ps1",
"chars": 655,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$ClientID = '93933307418'\n$ClientSecret = 'gk2ztAG'\n\n$oAuth2 = Co"
},
{
"path": "Examples/Example-ConnectEmailGraph-DeviceCode.ps1",
"chars": 331,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$ClientId = 'Your-Application-ID'\n$TenantId = 'Your-Tenant-ID'\n$S"
},
{
"path": "Examples/Example-ConnectEmailGraph-OnBehalfOf.ps1",
"chars": 451,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$ClientId = 'Your-Application-ID'\n$TenantId = 'Your-Tenant-ID'\n$C"
},
{
"path": "Examples/Example-ConvertFromEmlToMsg.ps1",
"chars": 342,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$Conversion = ConvertFrom-EmlToMsg -InputPath \"$PSScriptRoot\\Inp"
},
{
"path": "Examples/Example-DeleteImapMessages.ps1",
"chars": 377,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$Credential = Get-Credential\n$Client = Connect-IMAP -Server 'imap"
},
{
"path": "Examples/Example-DeletePop3Messages.ps1",
"chars": 379,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$credential = Get-Credential\n$client = Connect-POP3 -Server 'pop."
},
{
"path": "Examples/Example-EmailPendingMessages.ps1",
"chars": 890,
"preview": "$pending = Join-Path $PSScriptRoot 'pending'\n\n# Existing pending queues created prior to credential protection will stil"
},
{
"path": "Examples/Example-ExtractLocalImagePaths.ps1",
"chars": 266,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$tmp = New-TemporaryFile\nSet-Content -Path $tmp -Value \"data\"\n$ht"
},
{
"path": "Examples/Example-ForwardMessageAttachmentFiltered.ps1",
"chars": 1830,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n# Forward IMAP messages without attachments\n$imapCred = Get-Crede"
},
{
"path": "Examples/Example-GetEmailDeliveryMatch.ps1",
"chars": 422,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n# Correlate non-delivery reports with sent messages\n$repo = [Mail"
},
{
"path": "Examples/Example-GetEmailDeliveryStatus.ps1",
"chars": 321,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n# Search recent non-delivery reports via IMAP\nConnect-IMAP -Serve"
},
{
"path": "Examples/Example-GetGraphDmarcReport.ps1",
"chars": 602,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$ClientId = 'Your-Application-ID'\n$TenantId = 'Your-Tenant-ID'\n$S"
},
{
"path": "Examples/Example-GetGraphEvent.ps1",
"chars": 206,
"preview": "# Retrieve upcoming events for a user\n$cred = Connect-EmailGraph -ClientId 'client' -TenantId 'tenant' -ClientSecret 'se"
},
{
"path": "Examples/Example-GetGraphMailboxStatistics-Console.ps1",
"chars": 475,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$graph = Connect-EmailGraph -ClientId 'id' -DirectoryId 'tenant' "
},
{
"path": "Examples/Example-GetGraphMailboxStatistics.ps1",
"chars": 474,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$graph = Connect-EmailGraph -ClientId 'id' -DirectoryId 'tenant' "
},
{
"path": "Examples/Example-GetImapDmarcReport.ps1",
"chars": 463,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\nConnect-IMAP -Server 'imap.example.com' -Credential (Get-Credenti"
},
{
"path": "Examples/Example-GetMailFolder.ps1",
"chars": 613,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n# using application permissions\n$ClientId = 'your-client-id'\n$Cli"
},
{
"path": "Examples/Example-GetPop3DmarcReport.ps1",
"chars": 447,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\nConnect-POP3 -Server 'pop3.example.com' -Credential (Get-Credenti"
},
{
"path": "Examples/Example-GmailApi-01-OAuth.ps1",
"chars": 666,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n# Connect-OAuthGoogle launches a browser sign-in flow and returns"
},
{
"path": "Examples/Example-GmailApi-02-SendMessage.ps1",
"chars": 331,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$cred = ConvertTo-OAuth2Credential -UserName 'user@gmail.com' -To"
},
{
"path": "Examples/Example-GmailApi-03-SendEmailMessageProvider.ps1",
"chars": 354,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$cred = ConvertTo-OAuth2Credential -UserName 'user@gmail.com' -To"
},
{
"path": "Examples/Example-GmailApi-04-ListMessages.ps1",
"chars": 297,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$cred = ConvertTo-OAuth2Credential -UserName 'user@gmail.com' -To"
},
{
"path": "Examples/Example-GmailApi-05-GetMessage.ps1",
"chars": 318,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$cred = ConvertTo-OAuth2Credential -UserName 'user@gmail.com' -To"
},
{
"path": "Examples/Example-GmailApi-06-SaveAttachments.ps1",
"chars": 248,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$cred = ConvertTo-OAuth2Credential -UserName 'user@gmail.com' -To"
},
{
"path": "Examples/Example-GmailApi-07-DeleteMessage.ps1",
"chars": 240,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$cred = ConvertTo-OAuth2Credential -UserName 'user@gmail.com' -To"
},
{
"path": "Examples/Example-GmailApi-08-FilterAndDelete.ps1",
"chars": 377,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$cred = ConvertTo-OAuth2Credential -UserName 'user@gmail.com' -To"
},
{
"path": "Examples/Example-GmailApi-09-DownloadAttachments.ps1",
"chars": 399,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$cred = ConvertTo-OAuth2Credential -UserName 'user@gmail.com' -To"
},
{
"path": "Examples/Example-GmailApi-10-SendWithAttachment.ps1",
"chars": 351,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$cred = ConvertTo-OAuth2Credential -UserName 'user@gmail.com' -To"
},
{
"path": "Examples/Example-GmailApi-11-ListThreads.ps1",
"chars": 292,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$cred = ConvertTo-OAuth2Credential -UserName 'user@gmail.com' -To"
},
{
"path": "Examples/Example-GmailApi-12-GetThread.ps1",
"chars": 319,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$cred = ConvertTo-OAuth2Credential -UserName 'user@gmail.com' -To"
},
{
"path": "Examples/Example-GmailApi-13-SendWithHeaders.ps1",
"chars": 392,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$cred = ConvertTo-OAuth2Credential -UserName 'user@gmail.com' -To"
},
{
"path": "Examples/Example-GmailApi-14-SearchNonDeliveryReports.ps1",
"chars": 382,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$cred = ConvertTo-OAuth2Credential -UserName 'user@gmail.com' -To"
},
{
"path": "Examples/Example-GmailApi-15-GetDmarcReport.ps1",
"chars": 616,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$clientSecret = Read-Host 'Google client secret' -AsSecureString\n"
},
{
"path": "Examples/Example-GraphMailboxPermissions.ps1",
"chars": 2560,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n# Graph application credentials\n$ClientId = 'your-client-id'\n"
},
{
"path": "Examples/Example-GraphManageMessages.ps1",
"chars": 874,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n# Example: Download attachments and archive the message\n$ClientId"
},
{
"path": "Examples/Example-ImapFilterScenarios.ps1",
"chars": 1334,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$cred = Get-Credential\n$client = Connect-IMAP -Server 'imap.examp"
},
{
"path": "Examples/Example-ImportMSG.ps1",
"chars": 233,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$Msg = Import-MailFile -FilePath \"$PSScriptRoot\\Input\\TestMessag"
},
{
"path": "Examples/Example-ListImapFolderContents.ps1",
"chars": 731,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n# Authenticate however you like\n$cred = Get-Credential\n$client = "
},
{
"path": "Examples/Example-ListImapRootFolders.ps1",
"chars": 335,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n# Acquire credentials using your preferred method\n$credential = G"
},
{
"path": "Examples/Example-ListImapRootFoldersOAuth.ps1",
"chars": 502,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n# Acquire OAuth token first\n$clientSecret = Read-Host 'Google cli"
},
{
"path": "Examples/Example-MoveMailFolder.ps1",
"chars": 1590,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n# ----------------------\n# Move IMAP folder\n# -------------------"
},
{
"path": "Examples/Example-NewGraphEvent.ps1",
"chars": 351,
"preview": "# Create a simple event\n$cred = Connect-EmailGraph -ClientId 'client' -TenantId 'tenant' -ClientSecret 'secret'\n$builder"
},
{
"path": "Examples/Example-ParseGraphError.ps1",
"chars": 741,
"preview": "$sample = @'\nPOST https://graph.microsoft.com/v1.0/users/przemyslaw.klys@company.pl/sendMail\nHTTP/2.0 404 Not Found\nrequ"
},
{
"path": "Examples/Example-Pop3FilterScenarios.ps1",
"chars": 1304,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$cred = Get-Credential\n$client = Connect-POP3 -Server 'pop.exampl"
},
{
"path": "Examples/Example-ProcessPendingMessages.ps1",
"chars": 334,
"preview": "$pending = Join-Path $PSScriptRoot 'pending'\n$sent = Join-Path $PSScriptRoot 'sentlog.json'\n$smtp = [Mailozaurr.Smtp]::n"
},
{
"path": "Examples/Example-QueryLanguageSearch.ps1",
"chars": 472,
"preview": "# Demonstrates searching an IMAP mailbox using query language\nImport-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$im"
},
{
"path": "Examples/Example-ReadGraphEncryption.ps1",
"chars": 1032,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$cred = ConvertTo-GraphCredential -ClientId 'clientId' -ClientSec"
},
{
"path": "Examples/Example-ReadImapEncryption.ps1",
"chars": 1083,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$cred = Get-Credential\n$client = Connect-IMAP -Server 'imap.examp"
},
{
"path": "Examples/Example-ReadPop3Encryption.ps1",
"chars": 1035,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$cred = Get-Credential\n$client = Connect-POP3 -Server 'pop.exampl"
},
{
"path": "Examples/Example-RemoveGmailMessage.ps1",
"chars": 386,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n# Acquire OAuth2 credential using Connect-OAuthGoogle\n# $cred = C"
},
{
"path": "Examples/Example-RemoveMailFolder.ps1",
"chars": 1285,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n# ----------------------\n# Remove IMAP folder\n# -----------------"
},
{
"path": "Examples/Example-RemoveMessageAttachment.ps1",
"chars": 1408,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n# Create a MIME message and strip attachments before forwarding\n$"
},
{
"path": "Examples/Example-RemoveMessageAttachmentFiltered.ps1",
"chars": 1712,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n# Strip attachments from IMAP messages sent by alerts@example.com"
},
{
"path": "Examples/Example-RemoveMessages-01.ps1",
"chars": 957,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n# ----------------------\n# Basic IMAP deletion\n# ----------------"
},
{
"path": "Examples/Example-RemoveMessages-02.ps1",
"chars": 1174,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n# ------------------------------------\n# Advanced IMAP and POP3 c"
},
{
"path": "Examples/Example-RenameMailFolder.ps1",
"chars": 1341,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n# ----------------------\n# Rename IMAP folder\n# -----------------"
},
{
"path": "Examples/Example-RetrieveAndCorrelateNdr.ps1",
"chars": 662,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n# Retrieve recent non-delivery reports and correlate with sent me"
},
{
"path": "Examples/Example-RetryAlways.Tests.ps1",
"chars": 492,
"preview": "Describe 'RetryAlways example' {\n It 'Uses RetryAlways switch' {\n $params = @{ \n From = 'test@conto"
},
{
"path": "Examples/Example-RetryAlways.cs",
"chars": 534,
"preview": "using Mailozaurr;\nusing System.Net;\n\n// Example demonstrating RetryAlways\nvar smtp = new Smtp();\nsmtp.From = \"sender@exa"
},
{
"path": "Examples/Example-SaveGmailMessageAttachment.ps1",
"chars": 410,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n# Acquire OAuth2 credential using Connect-OAuthGoogle\n# $cred = C"
},
{
"path": "Examples/Example-SaveImapMessageAttachment.ps1",
"chars": 476,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$credential = Get-Credential\n$client = Connect-IMAP -Server 'imap"
},
{
"path": "Examples/Example-SaveImapMessageAttachmentFiltered.ps1",
"chars": 512,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$credential = Get-Credential\n$client = Connect-IMAP -Server 'imap"
},
{
"path": "Examples/Example-SaveMimeMessage.ps1",
"chars": 937,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$cred = Get-Credential\n$client = Connect-IMAP -Server 'imap.examp"
},
{
"path": "Examples/Example-SavePop3MessageAttachment.ps1",
"chars": 364,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$credential = Get-Credential\n$client = Connect-POP3 -Server 'pop."
},
{
"path": "Examples/Example-SavePop3MessageAttachmentFiltered.ps1",
"chars": 508,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$credential = Get-Credential\n$client = Connect-POP3 -Server 'pop."
},
{
"path": "Examples/Example-SearchAndFind.ps1",
"chars": 1185,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n# Search an IMAP mailbox\n$imap = Connect-IMAP -Server 'imap.examp"
},
{
"path": "Examples/Example-SearchMessageBody.ps1",
"chars": 610,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n# Search IMAP mailbox body\n$imap = Connect-IMAP -Server 'imap.exa"
},
{
"path": "Examples/Example-SendEmail-01-Text.ps1",
"chars": 463,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\nif (-not $MailCredentials) {\n $MailCredentials = Get-Credenti"
},
{
"path": "Examples/Example-SendEmail-01.ps1",
"chars": 1069,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\nif (-not $MailCredentials) {\n $MailCredentials = Get-Credenti"
},
{
"path": "Examples/Example-SendEmail-02.ps1",
"chars": 1928,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$UserNotify = 'Przemyslaw'\n\n$Body = EmailBody -FontFamily 'Calib"
},
{
"path": "Examples/Example-SendEmail-Attachments.ps1",
"chars": 644,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n# Custom attachment built from memory\n$bytes = [System.Text.Encod"
},
{
"path": "Examples/Example-SendEmail-ConnectionPool-Advanced.ps1",
"chars": 754,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$Credential = Get-Credential\n\n$common = @{\n From = 'sender@exa"
},
{
"path": "Examples/Example-SendEmail-ConnectionPool.ps1",
"chars": 488,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n# Obtain credentials for SMTP authentication\n$Credential = Get-Cr"
},
{
"path": "Examples/Example-SendEmail-CramMd5.ps1",
"chars": 318,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$cred = Get-Credential\n\nSend-EmailMessage -From $cred.UserName -T"
},
{
"path": "Examples/Example-SendEmail-DeduplicateAttachments.ps1",
"chars": 340,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$path = Join-Path $PSScriptRoot 'duplicate.txt'\n'data' | Set-Cont"
},
{
"path": "Examples/Example-SendEmail-GmailApiProvider.ps1",
"chars": 544,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n# Acquire OAuth2 credential using Connect-OAuthGoogle\n# $cred = C"
},
{
"path": "Examples/Example-SendEmail-Graph-Headers.ps1",
"chars": 392,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$Credential = ConvertTo-GraphCredential -ClientID 'client-id' -Cl"
},
{
"path": "Examples/Example-SendEmail-Graph-Policy.ps1",
"chars": 729,
"preview": "<#\nDemonstrates throttling-safe Graph sending with retry/backoff knobs from PowerShell.\n\nSecurity note: Do not hardcode "
},
{
"path": "Examples/Example-SendEmail-Graph-SmtpFallback.ps1",
"chars": 1067,
"preview": "<#\nConfigures a global SMTP fallback factory and sends via Graph with fallback enabled.\n#>\n\n# WARNING: Do not hardcode c"
},
{
"path": "Examples/Example-SendEmail-Graph.ps1",
"chars": 1076,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$Body = EmailBody {\n EmailText -Text 'This is my text'\n Em"
},
{
"path": "Examples/Example-SendEmail-GraphCertificate.ps1",
"chars": 565,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n$ClientId = 'your-client-id'\n$TenantId = 'your-tenant-id'\n$CertPat"
},
{
"path": "Examples/Example-SendEmail-GraphDeviceCode.ps1",
"chars": 562,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$ClientId = 'Your-Application-ID'\n$TenantId = 'Your-Tenant-ID'\n$S"
},
{
"path": "Examples/Example-SendEmail-GraphWithMgRequest.ps1",
"chars": 1020,
"preview": "Import-Module .\\Mailozaurr.psd1 -Force\n#Import-Module Microsoft.Graph.Authentication -Force\n\n# this shows how to send e"
},
{
"path": "Examples/Example-SendEmail-Headers.ps1",
"chars": 260,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\nSend-EmailMessage -From 'sender@example.com' -To 'recipient@examp"
},
{
"path": "Examples/Example-SendEmail-Mailgun-Headers.ps1",
"chars": 388,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$ApiKey = 'mailgun-api-key'\n$Credential = ConvertTo-MailgunCreden"
},
{
"path": "Examples/Example-SendEmail-Mailgun.ps1",
"chars": 593,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n# Use Mailgun API\n$Key = Read-Host 'Mailgun API key' -AsSecureStr"
},
{
"path": "Examples/Example-SendEmail-OAuthGmail.ps1",
"chars": 548,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$ClientID = '939333074185'\n$ClientSecret = 'gk2ztAGU'\n\n$Credentia"
},
{
"path": "Examples/Example-SendEmail-OAuthO365.ps1",
"chars": 509,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$ClientID = '4c1197dd-53'\n$TenantID = 'ceb371f6-87'\n\n$CredentialO"
},
{
"path": "Examples/Example-SendEmail-Pgp.ps1",
"chars": 453,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$pub = Join-Path $PSScriptRoot 'PGPKeys/mimekit.gpg.pub'\n$sec = J"
},
{
"path": "Examples/Example-SendEmail-SendGrid-Headers.ps1",
"chars": 379,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$ApiKey = 'sendgrid-api-key'\n$Credential = ConvertTo-SendGridCred"
},
{
"path": "Examples/Example-SendEmail-SendGrid01.ps1",
"chars": 569,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$Key = Get-Content -Raw -Path \"C:\\Support\\Important\\SendGrid.txt"
},
{
"path": "Examples/Example-SendEmail-SendGrid02.ps1",
"chars": 717,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n# Use SendGrid Api\n$Key = Read-Host 'SendGrid API key' -AsSecure"
},
{
"path": "Examples/Example-SendEmail-SentLog.ps1",
"chars": 518,
"preview": "$path = Join-Path $PSScriptRoot 'sentlog.json'\n# The file collects all sent message records and is appended to on each s"
},
{
"path": "Examples/Example-SendEmail-Ses-Headers.ps1",
"chars": 377,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$Credential = Get-Credential -UserName 'AKIA...' -Message 'Enter "
},
{
"path": "Examples/Example-SendEmail-SignEncrypt.ps1",
"chars": 550,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$CertPath = 'C:\\Certificates\\email.pfx'\n$CertPassword = 'pfx-pas"
},
{
"path": "Examples/Example-SendEmail-TemporaryMailCrypto.ps1",
"chars": 1395,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n# Generate temporary PGP keys and keep them on disk\n$out = Join-P"
},
{
"path": "Examples/Example-SendEmail-TemporaryPgp.ps1",
"chars": 1006,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n# Create a throwaway PGP key pair using the unified cmdlet\n$keys "
},
{
"path": "Examples/Example-SendEmail-TemporarySmime.ps1",
"chars": 473,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n# Generate a temporary certificate and export it\n$pfx = Join-Path"
},
{
"path": "Examples/Example-SendEmail-VerifyAttachment.ps1",
"chars": 312,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$missing = \"$PSScriptRoot\\missing-file.txt\"\n\nSend-EmailMessage -F"
},
{
"path": "Examples/Example-SendEmailPendingMessage-ScheduleAndNotify.ps1",
"chars": 2415,
"preview": "$pending = Join-Path $PSScriptRoot 'pending'\n$adminRecipient = 'admin@example.com'\n$notificationSender = 'mailer@example"
},
{
"path": "Examples/Example-SendEmailPendingMessage-Scheduled.ps1",
"chars": 773,
"preview": "$pending = Join-Path $PSScriptRoot 'pending'\n\n# Run once to flush all messages that are due right now.\nSend-EmailPending"
},
{
"path": "Examples/Example-SetGraphMessage.ps1",
"chars": 1768,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$ClientId = 'your-client-id'\n$ClientSecret = 'your-client-secret'"
},
{
"path": "Examples/Example-SetImapFolder.ps1",
"chars": 992,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$cred = Get-Credential\n$client = Connect-IMAP -Server 'imap.examp"
},
{
"path": "Examples/Example-SetImapMessage.ps1",
"chars": 1308,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$cred = Get-Credential\n$client = Connect-IMAP -Server 'imap.examp"
},
{
"path": "Examples/Example-SetPop3Message.ps1",
"chars": 1261,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$cred = Get-Credential\n$client = Connect-POP3 -Server 'pop.exampl"
},
{
"path": "Examples/Example-SmtpConnectionPoolMetrics.ps1",
"chars": 805,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n# Display pool size changes using a helper cmdlet\n$watcher = Watc"
},
{
"path": "Examples/Example-TestSmtpConnection.ps1",
"chars": 599,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n# Examine server capabilities and check if connections stay open\n"
},
{
"path": "Examples/Example-ValidateEmail.ps1",
"chars": 604,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\nWrite-Color -Text \"Testing via parameter\" -Color Green\n\nTest-Emai"
},
{
"path": "Examples/Example-WaitGraphMessage.ps1",
"chars": 527,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$cred = Get-Credential\n$graph = Connect-EmailGraph -Credential $c"
},
{
"path": "Examples/Example-WaitImapMessage.ps1",
"chars": 516,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$credential = Get-Credential\n$client = Connect-IMAP -Server 'imap"
},
{
"path": "Examples/Example-WaitImapMessageSearchQuery.ps1",
"chars": 502,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$credential = Get-Credential\n$client = Connect-IMAP -Server 'imap"
},
{
"path": "Examples/Example-WaitPop3Message.ps1",
"chars": 503,
"preview": "Import-Module $PSScriptRoot\\..\\Mailozaurr.psd1 -Force\n\n$cred = Get-Credential\n$client = Connect-POP3 -Server 'pop.exampl"
},
{
"path": "Examples/GraphRules/Example-GetInboxRules.ps1",
"chars": 635,
"preview": "Import-Module $PSScriptRoot\\..\\..\\Mailozaurr.psd1 -Force\n\n$ClientId = 'your-client-id'\n$ClientSecret = 'your-client-secr"
},
{
"path": "Examples/GraphRules/Example-NewInboxRule.ps1",
"chars": 783,
"preview": "Import-Module $PSScriptRoot\\..\\..\\Mailozaurr.psd1 -Force\n\n$ClientId = 'your-client-id'\n$ClientSecret = 'your-client-secr"
},
{
"path": "Examples/GraphRules/Example-RemoveInboxRule.ps1",
"chars": 603,
"preview": "Import-Module $PSScriptRoot\\..\\..\\Mailozaurr.psd1 -Force\n\n$ClientId = 'your-client-id'\n$ClientSecret = 'your-client-secr"
},
{
"path": "Examples/GraphRules/Example-RuleBuilder.ps1",
"chars": 1197,
"preview": "Import-Module $PSScriptRoot\\..\\..\\Mailozaurr.psd1 -Force\n\n$ClientId = 'your-client-id'\n$ClientSecret = 'your-client-secr"
},
{
"path": "Examples/GraphRules/Example-SetInboxRule.ps1",
"chars": 594,
"preview": "Import-Module $PSScriptRoot\\..\\..\\Mailozaurr.psd1 -Force\n\n$cred = Get-Credential\n$graph = Connect-EmailGraph -Credential"
},
{
"path": "Examples/PGPKeys/mimekit.gpg.pub",
"chars": 1724,
"preview": "-----BEGIN PGP PUBLIC KEY BLOCK-----\nVersion: GnuPG v1.4.14 (Darwin)\n\nmQENBFJ2lrsBCADGGY9BKBt+8AuCpso1XJBxihBPyQ03WdzAO3"
},
{
"path": "Examples/PGPKeys/mimekit.gpg.sec",
"chars": 3591,
"preview": "-----BEGIN PGP PRIVATE KEY BLOCK-----\nVersion: GnuPG v1.4.14 (Darwin)\n\nlQO+BFJ2lrsBCADGGY9BKBt+8AuCpso1XJBxihBPyQ03WdzAO"
},
{
"path": "LICENSE",
"chars": 1081,
"preview": "MIT License\n\nCopyright (c) 2024 Przemysław Kłys @ Evotec\n\nPermission is hereby granted, free of charge, to any person ob"
},
{
"path": "Mailozaurr.AzurePipelines.yml",
"chars": 9990,
"preview": "trigger: none\npr: none\n\nvariables:\n buildConfiguration: 'Debug'\n dotNetVersion: '8.x'\n\nstages:\n# .NET Testing Stage - "
},
{
"path": "Mailozaurr.Tests.ps1",
"chars": 2731,
"preview": "$ModuleName = (Get-ChildItem $PSScriptRoot\\*.psd1).BaseName\n$PrimaryModule = Get-ChildItem -Path $PSScriptRoot -Filter "
},
{
"path": "Mailozaurr.psd1",
"chars": 3668,
"preview": "@{\n AliasesToExport = @()\n Author = 'Przemyslaw Klys'\n CmdletsToExport = @('Add-GraphM"
},
{
"path": "Mailozaurr.psm1",
"chars": 6760,
"preview": "# to speed up development you can opt into direct build output instead of the Lib folder\n$Development = @('1', 'true', '"
},
{
"path": "README.MD",
"chars": 31238,
"preview": "# Mailozaurr - Modern Email Toolkit for .NET and PowerShell\n\nMailozaurr is available as a NuGet package and as a PowerSh"
},
{
"path": "Sources/Mailozaurr/AmazonSES/SesClient.cs",
"chars": 17483,
"preview": "using System.Net.Http;\nusing System.Security.Cryptography;\nusing System.Text;\nusing System.Text.Json;\nusing Mailozaurr.D"
},
{
"path": "Sources/Mailozaurr/Attachment.cs",
"chars": 703,
"preview": "namespace Mailozaurr;\n\n/// <summary>\n/// Represents a file attachment from Microsoft Graph.\n/// </summary>\n/// <remarks>"
},
{
"path": "Sources/Mailozaurr/Authentication/LoginState.cs",
"chars": 102,
"preview": "namespace Mailozaurr {\n\n internal enum LoginState {\n\n Initial,\n\n Challenge\n\n }\n\n}\n"
},
{
"path": "Sources/Mailozaurr/Authentication/OAuthCredentialCacheEntry.cs",
"chars": 3703,
"preview": "using System;\n\nnamespace Mailozaurr;\n\n#pragma warning disable CS1591\npublic sealed class OAuthCredentialCacheEntry {\n "
},
{
"path": "Sources/Mailozaurr/Authentication/OAuthHelpers.cs",
"chars": 22243,
"preview": "using Microsoft.Identity.Client;\nusing Google.Apis.Auth.OAuth2;\nusing Google.Apis.Auth.OAuth2.Flows;\nusing Google.Apis.U"
},
{
"path": "Sources/Mailozaurr/Authentication/OAuthTokenCache.cs",
"chars": 9215,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Text.Json;\nusing System.Threading;\nusing S"
},
{
"path": "Sources/Mailozaurr/Authentication/SaslMechanismNtlmIntegrated.cs",
"chars": 3085,
"preview": "using NSspi;\nusing NSspi.Contexts;\nusing NSspi.Credentials;\nusing System;\n\nnamespace Mailozaurr {\n /// <summary>\n "
},
{
"path": "Sources/Mailozaurr/Authentication/TokenCacheHelper.cs",
"chars": 5095,
"preview": "using System;\nusing System.IO;\nusing System.Threading;\nusing Microsoft.Identity.Client;\n\nnamespace Mailozaurr;\n\n/// <sum"
},
{
"path": "Sources/Mailozaurr/Compatibility/IsExternalInit.cs",
"chars": 284,
"preview": "// Required to support `init` setters / `record` types when targeting older TFMs.\n// This shim is compiled only for TFMs"
},
{
"path": "Sources/Mailozaurr/Compatibility/StringCompatibilityExtensions.cs",
"chars": 250,
"preview": "using System;\n\nnamespace Mailozaurr;\n\ninternal static class StringCompatibilityExtensions {\n internal static bool Con"
},
{
"path": "Sources/Mailozaurr/ComposeProfileUtilities.cs",
"chars": 5720,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace Mailozaurr;\n\n/// <summary>\n/// Helper meth"
},
{
"path": "Sources/Mailozaurr/Connections/ConnectionRetrier.cs",
"chars": 4506,
"preview": "using MailKit;\nusing MailKit.Security;\nusing System;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace Ma"
},
{
"path": "Sources/Mailozaurr/Connections/ImapConnectionRequest.cs",
"chars": 4088,
"preview": "using MailKit.Security;\nusing System;\n\nnamespace Mailozaurr;\n\n/// <summary>\n/// Represents connection settings used by <"
},
{
"path": "Sources/Mailozaurr/Connections/ImapConnector.cs",
"chars": 4892,
"preview": "using MailKit.Net.Imap;\nusing MailKit.Security;\nusing System;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnam"
},
{
"path": "Sources/Mailozaurr/Connections/ImapSessionService.cs",
"chars": 1920,
"preview": "using System;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing MailKit.Net.Imap;\n\nnamespace Mailozaurr;\n\n/// "
},
{
"path": "Sources/Mailozaurr/Connections/Pop3Connector.cs",
"chars": 2747,
"preview": "using MailKit.Net.Pop3;\nusing MailKit.Security;\nusing System;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnam"
},
{
"path": "Sources/Mailozaurr/Connections/ProtocolAuth.cs",
"chars": 4482,
"preview": "using System;\nusing System.Net;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing MailKit.Net.Imap;\nusing Mail"
},
{
"path": "Sources/Mailozaurr/Connections/SmtpSessionService.cs",
"chars": 5754,
"preview": "using System;\nusing System.Net;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing MailKit.Security;\n\nnamespace"
},
{
"path": "Sources/Mailozaurr/Cryptography/AesCredentialProtector.cs",
"chars": 7404,
"preview": "using System;\nusing System.IO;\nusing System.Security.Cryptography;\nusing System.Text;\nusing System.Threading;\n\nnamespace"
},
{
"path": "Sources/Mailozaurr/Cryptography/CredentialProtection.cs",
"chars": 3120,
"preview": "using System;\nusing System.Runtime.InteropServices;\nusing System.Security.Cryptography;\nusing System.Text;\n\nnamespace Ma"
},
{
"path": "Sources/Mailozaurr/Cryptography/CredentialProtectionPaths.cs",
"chars": 1267,
"preview": "using System;\nusing System.IO;\n\nnamespace Mailozaurr;\n\ninternal static class CredentialProtectionPaths {\n private con"
},
{
"path": "Sources/Mailozaurr/Cryptography/EphemeralOpenPgpContext.cs",
"chars": 2770,
"preview": "using System;\nusing System.IO;\nusing Org.BouncyCastle.Bcpg.OpenPgp;\nusing MimeKit.Cryptography;\n\nnamespace Mailozaurr;\n\n"
},
{
"path": "Sources/Mailozaurr/Cryptography/ICredentialProtector.cs",
"chars": 797,
"preview": "using System;\n\nnamespace Mailozaurr;\n\n/// <summary>\n/// Provides symmetric protection for sensitive credential material."
},
{
"path": "Sources/Mailozaurr/Cryptography/TemporaryPgpKeyPair.cs",
"chars": 7005,
"preview": "using System;\nusing System.IO;\nusing System.Linq;\nusing Org.BouncyCastle.Bcpg;\nusing Org.BouncyCastle.Bcpg.OpenPgp;\nusin"
},
{
"path": "Sources/Mailozaurr/Cryptography/TemporarySmimeCertificate.cs",
"chars": 8713,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Security.Cryptography;\nusing System.Security.Cryptography.X"
},
{
"path": "Sources/Mailozaurr/Cryptography/WindowsCredentialProtector.cs",
"chars": 965,
"preview": "using System;\nusing System.Security.Cryptography;\nusing System.Text;\n\nnamespace Mailozaurr;\n\ninternal sealed class Windo"
},
{
"path": "Sources/Mailozaurr/Definitions/AttachmentDescriptor.cs",
"chars": 11110,
"preview": "namespace Mailozaurr.Definitions;\n\nusing MimeKit;\nusing MimeKit.Utils;\n\n/// <summary>\n/// Base descriptor describing an "
},
{
"path": "Sources/Mailozaurr/Definitions/MailComposeProfile.cs",
"chars": 973,
"preview": "namespace Mailozaurr;\n\n/// <summary>\n/// Represents a reusable compose identity/profile.\n/// </summary>\npublic sealed cl"
},
{
"path": "Sources/Mailozaurr/Definitions/OAuthCredential.cs",
"chars": 1471,
"preview": "namespace Mailozaurr;\n\n/// <summary>\n/// Represents OAuth credentials.\n/// </summary>\n/// <remarks>\n/// This structure "
},
{
"path": "Sources/Mailozaurr/Definitions/ValidatedEmail.cs",
"chars": 1652,
"preview": "using EmailValidation;\n\nnamespace Mailozaurr;\n\n/// <summary>\n/// Wraps an email address that has been validated for cor"
},
{
"path": "Sources/Mailozaurr/DmarcReports/DmarcReport.cs",
"chars": 640,
"preview": "namespace Mailozaurr.DmarcReports;\n\n/// <summary>\n/// Represents a DMARC aggregate report extracted from a message.\n/// "
},
{
"path": "Sources/Mailozaurr/DmarcReports/DmarcReportAttachment.cs",
"chars": 852,
"preview": "namespace Mailozaurr.DmarcReports;\n\n/// <summary>\n/// Represents a zipped XML attachment belonging to a DMARC report.\n//"
},
{
"path": "Sources/Mailozaurr/DmarcReports/DmarcReportServiceBase.cs",
"chars": 1262,
"preview": "using System.Collections.Generic;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace Mailozaurr.DmarcRepor"
},
{
"path": "Sources/Mailozaurr/DmarcReports/GmailDmarcReportService.cs",
"chars": 1138,
"preview": "using System.Collections.Generic;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace Mailozaurr.DmarcRepor"
},
{
"path": "Sources/Mailozaurr/DmarcReports/GraphDmarcReportService.cs",
"chars": 1250,
"preview": "using System.Collections.Generic;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace Mailozaurr.DmarcRepor"
},
{
"path": "Sources/Mailozaurr/DmarcReports/ImapDmarcReportService.cs",
"chars": 1186,
"preview": "using System.Collections.Generic;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing MailKit.Net.Imap;\n\nnamespa"
},
{
"path": "Sources/Mailozaurr/DmarcReports/Pop3DmarcReportService.cs",
"chars": 1002,
"preview": "using System.Collections.Generic;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing MailKit.Net.Pop3;\n\nnamespa"
},
{
"path": "Sources/Mailozaurr/EmailGraphMessage.cs",
"chars": 1081,
"preview": "namespace Mailozaurr;\n\n/// <summary>\n/// Simplified representation of an email message returned from Graph.\n/// </summar"
},
{
"path": "Sources/Mailozaurr/Enums/ActionPreference.cs",
"chars": 826,
"preview": "namespace Mailozaurr;\n\n/// <summary>\n/// Specifies how the client should react when an error occurs.\n/// </summary>\n/// "
},
{
"path": "Sources/Mailozaurr/Enums/AuthenticationMechanism.cs",
"chars": 578,
"preview": "namespace Mailozaurr;\n\n/// <summary>\n/// Supported SASL authentication mechanisms.\n/// </summary>\n/// <remarks>\n/// Val"
},
{
"path": "Sources/Mailozaurr/Enums/DeliveryNotification.cs",
"chars": 757,
"preview": "namespace Mailozaurr;\n\n/// <summary>\n/// Delivery status notification options.\n/// </summary>\n/// <remarks>\n/// These v"
},
{
"path": "Sources/Mailozaurr/Enums/EmailAction.cs",
"chars": 1498,
"preview": "namespace Mailozaurr;\n\n/// <summary>\n/// Represents actions performed when sending or preparing an email.\n/// </summary"
},
{
"path": "Sources/Mailozaurr/Enums/EmailActionEncryption.cs",
"chars": 1153,
"preview": "namespace Mailozaurr;\n\n/// <summary>\n/// Specifies encryption or signing actions for S/MIME operations.\n/// </summary>\n"
},
{
"path": "Sources/Mailozaurr/Enums/EmailEncryption.cs",
"chars": 676,
"preview": "namespace Mailozaurr;\n\n/// <summary>\n/// Indicates the encryption or signing format of an email message.\n/// </summary>\n"
},
{
"path": "Sources/Mailozaurr/Enums/EmailProvider.cs",
"chars": 965,
"preview": "namespace Mailozaurr;\n/// <summary>\n/// Supported external email providers.\n/// </summary>\n/// <remarks>\n/// These valu"
},
{
"path": "Sources/Mailozaurr/Enums/GraphEndpoint.cs",
"chars": 396,
"preview": "namespace Mailozaurr;\n\n/// <summary>\n/// Known Microsoft Graph API endpoints.\n/// </summary>\n/// <remarks>\n/// These val"
},
{
"path": "Sources/Mailozaurr/Enums/GraphImportance.cs",
"chars": 314,
"preview": "namespace Mailozaurr;\n\n/// <summary>\n/// Specifies the importance level of a Microsoft Graph message.\n/// </summary>\npub"
},
{
"path": "Sources/Mailozaurr/Enums/GraphMailboxRole.cs",
"chars": 531,
"preview": "namespace Mailozaurr;\n\n/// <summary>\n/// Specifies roles available for mailbox permissions.\n/// </summary>\n/// <remarks>"
}
]
// ... and 782 more files (download for full content)
About this extraction
This page contains the full source code of the EvotecIT/Mailozaurr GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 982 files (4.1 MB), approximately 1.1M tokens, and a symbol index with 4934 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.