0

PowerShell Send-MailMessage 匿名SMTP配置教程:3种方案让脚本告警邮件稳定发送

2026.05.31 | youres | 29次围观

为什么需要匿名SMTP?

很多运维场景下,PowerShell脚本需要发送告警邮件——磁盘满了、服务挂了、证书快过期了。但问题来了:公司内网没有现成的邮件服务器,公共邮箱又要求OAuth认证,Send-MailMessage根本连不上。

匿名SMTP服务器就是解决这个问题的利器:不需要账号密码,PowerShell直接发邮件,配置简单、即开即用。

方案一:Windows IIS SMTP虚拟服务器

如果你有一台Windows Server,最快的办法是启用IIS自带的SMTP功能。

安装SMTP功能

# PowerShell安装SMTP服务器功能
Install-WindowsFeature -Name SMTP-Server -IncludeManagementTools

配置匿名中继

  1. 打开IIS 6.0管理器(不是IIS管理器,是老版的)
  2. 右键SMTP Virtual Server → 属性 → Access → Relay → 添加127.0.0.1和内网IP段
  3. Authentication → 勾选"Anonymous access"
  4. Delivery → Outbound Security → 选择Anonymous access

PowerShell发送测试

Send-MailMessage `
    -From "alert@yourdomain.com" `
    -To "admin@yourdomain.com" `
    -Subject "服务器告警:磁盘空间不足" `
    -Body "C盘剩余空间不足10%,请及时处理。" `
    -SmtpServer "localhost" `
    -Port 25

方案二:hMailServer搭建匿名SMTP

IIS SMTP只适合Windows Server,如果你用的是桌面系统或者想要更灵活的配置,hMailServer是更好的选择。

安装与配置步骤

  1. 下载hMailServer安装,设置管理员密码
  2. 添加域名(比如internal.local)
  3. Settings → Protocols → SMTP → Delivery of email → 设置本地主机名
  4. Settings → Advanced → IP Ranges → 添加内网IP段,勾选"Allow deliveries from local to local/internet",取消Require SMTP authentication

关键配置:关闭认证要求

在IP Ranges中,把"Require SMTP authentication"的所有勾选框取消,这样内网机器就可以匿名发信了。

Send-MailMessage `
    -From "monitor@internal.local" `
    -To "ops-team@internal.local" `
    -Subject "定时巡检报告" `
    -Body "所有服务运行正常。" `
    -SmtpServer "192.168.1.100" `
    -Port 25

方案三:Docker一键部署Postfix匿名中继

如果你有Docker环境,这是最快最干净的方式——一个命令搞定。

docker run -d `
    --name postfix-relay `
    -e POSTFIX_MYDOMAIN=yourdomain.com `
    -e POSTFIX_MYNETWORKS=192.168.0.0/16,127.0.0.0/8 `
    -p 25:25 `
    mwader/postfix-relay

容器启动后,内网任何机器都可以通过25端口匿名发信。

Send-MailMessage `
    -From "docker-alert@yourdomain.com" `
    -To "dev@yourdomain.com" `
    -Subject "Docker容器异常退出" `
    -Body "容器nginx-prod已退出,请排查。" `
    -SmtpServer "192.168.1.200" `
    -Port 25

常见问题排查

1. 连接被拒绝

检查防火墙是否放行25端口:

# Windows防火墙放行25端口
New-NetFirewallRule -DisplayName "SMTP" -Direction Inbound -LocalPort 25 -Protocol TCP -Action Allow

2. 邮件发出去但收不到

匿名SMTP发出的邮件很容易被公共邮箱(Gmail、QQ邮箱)当作垃圾邮件拦截。建议:

  • 内网告警用内部邮箱接收
  • 如果必须发到公网,配置SMTP服务器的DNS PTR反向解析
  • 配置SPF记录允许服务器IP发信

3. Send-MailMessage报"远程证书无效"

如果SMTP服务器启用了TLS但使用自签名证书,需要加-UseSsl参数。但对于匿名SMTP通常不需要SSL,端口25明文传输即可。

Send-MailMessage已被标记为过时?

微软官方已经将Send-MailMessage标记为obsolete(DE0005),原因是该cmdlet不支持现代安全连接验证。但截至目前,PowerShell仍内置此命令且功能正常。

如果你追求更现代的方案,推荐使用MailKit库:

# 安装MailKit
Install-Package MailKit -Scope CurrentUser

# 使用MailKit发送邮件
Add-Type -Path "$env:USERPROFILE\packages\mailkit\lib\netstandard2.0\MailKit.dll"
Add-Type -Path "$env:USERPROFILE\packages\bouncycastle\lib\netstandard2.0\BouncyCastle.Crypto.dll"

$mailMessage = New-Object MailKit.SimpleMailMessage
$mailMessage.From = "alert@yourdomain.com"
$mailMessage.To = "admin@yourdomain.com"
$mailMessage.Subject = "MailKit告警测试"
$mailMessage.Body = "这是MailKit发送的测试邮件"

$client = New-Object MailKit.Net.Smtp.SmtpClient
$client.Connect("192.168.1.100", 25, $false)
$client.Send($mailMessage)
$client.Disconnect($true)

安全建议

匿名SMTP虽然方便,但安全风险不小。这里给几个实用建议:

  • 限制IP范围:只允许内网IP中继,千万别对公网开放
  • 仅限内网使用:匿名SMTP发出的邮件到公网基本进垃圾箱
  • 加一层认证:如果条件允许,用SMTP认证比纯匿名更安全
  • 日志监控:定期检查SMTP日志,防止被内网其他机器滥用

三种方案对比

方案适用场景优点缺点
IIS SMTPWindows Server系统自带,无需额外安装仅限Server版,配置界面老旧
hMailServerWindows全版本图形化管理,功能完整需单独安装,配置步骤多
Docker Postfix有Docker环境一键部署,干净隔离需要Docker环境

相关文章

版权声明

本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论