๐ง Recipe ยท Exchange & Email
Create a Distribution List and Configure Shared Mailbox Forwarding
Provision a mail-enabled distribution list with external members and forward a shared mailbox (and its aliases) to it
Complexity
Intermediate
Impact
mail-flow + exchange-online + distribution-group + shared-mailbox + forwarding
Context
Why This Matters
A common Exchange Online pattern is to route inbound mail from a public-facing address (e.g. info@company.com) to a small team rather than a single person. The clean way to do this is:
- Create a mail-enabled distribution list (DL) that contains the recipients.
- Ensure any non-tenant members exist as Mail Contacts (DLs cannot contain raw external addresses โ they need directory objects).
- Configure the DL to accept mail from external senders.
- Set mailbox forwarding on the shared mailbox so every message (including those delivered to its SMTP aliases, such as
dex@company.com) is redirected to the DL.
Run this recipe when you are standing up a new shared inbox, reorganising who owns an existing one, or consolidating multiple aliases behind a single team-routing address.
Important platform note: Microsoft Graph cannot create classic distribution lists, cannot create Exchange mail contacts, and in most tenants cannot modify a mailbox's forwarding SMTP address. These are Exchange Online objects owned by the Exchange service. The authoritative tooling is Exchange Online PowerShell or the Exchange Admin Center. Graph is only useful here for preflight lookups (confirming users, aliases, and existing groups).
Expected Outcomes
After completing this recipe you will have:
- A mail-enabled distribution list
{dl_address}visible in the Exchange Admin Center and GAL. - All required members (internal users and/or external mail contacts) added to the DL.
- The DL configured to accept mail from senders outside the organization.
- The source shared mailbox
{source_mailbox}forwarding all inbound mail to the DL, with or without keeping a local copy. - Verified that mail sent to any SMTP alias of the shared mailbox (e.g.
{alias_address}) also flows to DL members, because aliases are accepted addresses on the same mailbox and follow the same forwarding rule.
Risks & Considerations
Warnings and gotchas
- Graph API limitation:
POST /v1.0/groupswithmailEnabled:trueandsecurityEnabled:falsereturnsRequest_BadRequestโ Graph does not author distribution lists. Do not loop on this; switch to Exchange Online PowerShell. - External members must be Mail Contacts. A distribution list cannot store a bare external SMTP address; you must first create a
MailContactwithNew-MailContact, then add it withAdd-DistributionGroupMember. - Anti-auto-forwarding policy: Many tenants have an outbound anti-spam policy that blocks auto-forwarding to external recipients. If the DL contains external contacts and the shared mailbox forwards to it, recipients may silently stop getting mail. Review Anti-spam outbound policy โ Automatic forwarding rules before going live.
- External senders to the DL: Setting
RequireSenderAuthenticationEnabled $falseallows anyone on the internet to mail the list. This is usually desired forinfo@-style addresses but increases spam exposure โ keep the DL protected by your normal inbound mail hygiene. - Keep a copy? Decide whether the shared mailbox should also retain a local copy (
DeliverToMailboxAndForward $true) for auditing/compliance, or forward only ($false). Forwarding-only means no archive in the source mailbox. - Graph mailbox forwarding is restricted. Even with
MailboxSettings.ReadWrite, settingForwardingSmtpAddressvia Graph is blocked in most tenants for anti-exfiltration reasons. UseSet-Mailboxin Exchange Online PowerShell. - Licensing: The source shared mailbox under 50 GB does not require a license, but must not be converted to a regular mailbox during this work.
Required Permissions
| Permission | Why It's Needed |
|---|---|
| Exchange Administrator (or Recipient Administrator) role | Required to create distribution groups, mail contacts, and modify mailbox forwarding in Exchange Online. |
| User.Read.All (Graph) | Preflight lookups to confirm the source mailbox exists and to enumerate its proxyAddresses (aliases). |
| Group.Read.All (Graph) | Preflight check that the target DL mailNickname/SMTP is not already in use. |
| ExchangeOnlineManagement PowerShell module | All write operations (New-DistributionGroup, New-MailContact, Set-Mailbox) are performed against Exchange Online, not Graph. |
The fastest way to get this done: just ask Dex. Copy the prompt below and paste it into your Dex conversation.
For IT Admins
Paste into Dex Pro
For End Users
How an employee would ask Dex for help
Using the Exchange Admin Center (EAC)
Navigation:
Step 1 โ Create mail contacts for any external members
- Go to .
- Click Add a mail contact.
- Enter display name, alias, and external email address (e.g.
person@partner.com). - Save. Repeat for every external member of the DL.
Step 2 โ Create the distribution list
- Go to .
- Click Add a group and choose Distribution.
- Name: e.g.
Marketing Notifications. Alias:{dl_alias}. Primary SMTP:{dl_address}. - Assign an owner (typically an admin or team lead).
- Add members: select the internal users and the mail contacts created in Step 1.
- On the Settings page, under Communication, check Allow external senders to email this group.
- Review and Create group.
Step 3 โ Confirm external-sender setting
- Open the new group โ Settings โ Edit delivery management.
- Select Senders inside and outside of my organization. Save.
Step 4 โ Configure forwarding on the shared mailbox
- Go to and open
{source_mailbox}. - On the Mailbox tab, scroll to Manage email forwarding.
- Toggle Forward all emails sent to this mailbox ON.
- Enter the DL address
{dl_address}. - Decide whether to also keep a copy in the shared mailbox (Deliver message to both forwarding address and mailbox).
- Save.
Step 5 โ Verify alias behavior
Aliases on the shared mailbox (e.g. {alias_address}) are accepted addresses on the same mailbox object โ they do not need separate configuration. Send a test message to each alias and confirm every DL member receives it.
Graph API โ scope and limits
Graph is not the right tool to perform the write operations in this recipe. Graph can only be used for read-only preflight checks. Attempting POST /groups with mailEnabled:true, securityEnabled:false returns Request_BadRequest โ Exchange owns distribution list authoring. Mailbox ForwardingSmtpAddress is also not writable via Graph in most tenants.
Preflight 1 โ Confirm the DL does not already exist
GET https://graph.microsoft.com/v1.0/groups?$filter=mailNickname eq '{dl_alias}' or mail eq '{dl_address}'Expected: value: []. If non-empty, an object with that alias already exists โ stop and reconcile.
Preflight 2 โ Confirm the source mailbox and list its aliases
GET https://graph.microsoft.com/v1.0/users?$filter=mail eq '{source_mailbox}'&$select=id,displayName,userPrincipalName,mail,proxyAddressesLook at proxyAddresses โ every entry prefixed smtp: (lowercase) is an alias; the single SMTP: (uppercase) entry is the primary. Confirm {alias_address} is listed.
Preflight 3 โ Resolve internal member UPNs
GET https://graph.microsoft.com/v1.0/users?$filter=userPrincipalName eq '{member1_upn}' or userPrincipalName eq '{member2_upn}'&$select=id,userPrincipalName,mailWhat Graph will refuse to do
POST /groupsto create a DL โRequest_BadRequest.POST /contactsto create an Exchange mail contact โ Graph/contactsis personal contacts, not org mail contacts.PATCH /users/{id}/mailboxSettingswith aforwardingAddressproperty โ property does not exist onmailboxSettings;ForwardingSmtpAddressis an Exchange mailbox property, not a mailbox setting.
For the actual writes, use the PowerShell recipe below.
Exchange Online PowerShell โ the authoritative path
This is the recommended way to perform every step of the recipe. It works end-to-end in a single session.
1. Connect
Install-Module ExchangeOnlineManagement -Scope CurrentUser
Connect-ExchangeOnline -UserPrincipalName admin@contoso.com2. Create mail contacts for external members
New-MailContact -Name "Jane External" -ExternalEmailAddress "jane@partner.com"Repeat for each external address. Internal users do not need a contact โ reference them by UPN.
3. Create the distribution list
New-DistributionGroup `
-Name "Marketing Notifications" `
-Alias "{dl_alias}" `
-PrimarySmtpAddress "{dl_address}" `
-Type Distribution `
-MemberJoinRestriction Closed `
-MemberDepartRestriction Closed4. Allow external senders
Set-DistributionGroup -Identity "{dl_address}" `
-RequireSenderAuthenticationEnabled $false5. Add members (internal users + mail contacts)
Add-DistributionGroupMember -Identity "{dl_address}" -Member "user1@contoso.com"
Add-DistributionGroupMember -Identity "{dl_address}" -Member "jane@partner.com" # resolved via the mail contact created in step 26. Configure forwarding on the shared mailbox
Set-Mailbox -Identity "{source_mailbox}" `
-ForwardingSmtpAddress "{dl_address}" `
-DeliverToMailboxAndForward $true # $false = forward only, no local copy7. Verify
Get-DistributionGroup "{dl_address}" | Select DisplayName,PrimarySmtpAddress,RequireSenderAuthenticationEnabled
Get-DistributionGroupMember "{dl_address}"
Get-Mailbox "{source_mailbox}" | Select ForwardingSmtpAddress,DeliverToMailboxAndForward,EmailAddressesThen send a test message to both {source_mailbox} and any alias (e.g. {alias_address}) and confirm all DL members receive it.
Next steps