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!