2012-09-17 37 views
23

我有困难,通过我的凭据Send-MailMessage命令如何通过凭据发送-命令MAILMESSAGE用于发送电子邮件

这是我运行:下面

Send-MailMessage -smtpServer smtp.gmail.com -from '[email protected]' ` 
    -to '[email protected]' -subject 'Test' -attachment C:\CDF.pdf 

它的错误这显然是因为我没有通过我的Gmail凭证

Send-MailMessage : The SMTP server requires a secure connection or the client was not 
authenticated. The server response was: 5.7.0 Must issue a STARTTLS command first. 

我用Google搜索了一下,也通过手册页去了消息0,并发现需要传递“-credential”参数。

我的问题是:如何?

我试图获取的凭据如下:

$mycredentials = Get-Credential 

然后进入我的usrname和密码的Gmail在弹出的对话框中。

然后我运行下面的命令:

Send-MailMessage -smtpServer smtp.gmail.com -credentail $mycredentials ` 
    -from '[email protected]' -to '[email protected]' -subject 'Test' -attachment C:\CDF.pdf 

,仍然失败了完全相同的错误。

所以我需要你们帮助我如何将我的凭证传递给Send-MailMessage命令。我了解了有关PScredentials的内容,但不完全确定它是什么以及如何在此上下文中使用它。

+3

您是否尝试添加'-UseSsl'开关? –

+0

谢谢。是的,这是问题,我也从http://stackoverflow.com/questions/4491229/the-smtp-server-requires-a-secure-connection-or-the-client-was-not-authenticated得到一个提示。 – slayedbylucifer

+0

这个问题绝对帮了我,所以'太靠近本地化'是不正确的。投票重开。 –

回答

6

So..it是SSL的问题。无论我做什么都是绝对正确的。只是我没有使用ssl选项。所以我在我原来的命令中加入了“-Usessl true”,它就起作用了。

28

我发现这个博客网站:Adam Kahtava
我也发现了这个问题:send-mail-via-gmail-with-powershell-v2s-send-mailmessage
的问题是,他们都没有解决双方的需求(附件有密码),所以我做了两者的结合,来到了这一点:

$EmailTo = "[email protected]" 
$EmailFrom = "[email protected]" 
$Subject = "Test" 
$Body = "Test Body" 
$SMTPServer = "smtp.gmail.com" 
$filenameAndPath = "C:\CDF.pdf" 
$SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom,$EmailTo,$Subject,$Body) 
$attachment = New-Object System.Net.Mail.Attachment($filenameAndPath) 
$SMTPMessage.Attachments.Add($attachment) 
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587) 
$SMTPClient.EnableSsl = $true 
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("username", "password"); 
$SMTPClient.Send($SMTPMessage) 

因为我喜欢做的事情功能,我需要所有的做法我可以,我继续写这个:

Function Send-EMail { 
    Param (
     [Parameter(` 
      Mandatory=$true)] 
     [String]$EmailTo, 
     [Parameter(` 
      Mandatory=$true)] 
     [String]$Subject, 
     [Parameter(` 
      Mandatory=$true)] 
     [String]$Body, 
     [Parameter(` 
      Mandatory=$true)] 
     [String]$EmailFrom="[email protected]", #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,$EmailTo,$Subject,$Body) 
     if ($attachment -ne $null) { 
      $SMTPattachment = New-Object System.Net.Mail.Attachment($attachment) 
      $SMTPMessage.Attachments.Add($STMPattachment) 
     } 
     $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 

} #End Function Send-EMail 

要调用它,只需使用这个命令:

Send-EMail -EmailTo "[email protected]" -Body "Test Body" -Subject "Test Subject" -attachment "C:\cdf.pdf" -password "Passowrd" 

我知道这是不是安全的把密码显然这样的。我会看看我是否能够提出更安全的更新,并且稍后再进行更新,但至少这应该为您提供开始所需的内容。祝您有个愉快的一周!

编辑:新增$EmailFrom基于JuanPablo的评论

+2

感谢您的解决方案和您的时间。我可以使用这个命令:'PS> Send-MailMessage -smtpServer smtp.gmail.com -Credential $ credential -Usessl true -from'[email protected]' - 到'[email protected]' - 主题'测试' - 附件C:\ CDF.pdf'。唯一的问题是,在运行此命令之前,您已使用“Get-Credential”将凭证存储在变量(上面的命令中的“$ credential”)中。是的,这只适用于Powershell Ver 2。同样请找到我有关ssl使用的答案。 – slayedbylucifer

+0

如果您想出一种加密密码的方式,请发帖。这真的很有帮助。谢谢。 – slayedbylucifer

+0

是的,用你的命令你需要'get-credential'命令。这是寻找一个纯文本密码,所以'get-credential'将不起作用,因为它将它作为一个安全字符串存储。当我有空闲时间时,我会在午餐时再玩一下,看看我是否可以找到一种方法来保护密码,直到它被调用。 – Nick

6

PSH> $名气= GET-凭证

PSH> $ CRED | Export-CliXml c:\ temp \ cred.clixml

PSH> $ cred2 = Import-CliXml c:\ temp \ cred。clixml

这会对您的SID和机器的SID造成冲击,因此该文件在任何其他机器上或任何其他人的手中都没有用处。

4

除了UseSsl,您必须包含smtp端口587才能使其正常工作。

Send-MailMessage -SmtpServer smtp.gmail.com -Port 587 -Credential $credential -UseSsl -From '[email protected]' -To '[email protected]' -Subject 'TEST' 
10

我花了一段时间才合并所有内容,使它有点安全,并且可以与Gmail一起使用。我希望这个答案能节省一些时间。

创建加密的服务器密码的文件:

在PowerShell中,输入以下命令(与你的实际密码替换MYPASSWORD):

"myPassword" | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-File "C:\EmailPassword.txt" 

创建PowerShell脚本(例。 sendEmail.ps1):

$User = "[email protected]" 
$File = "C:\EmailPassword.txt" 
$cred=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, (Get-Content $File | ConvertTo-SecureString) 
$EmailTo = "[email protected]" 
$EmailFrom = "[email protected]" 
$Subject = "Email Subject" 
$Body = "Email body text" 
$SMTPServer = "smtp.gmail.com" 
$filenameAndPath = "C:\fileIwantToSend.csv" 
$SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom,$EmailTo,$Subject,$Body) 
$attachment = New-Object System.Net.Mail.Attachment($filenameAndPath) 
$SMTPMessage.Attachments.Add($attachment) 
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587) 
$SMTPClient.EnableSsl = $true 
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential($cred.UserName, $cred.Password); 
$SMTPClient.Send($SMTPMessage) 

使用任务计划程序自动执行:

创建批处理文件(例如: emailFile.bat)以下各项:

powershell -ExecutionPolicy ByPass -File C:\sendEmail.ps1 

创建运行批处理文件的任务。 注意:您必须使用您用于加密密码的相同用户帐户运行任务! (也许是登录用户)

就是这样;您现在可以自动化并计划发送电子邮件和附件与Windows任务计划程序和Powershell。没有第三方软件和密码不是以纯文本形式存储(尽管授予,但不是非常安全)。

您还可以在安全级别上阅读this article,该级别为您的电子邮件密码提供了安全级​​别。

+0

我发现你可以直接创建一个'NetworkCredential',而不需要通过一个中间'PSCredential'对象。 – mwfearnley