Exchange Online is Microsoft’s cloud messaging service offering email, calendar and contacts features.
Installation and connection
| Action | PowerShell Command |
|---|
| Install Exchange module | Install-Module -Name ExchangeOnlineManagement -Force |
| Connect | Connect-ExchangeOnline |
| Connect (MFA) | Connect-ExchangeOnline -UserPrincipalName admin@tenant.com |
| Verify connection | Get-OrganizationConfig |
| Disconnect | Disconnect-ExchangeOnline -Confirm:$false |
Mailbox management
Mailbox types
| Type | License Required | Usage |
|---|
| User | Office 365/M365 | Personal mailbox |
| Shared | None | Team, department |
| Resource - Room | Exchange Online Plan 1 | Room booking |
| Resource - Equipment | Exchange Online Plan 1 | Shared equipment |
| Action | Command |
|---|
| List all mailboxes | Get-Mailbox -ResultSize Unlimited |
| Search mailbox | Get-Mailbox -Identity "jdoe@tenant.com" |
| Create user mailbox | New-Mailbox -Name "John Doe" -UserPrincipalName "jdoe@tenant.com" -FirstName "John" -LastName "Doe" |
| Create shared mailbox | New-Mailbox -Name "Support" -PrimarySmtpAddress "support@tenant.com" -Shared |
| Create resource mailbox | New-Mailbox -Name "Meeting Room A" -Room -PrimarySmtpAddress "room-a@tenant.com" |
| Modify display name | Set-Mailbox -Identity "jdoe@tenant.com" -DisplayName "John Doe - IT" |
| Delete mailbox | Remove-Mailbox -Identity "jdoe@tenant.com" -Confirm:$false |
| Disable mailbox | Set-Mailbox -Identity "jdoe@tenant.com" -AccountDisabled:$true |
Distribution groups
Exchange group types
| Type | Characteristics | Usage |
|---|
| Distribution List (DL) | Static list, manual management | Teams, departments |
| Dynamic Distribution List (DDL) | Based on automatic AD criteria | All managers, new employees |
| Security Group | Can be used for permissions | SharePoint access + distribution |
| Office 365 Group | Integrated SharePoint/Teams | Full collaboration |
| Action | Command |
|---|
| List all groups | Get-DistributionGroup -ResultSize Unlimited |
| Create distribution group | New-DistributionGroup -Name "IT Team" -PrimarySmtpAddress "it@tenant.com" |
| Create dynamic list | New-DynamicDistributionGroup -Name "All IT" -Filter "Department -eq 'IT'" |
| Add member | Add-DistributionGroupMember -Identity "IT Team" -Member "jdoe@tenant.com" |
| Remove member | Remove-DistributionGroupMember -Identity "IT Team" -Member "jdoe@tenant.com" |
| View members | Get-DistributionGroupMember -Identity "IT Team" |
| Modify description | Set-DistributionGroup -Identity "IT Team" -Notes "Main IT team" |
| Delete group | Remove-DistributionGroup -Identity "IT Team" -Confirm:$false |
Permissions and delegations
| Action | Command |
|---|
| View mailbox permissions | Get-MailboxPermission -Identity "shared@tenant.com" |
| Add full access | Add-MailboxPermission -Identity "shared@tenant.com" -User "jdoe@tenant.com" -AccessRights FullAccess |
| Add “Send As” | Add-RecipientPermission -Identity "shared@tenant.com" -Trustee "jdoe@tenant.com" -AccessRights SendAs |
| Add “Send on Behalf” | Set-Mailbox -Identity "shared@tenant.com" -GrantSendOnBehalfTo "jdoe@tenant.com" |
| Remove permission | Remove-MailboxPermission -Identity "shared@tenant.com" -User "jdoe@tenant.com" -AccessRights FullAccess |
| Enable automapping | Add-MailboxPermission -Identity "shared@tenant.com" -User "jdoe@tenant.com" -AccessRights FullAccess -AutoMapping $true |
| Disable automapping | Add-MailboxPermission -Identity "shared@tenant.com" -User "jdoe@tenant.com" -AccessRights FullAccess -AutoMapping $false |
Permission types
| Permission | Access | Typical usage |
|---|
| FullAccess | Full read/write | Assistant, backup |
| SendAs | Send as owner | Official communication |
| SendOnBehalf | Send on behalf of | Visible delegation |
| ReadPermission | Read only | Audit, consultation |
Quotas and storage
| Action | Command |
|---|
| View mailbox quota | Get-Mailbox -Identity "jdoe@tenant.com" | Select ProhibitSendQuota,ProhibitSendReceiveQuota |
| Modify user quota | Set-Mailbox -Identity "jdoe@tenant.com" -ProhibitSendQuota 90GB -ProhibitSendReceiveQuota 100GB |
| View storage usage | Get-MailboxStatistics -Identity "jdoe@tenant.com" | Select DisplayName,TotalItemSize,ItemCount |
| Top 10 largest mailboxes | Get-Mailbox -ResultSize Unlimited | Get-MailboxStatistics | Sort TotalItemSize -Descending | Select -First 10 DisplayName,TotalItemSize |
Storage limits by license
| License | Standard Quota | Archiving | Additional Cost |
|---|
| Exchange Online Plan 1 | 50 GB | Optional | Archiving +/month |
| Office 365 E3 | 100 GB | Included unlimited | - |
| Office 365 E5 | 100 GB | Included unlimited | - |
| Shared Mailbox | 50 GB free -> 100GB with E3 license | Available with license | - |
Export and management scripts
Export mailbox list
# Complete export with statistics
$mailboxes = Get-Mailbox -ResultSize Unlimited
$results = foreach($mailbox in $mailboxes) {
$stats = Get-MailboxStatistics -Identity $mailbox.UserPrincipalName
[PSCustomObject]@{
DisplayName = $mailbox.DisplayName
UserPrincipalName = $mailbox.UserPrincipalName
MailboxType = $mailbox.RecipientTypeDetails
TotalSize = $stats.TotalItemSize
ItemCount = $stats.ItemCount
LastLogon = $stats.LastLogonTime
ProhibitSendQuota = $mailbox.ProhibitSendQuota
}
}
$results | Export-Csv -Path "C:\temp\ExchangeMailboxes.csv" -NoTypeInformation -Encoding UTF8
Export distribution groups and members
# Detailed DL groups export
$groups = Get-DistributionGroup -ResultSize Unlimited
$results = foreach($group in $groups) {
$members = Get-DistributionGroupMember -Identity $group.Identity
foreach($member in $members) {
[PSCustomObject]@{
GroupName = $group.DisplayName
GroupEmail = $group.PrimarySmtpAddress
MemberName = $member.DisplayName
MemberEmail = $member.PrimarySmtpAddress
MemberType = $member.RecipientTypeDetails
}
}
}
$results | Export-Csv -Path "C:\temp\DistributionGroups.csv" -NoTypeInformation -Encoding UTF8
Bulk mailbox creation via CSV
# CSV format: DisplayName,UserPrincipalName,FirstName,LastName,Department
$users = Import-Csv -Path "C:\temp\NewMailboxes.csv" -Delimiter ";"
foreach($user in $users) {
try {
New-Mailbox -Name $user.DisplayName `
-UserPrincipalName $user.UserPrincipalName `
-FirstName $user.FirstName `
-LastName $user.LastName `
-Department $user.Department
Write-Host "Mailbox created: $($user.DisplayName)" -ForegroundColor Green
} catch {
Write-Host "Error creating $($user.DisplayName): $($_.Exception.Message)" -ForegroundColor Red
}
}
Bulk add members to DL groups
# CSV format: GroupName,MemberEmail
$members = Import-Csv -Path "C:\temp\GroupMembers.csv" -Delimiter ";"
foreach($member in $members) {
try {
Add-DistributionGroupMember -Identity $member.GroupName -Member $member.MemberEmail
Write-Host "Added $($member.MemberEmail) to $($member.GroupName)" -ForegroundColor Green
} catch {
Write-Host "Error adding $($member.MemberEmail): $($_.Exception.Message)" -ForegroundColor Red
}
}
Common troubleshooting
| Problem | Solution |
|---|
| Emails not delivered | Check Get-MessageTrace, transport rules, quotas |
| Shared mailbox access denied | Check permissions, automapping, Outlook cache |
| Slow synchronization | Force AD sync: Start-ADSyncSyncCycle -PolicyType Delta |
| Mobile no longer receiving | Reset partnership: Remove-MobileDevice then reconnect |
| Quota exceeded | Check Get-MailboxStatistics, enable archiving |