PowerShell发送带附件邮件报错:调用Send方法失败,求故障原因
问题分析:PowerShell调用Gmail SMTP发送带附件邮件失败
你编写的PowerShell代码在调用Send方法时出现「调用‘send’时使用‘1’个参数失败:‘发送邮件失败’」异常,且未收到邮件,可能的原因及修正方案如下:
一、Gmail账户权限配置问题
- 未启用应用访问权限:Gmail默认限制非官方应用的SMTP访问,若未开启2步验证,需在Google账户设置中开启「不太安全的应用访问」;若开启了2步验证,必须生成应用专用密码替代原账户密码,直接用原密码会验证失败。
- 安全拦截未处理:登录Google账户查看安全记录,若存在服务器IP的登录拦截提示,需手动允许该设备访问。
二、代码本身的错误
- Subject重复赋值:代码中
$Subject = "Log file from server"后又被覆盖为$Subject = "Subject",属于冗余错误,建议删除重复赋值行。 - SecureString兼容性问题:
ConvertTo-SecureString生成的SecureString类型,部分PowerShell版本与NetworkCredential构造函数兼容不佳。可改为直接读取明文(仅测试用),或转换为普通字符串:$pass = Get-Content "C:\Folder\Password.txt" # 或转换SecureString为明文(测试场景) $BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pass) $plainPass = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR) $SMTPClient.Credentials = New-Object System.Net.NetworkCredential($username, $plainPass); - 附件路径或权限问题:确认
C:\Folder\LogFile.txt文件存在,且PowerShell进程有读取该文件的权限,否则添加附件会导致发送失败。
三、SMTP客户端配置遗漏
- 默认凭据冲突:设置自定义凭据前,建议先清空默认凭据:
$SMTPClient.UseDefaultCredentials = $false - 超时设置缺失:若附件较大,可添加超时设置避免发送中断:
$SMTPClient.Timeout = 100000 # 100秒超时
四、网络环境限制
- 端口或代理拦截:确认服务器的587端口未被防火墙、安全组或代理拦截,Gmail SMTP服务依赖587端口的TCP连接。
- IP信誉问题:若服务器IP频繁发送邮件,可能被Google反垃圾机制拦截,需检查IP的信誉状态。
内容的提问来源于stack exchange,提问作者Soundar Raj
相关产品推荐
相关产品推荐

