43

Send-MailMessageコマンドにクレデンシャルを渡すのに問題があります

これは私が実行しているものです:

Send-MailMessage -smtpServer smtp.gmail.com -from 'myself@gmail.com' `
    -to 'myself@gmail.com' -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.

少しググって、のマニュアルページをSend-MailMessage調べたところ、「-credential」パラメータを渡す必要があることがわかりました。

私の問題は:どのように?

私は以下のようにGet-Credentialsを試してみました:

$mycredentials = Get-Credential

次に、ポップアップするボックスにGmailのusrnameとpasswordを入力します。

次に、以下のコマンドを実行します。

Send-MailMessage -smtpServer smtp.gmail.com -credentail $mycredentials `
  -from 'myself@gmail.com' -to 'myself@gmail.com' -subject 'Test' -attachment C:\CDF.pdf

それでも、まったく同じエラーで失敗します。

Send-MailMessageですから、クレデンシャルをコマンドに渡す方法について、皆さんの助けが必要です。私はPScredentialsについて学びましたが、それが何であるか、そしてこの文脈でそれをどのように使用するかについては正確にはわかりません。

4

7 に答える 7

47

私はこのブログサイトを見つけました:Adam Kahtava
私もこの質問を見つけました:send-mail-via-gmail-with-powershell-v2s-send-mailmessage
問題は、どちらもあなたの両方のニーズ(パスワード付きの添付ファイル)に対応していないということです。私は2つの組み合わせをいくつか行い、これを思いつきました。

$EmailTo = "myself@gmail.com"
$EmailFrom = "me@mydomain.com"
$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="myself@gmail.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,$EmailTo,$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

} #End Function Send-EMail

これを呼び出すには、次のコマンドを使用します。

Send-EMail -EmailTo "Myself@gmail.com" -Body "Test Body" -Subject "Test Subject" -attachment "C:\cdf.pdf" -password "Passowrd"

パスワードをそのようにはっきりと入力するのは安全ではないことを私は知っています。より安全なものを考え出し、後で更新できるかどうかを確認しますが、少なくともこれで、開始するために必要なものが得られるはずです。よい一週間を!

編集:$EmailFromJuanPabloのコメントに基づいて追加

編集:SMTPは添付ファイルでSTMPと綴られていました。

于 2012-09-17T16:01:37.197 に答える
22

そして、これSend-MailMessageはまさにそれを探している人のためのユーザー名/パスワードの簡単な例です

$secpasswd = ConvertTo-SecureString "PlainTextPassword" -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential ("username", $secpasswd)
Send-MailMessage -SmtpServer mysmptp -Credential $cred -UseSsl -From 'sender@gmail.com' -To 'recipient@gmail.com' -Subject 'TEST'
于 2019-01-10T13:33:07.307 に答える
17

すべてを組み合わせて少し安全にし、Gmailで動作させるのに少し時間がかかりました。この答えが誰かの時間を節約することを願っています。

暗号化されたサーバーパスワードを使用してファイルを作成します。

Powershellで、次のコマンドを入力します(myPasswordを実際のパスワードに置き換えます)。

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

PowerShellスクリプトを作成します(例:sendEmail.ps1):

$User = "usernameForEmailPassword@gmail.com"
$File = "C:\EmailPassword.txt"
$cred=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, (Get-Content $File | ConvertTo-SecureString)
$EmailTo = "emailTo@yahoo.com"
$EmailFrom = "emailFrom@gmail.com"
$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を使用して、電子メールと添付ファイルの送信を自動化およびスケジュールする方法が得られました。サードパーティのソフトウェアはなく、パスワードはプレーンテキストとして保存されません(付与されていますが、それほど安全ではありません)。

これが電子メールパスワードに提供するセキュリティのレベルについても、この記事を読むことができます。

于 2016-06-06T09:57:18.327 に答える
8

PSH> $ cred = Get-Credential

PSH> $ cred | エクスポート-CliXmlc:\ temp \ cred.clixml

PSH> $ cred2=インポート-CliXmlc:\ temp \ cred.clixml

それはあなたのSIDとマシンのSIDに対してそれをハッシュするので、ファイルは他のマシンや他の人の手には役に立たない。

于 2013-09-21T03:36:48.840 に答える
7

だから..それはSSLの問題でした。私がしていたことは何でも絶対に正しかった。sslオプションを使用していなかったということだけです。そこで、元のコマンドに「-Usessl true」を追加すると、機能しました。

于 2012-09-17T16:10:40.080 に答える
5

UseSslに加えて、動作させるにはsmtpポート587を含める必要があります。

Send-MailMessage -SmtpServer smtp.gmail.com -Port 587 -Credential $credential -UseSsl -From 'yyy@gmail.com' -To 'xxx@email.com' -Subject 'TEST'
于 2014-04-05T04:36:23.940 に答える
0

他の回答とともに、2要素認証を使用している場合は、Googleアカウントでアプリケーションパスワードを作成する必要があることを指摘しておきます。

詳細な説明については:https ://support.google.com/accounts/answer/185833

于 2021-09-17T15:07:15.043 に答える