我有一个表,用于存储通过脚本中的Powershell查询调用的电子邮件变量/值。
Send-MailMessage -From $From_Email -To $To_Email -Subject $Job_Success_Email_Subject -Body $Email_Body -SmtpServer $SmtpServer -port $SmtpPort -Credential $SmtpCredentials -usessl
我主要对从数据库传递的用户名/密码凭据感兴趣,但是使用Get-Credential
时出现此错误:
$SmtpCredentials = Get-Credential
Send-MailMessage:SMTP服务器需要安全连接,或者客户端未通过身份验证。服务器 响应是:需要身份验证
如果我是这样从数据库传递凭据的,则:
$SmtpPassword = $SmtpPassword | ConvertTo-SecureString -AsPlainText -Force
$SmtpCredentials = New-Object System.Management.Automation.PSCredential($SmtpUser,$SmtpPassword)
注意:此密码目前仅出于测试目的而未加密!
我遇到了这两个错误:
新对象:找不到“ PSCredential”和 参数计数:“ 2”。
然后我得到一个凭据弹出式登录名,如果我什么都没输入,我得到这个错误:
Send-MailMessage:无法验证参数“ Credential”上的参数。 参数为null或为空。提供一个不为null或 清空,然后再次尝试命令。
如果我确实手动输入凭据,则会得到以下信息:
Send-MailMessage:SMTP服务器需要安全连接,或者 客户端未通过身份验证。服务器响应为:身份验证 必填
我知道此错误已讨论并回答了一些问题,但是我经历了所有可能的解决方案,例如usessl
和ConvertTo-SecureString -AsPlainText -Force
,但它没有用。我也尝试过[string][ValidateNotNullOrEmpty()]$SmtpPassword
,但这似乎也没有效果。
因此,现在,为了确保它不是凭据本身的问题,我想使用类似Integrated Security=SSPI
的方法(例如sql连接字符串允许但要使用Send-Mail命令进行测试)
答案 0 :(得分:1)
我已经解决了问题!
因此,显然我使用的ID(用户名)不在Active Directory组中。所以我使用了AD组中的另一个ID,它起作用了!
例如:
我在Dev环境中编写脚本,并认为我只需要使用Dev ID和密码,无论我尝试了什么,都无法使用。
我尝试了测试环境ID /密码,该ID /密码是最近构建/要求添加到使用Dev开发的脚本中的AD组中的,它可以正常工作!
答案 1 :(得分:0)
您应该使用System.Net.NetworkCredential
对象来传递凭据。之间尝试一下。每次都能完美地工作。
Function Send-Email {
Param (
[Parameter(`
Mandatory=$true)]
[String]$SendTo,
[Parameter(`
Mandatory=$true)]
[String]$Subject,
[Parameter(`
Mandatory=$true)]
[String]$Body,
[Parameter(`
Mandatory=$true)]
[String]$EmailFrom="abc@123.com", #This gives a default value to the $EmailFrom command
[Parameter(`
mandatory=$false)]
[String]$attachment,
[Parameter(`
mandatory=$true)]
[String]$Password
)
$SMTPServer = "smtp.gmail.com"
$SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom,$SendTo,$Subject,$Body)
if ($attachment -ne $null) {
$SMTPattachment = New-Object System.Net.Mail.Attachment($attachment)
$SMTPMessage.Attachments.Add($SMTPattachment)
}
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)
$SMTPClient.EnableSsl = $true
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential($EmailFrom.Split("@")[0], $Password);
$SMTPClient.Send($SMTPMessage)
Remove-Variable -Name SMTPClient
Remove-Variable -Name Password
}
使用调用
Send-EMail -SendTo "him@hotmail.com" -Body "Test Body" -Subject "Test Subject" -attachment "C:\something.pdf" -password "Password"