---
id: object/codeunit/8900
type: object
title: Codeunit 8900 "Email Impl"
summary: Codeunit 8900 "Email Impl" in System Application (System.Email). 60 public procedures, 1 event subscribers. Present since at least BC23, still in BC30, changed in BC24-28.
tier: official
language: en
tags:
  - codeunit
  - system application
versions:
  introduced: null
  last_changed: "28"
  deprecated: null
review:
  state: derived
  by: null
  at: null
  flags: []
generated:
  at: "2026-10-11T00:31:51.816Z"
  pipeline: 0.2.0
  prompts: {}
  input_hash: 312f4b7dcddff513db1cb60aa219f702aeaca7b97548a1ccd0301587ed2f44fc
evidence:
  - kind: code
    url: https://github.com/microsoft/BCApps/blob/ea08af5ef2d6a9b5c5af4a029288abbe2c883220/src/System%20Application/App/Email/src/Email/EmailImpl.Codeunit.al
    title: src/System Application/App/Email/src/Email/EmailImpl.Codeunit.al (releases/29.x)
    date: null
    commit: ea08af5ef2d6a9b5c5af4a029288abbe2c883220
    t: null
    quote: null
links:
  learn: []
  objects: []
  features: []
  topics: []
  localizations: []
  videos: []
  posts: []
  guidelines: []
  changes:
    - change/bcapps/11612
    - change/bcapps/8771
object_type: codeunit
object_id: 8900
name: Email Impl
namespace: System.Email
app: System Application
extends: null
first_version: "23"
last_version: "30"
present_in:
  - "23"
  - "24"
  - "25"
  - "26"
  - "27"
  - "28"
  - "29"
  - "30"
changed_in:
  - "24"
  - "25"
  - "26"
  - "27"
  - "28"
source_major: "29"
obsolete: null
countries: []
ms_search_form_ids: []
counts:
  fields: 0
  procedures: 73
  events: 0
  subscribers: 1
relations:
  out: 0
  referenced_by: 0
  pages: 0
  extended_by: 0
  event_subscribers: 0
  calls: 12
  called_by: 12
  implements: 0
---

# Codeunit 8900 "Email Impl"

> Codeunit 8900 "Email Impl" in System Application (System.Email). 60 public procedures, 1 event subscribers. Present since at least BC23, still in BC30, changed in BC24-28.

