PowerShell脚本通过Outlook发邮件时如何自动获取运行用户的邮箱地址
实现方案
完全可以直接利用你当前在用的Outlook COM组件拿到当前登录账号的邮箱,既不需要手动硬编码收件人地址,也不需要额外查询AD域拿用户邮箱,直接复用Outlook本地已经加载好的账号配置就行。
你只需要在初始化Outlook COM对象之后,追加几行代码提取默认发件账号的SMTP地址,替换掉原来硬编码的$Mail.To = "firstname.lastname@gmail.com"这行即可:
# 原有初始化代码 $Outlook = New-Object -ComObject Outlook.Application # 新增:获取MAPI命名空间,读取本地账号配置 $Mapi = $Outlook.GetNamespace("MAPI") # 读取默认发件账号的准确邮箱地址 $DefaultSenderAccount = $Mapi.Accounts | Where-Object { $_.DefaultStore } | Select-Object -First 1 $RunnerEmail = $DefaultSenderAccount.SmtpAddress # 替换原来硬编码的收件人配置 $Mail.To = $RunnerEmail
- 这个方法取到的账号和实际发件人完全一致:你调用
$Mail.Send()的时候,Outlook默认就会把标记为DefaultStore的账号作为发件人,上面的筛选条件取到的就是同一个账号,根本不会出现收件人和发件人不匹配的问题。
兼容兜底方案
如果碰到老版本Outlook(比如2013及更早)、纯域内Exchange环境下取不到SmtpAddress的情况,可以换成从当前登录用户的地址条目提取邮箱,兼容性更强:
# 兜底获取邮箱的逻辑 $CurrentOutlookUser = $Mapi.CurrentUser $RunnerEmail = $CurrentOutlookUser.AddressEntry.GetExchangeUser().PrimarySmtpAddress
常见注意点
- 不要图省事直接用
$env:USERNAME拼接企业邮箱前缀,这种方式很容易因为域后缀配置变动导致发件失败,从Outlook缓存里拿到的SMTP地址是经过格式校验的准确值 - 建议在给
$Mail.To赋值前加个空值判断,避免Outlook还在初始化配置、账号没加载完成的时候脚本提前运行,导致取到空值发件失败:if ([string]::IsNullOrWhiteSpace($RunnerEmail)) { Write-Host "本地Outlook未加载完成,无法获取当前用户邮箱" return } - 对于绑定了多个第三方邮箱(比如个人Gmail、公共邮箱)的Outlook客户端,这个取数逻辑也能正常识别POP3/SMTP配置的账号地址,不会因为非Exchange账号出现取不到值的问题。
内容的提问来源于stack exchange,提问作者Andrew Jackson
相关产品推荐
相关产品推荐

