PowerShell Commands to Export Email Addresses for All Mail-Enabled Objects in M365 Exchange Online

1. Connect to Exchange Online

# Install module if not present
Install-Module ExchangeOnlineManagement

# Connect to Exchange Online (replace with your admin UPN)
Connect-ExchangeOnline -UserPrincipalName "youradmin@domain.com"

2. Export All Mail-Enabled Recipients

Includes Users, Shared Mailboxes, Distribution Groups, Mail Contacts, Mail-Enabled Security Groups, Public Folders, etc:

Get-Recipient -ResultSize Unlimited | Select-Object DisplayName,RecipientType,PrimarySmtpAddress,@{Name="EmailAddresses";Expression={($_.EmailAddresses | Where-Object {$_ -match "^smtp:"} | ForEach-Object {$_ -replace "smtp:", ""}) -join ","}} | Export-Csv -Path "C:/Export/AllMailEnabledObjects.csv" -NoTypeInformation

3. Export User Mailbox Email Addresses

Get-Mailbox -RecipientTypeDetails UserMailbox -ResultSize Unlimited | Select-Object DisplayName,PrimarySmtpAddress,@{Name="EmailAddresses";Expression={($_.EmailAddresses | Where-Object {$_ -match "^smtp:"} | ForEach-Object {$_ -replace "smtp:", ""}) -join ","}} | Export-Csv -Path "C:/Export/UserMailboxes.csv" -NoTypeInformation

4. Export Shared Mailbox Email Addresses

Get-Mailbox -RecipientTypeDetails SharedMailbox -ResultSize Unlimited | Select-Object DisplayName,PrimarySmtpAddress,@{Name="EmailAddresses";Expression={($_.EmailAddresses | Where-Object {$_ -match "^smtp:"} | ForEach-Object {$_ -replace "smtp:", ""}) -join ","}} | Export-Csv -Path "C:/Export/SharedMailboxes.csv" -NoTypeInformation

5. Export Distribution Groups

Get-DistributionGroup -ResultSize Unlimited | Select-Object DisplayName,PrimarySmtpAddress,@{Name="EmailAddresses";Expression={($_.EmailAddresses | Where-Object {$_ -match "^smtp:"} | ForEach-Object {$_ -replace "smtp:", ""}) -join ","}} | Export-Csv -Path "C:/Export/DistributionGroups.csv" -NoTypeInformation

6. Export Mail Contacts

Get-MailContact -ResultSize Unlimited | Select-Object DisplayName,PrimarySmtpAddress,@{Name="EmailAddresses";Expression={($_.EmailAddresses | Where-Object {$_ -match "^smtp:"} | ForEach-Object {$_ -replace "smtp:", ""}) -join ","}} | Export-Csv -Path "C:/Export/MailContacts.csv" -NoTypeInformation

7. Export Mail-Enabled Security Groups

Get-Recipient -RecipientTypeDetails MailUniversalSecurityGroup -ResultSize Unlimited | Select-Object DisplayName,PrimarySmtpAddress,@{Name="EmailAddresses";Expression={($_.EmailAddresses | Where-Object {$_ -match "^smtp:"} | ForEach-Object {$_ -replace "smtp:", ""}) -join ","}} | Export-Csv -Path "C:/Export/MailSecGroups.csv" -NoTypeInformation

8. Export Public Folders (if mail-enabled)

Get-MailPublicFolder -ResultSize Unlimited | Select-Object DisplayName,PrimarySmtpAddress,@{Name="EmailAddresses";Expression={($_.EmailAddresses | Where-Object {$_ -match "^smtp:"} | ForEach-Object {$_ -replace "smtp:", ""}) -join ","}} | Export-Csv -Path "C:/Export/MailPublicFolders.csv" -NoTypeInformation


You only need to connect once—then run each command as needed.
Each file will contain display name, type, primary address, and all aliases for that class.


Let me know if you want a full one-liner that combines all types, or help with filtering/scripting for specific needs!