Codeunit 8900 "Email Impl"
System Application · System.Email
Across versions
- BC23present
- BC243 procedures added
- BC2514 procedures added, 1 procedures removed
- BC262 procedures added
- BC273 procedures added, 1 procedures changed
- BC285 procedures added, 1 procedures changed
- BC29-30unchanged
Neighbourhood 21 connected objects and pages
System Application · System.Email · BC23-30 · source at ea08af5e · facts from BC29
Properties
| Property | Value |
|---|---|
| Access | Internal |
| Permissions | tabledata “Sent Email” = rimd, tabledata “Email Outbox” = rimd, tabledata “Email Inbox” = rid, tabledata “Email Related Record” = rid, tabledata “Email Message” = r, tabledata “Email Error” = r, tabledata “Email Recipient” = r, tabledata “Email View Policy” = r, tabledata “Email Retry” = r |
Event subscriptions
- EmitSetupTelemetry subscribes to Table “Email View Policy” OnAfterInsertEvent
Procedures
SaveAsDraft(EmailMessage: Codeunit "Email Message")SaveAsDraft(EmailMessage: Codeunit "Email Message"; var EmailOutbox: Record "Email Outbox")SaveAsDraft(EmailMessage: Codeunit "Email Message"; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"; var EmailOutbox: Record "Email Outbox")Enqueue(EmailMessage: Codeunit "Email Message"; EmailScenario: Enum "Email Scenario"; NotBefore: DateTime)Enqueue(EmailMessage: Codeunit "Email Message"; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"; NotBefore: DateTime)Send(EmailMessage: Codeunit "Email Message"; EmailScenario: Enum "Email Scenario"): BooleanSend(EmailMessage: Codeunit "Email Message"; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"): BooleanSend(EmailMessage: Codeunit "Email Message"; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"; var EmailOutbox: Record "Email Outbox"): BooleanReply(EmailMessage: Codeunit "Email Message"; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"): Boolean+ BC25 + BC25 + BC25ReplyAll(EmailMessage: Codeunit "Email Message"; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"): Boolean+ BC25 + BC25Reply(EmailMessage: Codeunit "Email Message"; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"; var EmailOutbox: Record "Email Outbox")+ BC25 + BC25 + BC25ReplyAll(EmailMessage: Codeunit "Email Message"; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"; var EmailOutbox: Record "Email Outbox")+ BC25 + BC25Reply(EmailMessage: Codeunit "Email Message"; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"; var EmailOutbox: Record "Email Outbox"; NotBefore: DateTime; InBackground: Boolean; ReplyToAll: Boolean): Boolean+ BC25 + BC25 + BC25RetrieveEmails(EmailAccountId: Guid; Connector: Enum "Email Connector"; var EmailInbox: Record "Email Inbox")+ BC25 + BC25RetrieveEmails(EmailAccountId: Guid; Connector: Enum "Email Connector"; var EmailInbox: Record "Email Inbox"; var Filters: Record "Email Retrieval Filters" temporary)+ BC25 + BC25FindRetrievedEmail(EmailAccountId: Guid; ExternalMessageId: Text; var EmailInbox: Record "Email Inbox"): Boolean+ BC28GetMailFolders(EmailAccountId: Guid; Connector: Enum "Email Connector"; var EmailFolders: Record "Email Folders" temporary)+ BC27GetEmailCategories(EmailAccountId: Guid; Connector: Enum "Email Connector"; var EmailCategories: Record "Email Categories" temporary)+ BC28CreateEmailCategory(EmailAccountId: Guid; Connector: Enum "Email Connector"; CategoryDisplayName: Text; CategoryColor: Text): Text+ BC28ApplyEmailCategory(EmailAccountId: Guid; Connector: Enum "Email Connector"; ExternalId: Text; Categories: List of [Text])+ BC28MarkAsRead(EmailAccountId: Guid; Connector: Enum "Email Connector"; ExternalId: Text)+ BC25CheckReplySupported(Connector: Enum "Email Connector"): Boolean+ BC25CheckAndGetEmailConnectorv2(Connector: Interface "Email Connector"; var Connectorv2: Interface "Email Connector v2"): Boolean+ BC25 (obsolete 26.0: Replaced by CheckAndGetEmailConnectorv3.)CheckAndGetEmailConnectorv3(Connector: Interface "Email Connector"; var Connectorv3: Interface "Email Connector v3"): Boolean+ BC25 Δ BC27 (obsolete 28.0: Replaced by CheckAndGetEmailConnectorv4.)CheckAndGetEmailConnectorv4(Connector: Interface "Email Connector"; var Connectorv4: Interface "Email Connector v4"): Boolean+ BC27 Δ BC28CheckAndGetEmailConnectorv5(Connector: Interface "Email Connector"; var Connectorv5: Interface "Email Connector v5"): Boolean+ BC28OpenInEditor(EmailMessage: Codeunit "Email Message"; EmailScenario: Enum "Email Scenario"; IsModal: Boolean): Enum "Email Action"OpenInEditor(EmailMessage: Codeunit "Email Message"; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"; IsModal: Boolean): Enum "Email Action"OpenInEditorWithScenario(EmailMessage: Codeunit "Email Message"; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"; IsModal: Boolean; Scenario: Enum "Email Scenario"): Enum "Email Action"AddDefaultAttachments(EmailMessage: Codeunit "Email Message"; EmailScenario: Enum "Email Scenario")FindLastErrorCallStack(EmailOutboxId: BigInteger): TextFindErrorCallStackWithMsgIDAndRetryNo(MessageId: Guid; RetryNo: Integer): Text+ BC26ShowSourceRecord(EmailMessageId: Guid)HasRetryDetail(EmailMessageId: Guid): Boolean+ BC26HasSourceRecord(EmailMessageId: Guid): BooleanFilterRemovedSourceRecords(var EmailRelatedRecord: Record "Email Related Record")GetSentEmailsForRecord(RecordVariant: Variant; var ResultSentEmails: Record "Sent Email" temporary)GetSentEmailsForRecord(TableId: Integer; SystemId: Guid; var ResultSentEmails: Record "Sent Email" temporary)GetSentEmails(AccountId: Guid; NewerThan: DateTime; var SentEmails: Record "Sent Email" temporary)GetSentEmails(AccountId: Guid; NewerThan: DateTime; SourceTableID: Integer; SourceSystemID: Guid; var SentEmails: Record "Sent Email" temporary)RefreshEmailOutboxForUser(EmailAccountId: Guid; EmailStatus: Enum "Email Status"; var EmailOutboxForUser: Record "Email Outbox" temporary)GetOutboxEmails(AccountId: Guid; EmailStatus: Enum "Email Status"; var EmailOutboxForUser: Record "Email Outbox" temporary)GetOutboxEmails(AccountId: Guid; EmailStatus: Enum "Email Status"; SourceTableID: Integer; SourceSystemID: Guid; var EmailOutboxForUser: Record "Email Outbox" temporary)GetEmailOutboxForRecord(RecordVariant: Variant; var ResultEmailOutbox: Record "Email Outbox" temporary)GetEmailOutboxForRecord(TableId: Integer; SystemId: Guid; var ResultEmailOutbox: Record "Email Outbox" temporary)GetOutboxEmailRecordStatus(MessageId: Guid): Enum "Email Status"GetUserEmailViewPolicy(): Enum "Email View Policy"(internal)CountEmailsInOutbox(EmailStatus: Enum "Email Status"; IsAdmin: Boolean): Integer(internal)CountSentEmails(NewerThan: DateTime; IsAdmin: Boolean): Integer(internal)AddRelation(EmailMessage: Codeunit "Email Message"; TableId: Integer; SystemId: Guid; RelationType: Enum "Email Relation Type"; Origin: Enum "Email Relation Origin")AddRelation(EmailMessageId: Guid; TableId: Integer; SystemId: Guid; RelationType: Enum "Email Relation Type"; Origin: Enum "Email Relation Origin")RemoveRelation(EmailMessage: Codeunit "Email Message"; TableId: Integer; SystemId: Guid): BooleanOpenSentEmails(RecordVariant: Variant)+ BC24OpenSentEmails(TableId: Integer; SystemId: Guid)+ BC24OpenSentEmails(TableId: Integer; SystemId: Guid; NewerThanDate: DateTime)+ BC24GetEmailOutboxSentEmailWithinRateLimit(var SentEmail: Record "Sent Email"; var EmailOutbox: Record "Email Outbox"; AccountId: Guid): DurationGetRecordRef(RecRelatedVariant: Variant; var ResultRecordRef: RecordRef): Boolean(internal)ShowAdminViewPolicyInEffectNotification()+ BC24OpenEmailViewPoliciesPage(AdminViewPolicyInEffectNotification: Notification)+ BC24UpdateFailedEmailOutboxStatusToError(): Integer+ BC27 (internal)
Plus 12 local procedures.
Calls
From the extracted call graph of BC29 (graphify-al on the snapshot checkout): calls whose target is known from a declared type or an Object::"Name" argument. Interface dispatch and calls through events are not counted, so the list is not complete.
- Codeunit 8904 “Email Message” (9 calls:
AddRelation → GetId,BeforeReplyEmail → Get,BeforeReplyEmail → GetId, …) - Codeunit 8901 “Email” (6 calls:
AddRelation → OnAfterAddRelation,BeforeReplyEmail → OnBeforeReplyEmail,BeforeSendEmail → OnBeforeSendEmail, …) - Codeunit 8711 “Telemetry” (4 calls:
BeforeReplyEmail → LogMessage,BeforeSendEmail → LogMessage,GetUserEmailViewPolicy → LogMessage, …) - Codeunit 8905 “Email Message Impl.” (4 calls:
OpenInEditorWithScenario → Get,OpenInEditorWithScenario → GetId,OpenInEditorWithScenario → GetSubject, …) - Codeunit 8703 “Feature Telemetry” (3 calls:
EmitSetupTelemetry → LogUptake,EmitUsedTelemetry → LogUptake,EmitUsedTelemetry → LogUsage) - Codeunit 8893 “Email Scenario” (3 calls:
Enqueue → GetEmailAccount,OpenInEditor → GetEmailAccount,Send → GetEmailAccount) - Codeunit 8902 “Email Scenario Attach Impl.” (2 calls:
AddDefaultAttachments → AddAttachmentToMessage,OpenInEditorWithScenario → AddAttachmentToMessage) - Codeunit 8906 “Email Editor” (2 calls:
OpenInEditorWithScenario → OpenWithScenario,OpenInEditorWithScenario → SetAsNew) - Codeunit 43 “Language” (1 call:
GetTelemetryDimensions → GetDefaultApplicationLanguageId) - Codeunit 8889 “Email Account Impl.” (1 call:
ShowAdminViewPolicyInEffectNotification → IsUserEmailAdmin) - Codeunit 8894 “Email Account” (1 call:
GetEmailAccount → GetAllAccounts) - Page 8930 “Email View Policy List” (1 call:
OpenEmailViewPoliciesPage → (object))
Called by
- Codeunit 8901 “Email” (25 calls:
AddDefaultAttachments → AddDefaultAttachments,AddRelation → AddRelation,ApplyEmailCategory → ApplyEmailCategory, …) - Page 8882 “Email Outbox” (4 calls:
LoadEmailOutboxForUser → GetOutboxEmails,LoadEmailOutboxForUser → ShowAdminViewPolicyInEffectNotification,OnAfterGetCurrRecord → HasSourceRecord, …) - Page 8883 “Sent Emails” (3 calls:
OnAfterGetCurrRecord → HasSourceRecord,OnOpenPage → GetSentEmails,OnOpenPage → ShowAdminViewPolicyInEffectNotification) - Codeunit 8885 “Email Activities” (2 calls:
OnRun → CountEmailsInOutbox,OnRun → CountSentEmails) - Codeunit 8890 “Send Email” (2 calls:
OnRun → (object),OnRun → CheckAndGetEmailConnectorv4) - Codeunit 8906 “Email Editor” (2 calls:
CheckPermissions → GetUserEmailViewPolicy,SendOutbox → Send) - Codeunit 8907 “Email Viewer” (2 calls:
CheckPermissions → GetUserEmailViewPolicy,RefreshSentMailForUser → GetSentEmails) - Page 13 “Email Editor” (2 calls:
LookupRecipients → HasSourceRecord,OnAfterGetRecord → HasSourceRecord) - Codeunit 8905 “Email Message Impl.” (1 call:
Create → AddRelation) - Codeunit 8999 “Email Rate Limit Impl.” (1 call:
IsRateLimitExceeded → GetEmailOutboxSentEmailWithinRateLimit) - Page 12 “Email Viewer” (1 call:
OnAfterGetRecord → HasSourceRecord) - Page 8888 “Sent Emails List Part” (1 call:
Load → GetSentEmails)
Recent changes
- 2026-09-21 #11612 Multiple runs of email retrieval on the same emails don’t persist again (main, BC30, fix)
- 2026-07-20 #8771 Add OnBeforeFilterRemovedSourceRecords integration event in Email Impl (main, BC30, feature)
Deprecations
- procedure CheckAndGetEmailConnectorv2: Pending 26.0 (#if not CLEAN26), “Replaced by CheckAndGetEmailConnectorv3.”
- procedure CheckAndGetEmailConnectorv3: Pending 28.0 (#if not CLEAN28), “Replaced by CheckAndGetEmailConnectorv4.”
Source: AL metadata extracted from the code (names, ids, signatures, properties); no code bodies (D10).
Ask your agent
Procedure bodies are not stored here (D10). The call sections above are our own, per object, from the BC29 call graph. For a procedure body or the calls of one procedure, ask bc-code-atlas (external, by Stefan Maron, MIT; default corpus w1-28), which the bc-observatory plugin connects: bcatlas_resolve_node(object_type: "codeunit", object_name: "Email Impl"), then bcatlas_get_procedure_body or bcatlas_get_neighbors on the returned id.