System Application · System.Email · BC23-30 · [source at ea08af5e](https://github.com/microsoft/BCApps/blob/ea08af5ef2d6a9b5c5af4a029288abbe2c883220/src/System%20Application/App/Email/src/Email/EmailImpl.Codeunit.al) · 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"): Boolean`
- `Send(EmailMessage: Codeunit "Email Message"; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"): Boolean`
- `Send(EmailMessage: Codeunit "Email Message"; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"; var EmailOutbox: Record "Email Outbox"): Boolean`
- `Reply(EmailMessage: Codeunit "Email Message"; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"): Boolean`
- `ReplyAll(EmailMessage: Codeunit "Email Message"; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"): Boolean`
- `Reply(EmailMessage: Codeunit "Email Message"; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"; var EmailOutbox: Record "Email Outbox")`
- `ReplyAll(EmailMessage: Codeunit "Email Message"; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"; var EmailOutbox: Record "Email Outbox")`
- `Reply(EmailMessage: Codeunit "Email Message"; EmailAccountId: Guid; EmailConnector: Enum "Email Connector"; var EmailOutbox: Record "Email Outbox"; NotBefore: DateTime; InBackground: Boolean; ReplyToAll: Boolean): Boolean`
- `RetrieveEmails(EmailAccountId: Guid; Connector: Enum "Email Connector"; var EmailInbox: Record "Email Inbox")`
- `RetrieveEmails(EmailAccountId: Guid; Connector: Enum "Email Connector"; var EmailInbox: Record "Email Inbox"; var Filters: Record "Email Retrieval Filters" temporary)`
- `FindRetrievedEmail(EmailAccountId: Guid; ExternalMessageId: Text; var EmailInbox: Record "Email Inbox"): Boolean`
- `GetMailFolders(EmailAccountId: Guid; Connector: Enum "Email Connector"; var EmailFolders: Record "Email Folders" temporary)`
- `GetEmailCategories(EmailAccountId: Guid; Connector: Enum "Email Connector"; var EmailCategories: Record "Email Categories" temporary)`
- `CreateEmailCategory(EmailAccountId: Guid; Connector: Enum "Email Connector"; CategoryDisplayName: Text; CategoryColor: Text): Text`
- `ApplyEmailCategory(EmailAccountId: Guid; Connector: Enum "Email Connector"; ExternalId: Text; Categories: List of [Text])`
- `MarkAsRead(EmailAccountId: Guid; Connector: Enum "Email Connector"; ExternalId: Text)`
- `CheckReplySupported(Connector: Enum "Email Connector"): Boolean`
- `CheckAndGetEmailConnectorv2(Connector: Interface "Email Connector"; var Connectorv2: Interface "Email Connector v2"): Boolean` (obsolete 26.0: Replaced by CheckAndGetEmailConnectorv3.)
- `CheckAndGetEmailConnectorv3(Connector: Interface "Email Connector"; var Connectorv3: Interface "Email Connector v3"): Boolean` (obsolete 28.0: Replaced by CheckAndGetEmailConnectorv4.)
- `CheckAndGetEmailConnectorv4(Connector: Interface "Email Connector"; var Connectorv4: Interface "Email Connector v4"): Boolean`
- `CheckAndGetEmailConnectorv5(Connector: Interface "Email Connector"; var Connectorv5: Interface "Email Connector v5"): Boolean`
- `OpenInEditor(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): Text`
- `FindErrorCallStackWithMsgIDAndRetryNo(MessageId: Guid; RetryNo: Integer): Text`
- `ShowSourceRecord(EmailMessageId: Guid)`
- `HasRetryDetail(EmailMessageId: Guid): Boolean`
- `HasSourceRecord(EmailMessageId: Guid): Boolean`
- `FilterRemovedSourceRecords(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): Boolean`
- `OpenSentEmails(RecordVariant: Variant)`
- `OpenSentEmails(TableId: Integer; SystemId: Guid)`
- `OpenSentEmails(TableId: Integer; SystemId: Guid; NewerThanDate: DateTime)`
- `GetEmailOutboxSentEmailWithinRateLimit(var SentEmail: Record "Sent Email"; var EmailOutbox: Record "Email Outbox"; AccountId: Guid): Duration`
- `GetRecordRef(RecRelatedVariant: Variant; var ResultRecordRef: RecordRef): Boolean` (internal)
- `ShowAdminViewPolicyInEffectNotification()`
- `OpenEmailViewPoliciesPage(AdminViewPolicyInEffectNotification: Notification)`
- `UpdateFailedEmailOutboxStatusToError(): Integer` (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"](../codeunit/8904.md) (9 calls: `AddRelation → GetId`, `BeforeReplyEmail → Get`, `BeforeReplyEmail → GetId`, …)
- [Codeunit 8901 "Email"](../codeunit/8901.md) (6 calls: `AddRelation → OnAfterAddRelation`, `BeforeReplyEmail → OnBeforeReplyEmail`, `BeforeSendEmail → OnBeforeSendEmail`, …)
- [Codeunit 8711 "Telemetry"](../codeunit/8711.md) (4 calls: `BeforeReplyEmail → LogMessage`, `BeforeSendEmail → LogMessage`, `GetUserEmailViewPolicy → LogMessage`, …)
- [Codeunit 8905 "Email Message Impl."](../codeunit/8905.md) (4 calls: `OpenInEditorWithScenario → Get`, `OpenInEditorWithScenario → GetId`, `OpenInEditorWithScenario → GetSubject`, …)
- [Codeunit 8703 "Feature Telemetry"](../codeunit/8703.md) (3 calls: `EmitSetupTelemetry → LogUptake`, `EmitUsedTelemetry → LogUptake`, `EmitUsedTelemetry → LogUsage`)
- [Codeunit 8893 "Email Scenario"](../codeunit/8893.md) (3 calls: `Enqueue → GetEmailAccount`, `OpenInEditor → GetEmailAccount`, `Send → GetEmailAccount`)
- [Codeunit 8902 "Email Scenario Attach Impl."](../codeunit/8902.md) (2 calls: `AddDefaultAttachments → AddAttachmentToMessage`, `OpenInEditorWithScenario → AddAttachmentToMessage`)
- [Codeunit 8906 "Email Editor"](../codeunit/8906.md) (2 calls: `OpenInEditorWithScenario → OpenWithScenario`, `OpenInEditorWithScenario → SetAsNew`)
- [Codeunit 43 "Language"](../codeunit/43.md) (1 call: `GetTelemetryDimensions → GetDefaultApplicationLanguageId`)
- [Codeunit 8889 "Email Account Impl."](../codeunit/8889.md) (1 call: `ShowAdminViewPolicyInEffectNotification → IsUserEmailAdmin`)
- [Codeunit 8894 "Email Account"](../codeunit/8894.md) (1 call: `GetEmailAccount → GetAllAccounts`)
- [Page 8930 "Email View Policy List"](../page/8930.md) (1 call: `OpenEmailViewPoliciesPage → (object)`)

## Called by

- [Codeunit 8901 "Email"](../codeunit/8901.md) (25 calls: `AddDefaultAttachments → AddDefaultAttachments`, `AddRelation → AddRelation`, `ApplyEmailCategory → ApplyEmailCategory`, …)
- [Page 8882 "Email Outbox"](../page/8882.md) (4 calls: `LoadEmailOutboxForUser → GetOutboxEmails`, `LoadEmailOutboxForUser → ShowAdminViewPolicyInEffectNotification`, `OnAfterGetCurrRecord → HasSourceRecord`, …)
- [Page 8883 "Sent Emails"](../page/8883.md) (3 calls: `OnAfterGetCurrRecord → HasSourceRecord`, `OnOpenPage → GetSentEmails`, `OnOpenPage → ShowAdminViewPolicyInEffectNotification`)
- [Codeunit 8885 "Email Activities"](../codeunit/8885.md) (2 calls: `OnRun → CountEmailsInOutbox`, `OnRun → CountSentEmails`)
- [Codeunit 8890 "Send Email"](../codeunit/8890.md) (2 calls: `OnRun → (object)`, `OnRun → CheckAndGetEmailConnectorv4`)
- [Codeunit 8906 "Email Editor"](../codeunit/8906.md) (2 calls: `CheckPermissions → GetUserEmailViewPolicy`, `SendOutbox → Send`)
- [Codeunit 8907 "Email Viewer"](../codeunit/8907.md) (2 calls: `CheckPermissions → GetUserEmailViewPolicy`, `RefreshSentMailForUser → GetSentEmails`)
- [Page 13 "Email Editor"](../page/13.md) (2 calls: `LookupRecipients → HasSourceRecord`, `OnAfterGetRecord → HasSourceRecord`)
- [Codeunit 8905 "Email Message Impl."](../codeunit/8905.md) (1 call: `Create → AddRelation`)
- [Codeunit 8999 "Email Rate Limit Impl."](../codeunit/8999.md) (1 call: `IsRateLimitExceeded → GetEmailOutboxSentEmailWithinRateLimit`)
- [Page 12 "Email Viewer"](../page/12.md) (1 call: `OnAfterGetRecord → HasSourceRecord`)
- [Page 8888 "Sent Emails List Part"](../page/8888.md) (1 call: `Load → GetSentEmails`)

## Recent changes

- 2026-09-21 [#11612 Multiple runs of email retrieval on the same emails don't persist again](../../changes/bcapps/11612.md) (main, BC30, fix)
- 2026-07-20 [#8771 Add OnBeforeFilterRemovedSourceRecords integration event in Email Impl](../../changes/bcapps/8771.md) (main, BC30, feature)

## Across versions

- Present in: BC23-30
- Changed (declaration) in: BC24-28

## 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.
