Exchange 2010至2013邮件启用公用文件夹SMTP地址迁移问题
Exchange 2010到2013邮件启用公用文件夹SMTP地址迁移解答
核心结论
- 官方提供的标准公用文件夹批量迁移流程及配套PowerShell脚本,默认会自动同步所有源端邮件启用公用文件夹的
proxyAddresses属性,包含主SMTP地址、所有辅助SMTP代理地址、X500遗留地址等邮件相关属性,正常无冲突的迁移场景下,迁移完成后公用文件夹的邮件收发能力和迁移前完全一致,不需要手动单独配置SMTP地址。
仅当迁移过程中出现地址冲突(如目标Exchange 2013环境内已存在占用相同SMTP地址的其他收件人、公用文件夹),或你自定义迁移参数时显式排除了邮件属性同步,才会出现SMTP地址丢失、未同步的问题,这类场景需要手动补全配置。
手动配置相关PowerShell命令
单公用文件夹基础操作命令
- 为未启用邮件能力的公用文件夹开启邮件功能:
# 将<公用文件夹路径>替换为实际路径,例:\部门公共区\运营公告 Enable-MailPublicFolder -Identity "<公用文件夹路径>"
- 配置公用文件夹主SMTP地址:
# 配置后主地址会自动更新,原主地址默认保留为辅助代理地址 # 加上-EmailAddressPolicyEnabled $false参数避免地址被电子邮件地址策略覆盖 Set-MailPublicFolder -Identity "<公用文件夹路径>" -PrimarySmtpAddress "主地址@你的域名.com" -EmailAddressPolicyEnabled $false
- 追加辅助SMTP代理地址:
Set-MailPublicFolder -Identity "<公用文件夹路径>" -EmailAddresses @{add="辅助地址1@你的域名.com","辅助地址2@你的域名.com"}
批量同步SMTP地址参考脚本
如果迁移后出现批量地址丢失的情况,可以先从源端导出地址清单,再在目标端批量导入配置:
- 在Exchange 2010源服务器运行,导出所有邮件启用公用文件夹的地址清单:
# 导出结果会保存到C盘根目录的PF_Email_Addresses.csv文件 Get-MailPublicFolder -ResultSize Unlimited | Select-Object ` Identity, PrimarySmtpAddress, @{ Name="ProxyAddresses"; Expression={$_.EmailAddresses | Where-Object {$_ -clike "SMTP:*" -or $_ -clike "smtp:*"} | ForEach-Object {$_ -replace "SMTP:","" -replace "smtp:",""}} } | Export-Csv -Path "C:\PF_Email_Addresses.csv" -NoTypeInformation -Encoding UTF8
- 将导出的CSV文件拷贝到Exchange 2013目标服务器后运行,批量补全地址配置:
$pfAddressList = Import-Csv -Path "C:\PF_Email_Addresses.csv" -Encoding UTF8 foreach ($pf in $pfAddressList) { # 校验目标端公用文件夹是否存在 $targetPf = Get-PublicFolder -Identity $pf.Identity -ErrorAction SilentlyContinue if (-not $targetPf) { Write-Warning "公用文件夹 $($pf.Identity) 不存在于目标环境,跳过配置" continue } # 未启用邮件的先开启邮件功能 $mailEnabledPf = Get-MailPublicFolder -Identity $pf.Identity -ErrorAction SilentlyContinue if (-not $mailEnabledPf) { Enable-MailPublicFolder -Identity $pf.Identity Start-Sleep -Seconds 3 } # 配置主SMTP地址,关闭地址策略覆盖避免自定义地址被重置 Set-MailPublicFolder -Identity $pf.Identity -PrimarySmtpAddress $pf.PrimarySmtpAddress -EmailAddressPolicyEnabled $false # 补全缺失的辅助SMTP地址 $existingAddresses = (Get-MailPublicFolder -Identity $pf.Identity).EmailAddresses | Where-Object {$_ -clike "SMTP:*" -or $_ -clike "smtp:*"} | ForEach-Object {$_ -replace "SMTP:","" -replace "smtp:",""} $needAddAddresses = @() $sourceProxyList = $pf.ProxyAddresses -split "\s+" foreach ($addr in $sourceProxyList) { if ($addr -ne $pf.PrimarySmtpAddress -and $addr -notin $existingAddresses) { $needAddAddresses += $addr } } if ($needAddAddresses.Count -gt 0) { Set-MailPublicFolder -Identity $pf.Identity -EmailAddresses @{add=$needAddAddresses} } Write-Host "已完成公用文件夹 $($pf.Identity) 的邮件地址配置" -ForegroundColor Green }
注意事项
- 正式运行批量脚本前,建议先选取3-5个测试公用文件夹做验证,确认地址配置符合预期后再全量运行
- 全量配置完成后,抽查10%左右的公用文件夹地址配置,同时发送测试邮件验证内外部邮件流是否正常
内容的提问来源于stack exchange,提问作者Fabian
相关产品推荐
相关产品推荐

