PowerShell邮件脚本解析错误修复求助:字符串终止符缺失问题
让我一步步帮你排查和修复这个PowerShell邮件脚本的问题:
首先解决直接触发报错的语法问题
你看到的TerminatorExpectedAtEndOfString错误,核心原因是脚本里的引号用了HTML转义实体",而不是PowerShell能识别的普通双引号"。PowerShell会把"当成字符串的一部分,导致每个字符串都没有正确闭合,所以抛出了语法解析错误。
你需要把脚本里所有的"替换成标准的双引号"。
然后修复其他逻辑/参数错误
除了语法问题,脚本还有几个会导致运行失败的隐藏问题:
- 未定义
$From变量:Send-MailMessage必须指定-From参数,但你的脚本里只定义了$login却没设置$From,需要补充这个变量。 $heslo变量被错误覆盖:你先把密码赋值给$heslo = "MyPassword",但后面又重新赋值为ConvertTo-SecureString "heslo" -AsPlainText –Force——这里你把字符串"heslo"当成了密码,而不是之前定义的$heslo变量,会直接导致认证失败。- 附件路径不完整:
$Attachment = "test"只写了文件名,PowerShell大概率找不到这个文件,需要提供完整的文件路径(比如"C:\Users\thoma\Documents\test.jpg"),或者确保文件在脚本执行的当前目录下。 - Gmail SMTP认证注意事项:如果你的Gmail账号开启了两步验证,必须使用应用专用密码代替普通密码;如果没开两步验证,需要临时允许"不太安全的应用访问"(不推荐,建议开启2FA后使用应用密码)。
修复后的完整脚本
# 配置邮件核心参数 $From = "andrew.spmr01@gmail.com" $login = $From $heslo = "你的应用密码或普通密码" $To = "mek@mailinator.com" $Copy = "andrew.spmr01@gmail.com" $Attachment = "C:\Users\thoma\Documents\test.jpg" # 替换为实际的附件完整路径 $Subject = "Photos of Drogon" $Body = "<br>Please see attached picture for reference." $SMTPServer = "smtp.gmail.com" $SMTPPort = 587 # 端口可以直接用数字,无需加引号 # 转换密码为安全字符串格式 $securePassword = ConvertTo-SecureString $heslo -AsPlainText -Force $autentizace = New-Object System.Management.Automation.PSCredential($login, $securePassword) # 发送邮件(添加了-BodyAsHtml参数,让HTML标签生效) Send-MailMessage -From $From -To $To -Cc $Copy -Subject $Subject -Body $Body -BodyAsHtml -SmtpServer $SMTPServer -Port $SMTPPort -UseSsl -Credential $autentizace -Attachments $Attachment
额外优化说明
- 我把用于安全字符串的变量改成了
$securePassword,避免和原始密码变量$heslo混淆,你也可以保持原来的命名,但要注意不要重复赋值。 - 添加了
-BodyAsHtml参数,因为你的邮件正文用了HTML换行标签<br>,不加这个参数的话,标签会被当成普通文本显示。 $SMTPPort直接用数字587即可,PowerShell会自动识别为整数类型,比字符串更规范。
内容的提问来源于stack exchange,提问作者Tomáš T.




