2012-09-17 65 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