web-dev-qa-db-ja.com

PowerShell V2のSend-MailMessageを使用してGmail経由でメールを送信する

PowerShell V2の使用方法を理解しようとしていますSend-MailMessage gmailで。

ここに私がこれまで持っているものがあります。

$ss = new-object Security.SecureString
foreach ($ch in "password".ToCharArray())
{
    $ss.AppendChar($ch)
}
$cred = new-object Management.Automation.PSCredential "[email protected]", $ss
Send-MailMessage    -SmtpServer smtp.gmail.com -UseSsl -Credential $cred -Body...

次のエラーが表示されます

Send-MailMessage : The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication Required. Learn
 more at                              
At foo.ps1:18 char:21
+     Send-MailMessage <<<<      `
    + CategoryInfo          : InvalidOperation: (System.Net.Mail.SmtpClient:SmtpClient) [Send-MailMessage], SmtpException
    + FullyQualifiedErrorId : SmtpException,Microsoft.PowerShell.Commands.SendMailMessage

私は何か間違っているのですか、それともSend-MailMessageまだ完全には焼けていません(CTP 3を使用しています)?

いくつかの追加の制限

  1. これを非インタラクティブにしたいので、get-credential動作しません
  2. ユーザーアカウントはGmailドメイン上ではなく、Googleアプリの登録済みドメイン上にあります
  3. この質問については、Send-MailMessageコマンドレット、通常の.Net APIを介したメール送信はよく理解されています。
41
Scott Weinstein

この質問を見つけたばかりです。Gmail用のPowerShell Send-MailMessageサンプルを次に示します。テスト済みの実用的なソリューション:

$EmailFrom = "[email protected]"
$EmailTo = "[email protected]" 
$Subject = "Notification from XYZ" 
$Body = "this is a notification from XYZ Notifications.." 
$SMTPServer = "smtp.gmail.com" 
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587) 
$SMTPClient.EnableSsl = $true 
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("username", "password"); 
$SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)

$ EmailToを変更するだけで、$ SMTPClient.Credentialsのユーザー名/パスワードを変更します。ユーザー名に@ gmail.comを含めないでください。

たぶん、これはこの質問に出くわした他の人の助けになるでしょう..

46

これで問題が解決するはずです

$credentials = new-object Management.Automation.PSCredential “[email protected]”, (“password” | ConvertTo-SecureString -AsPlainText -Force)

次に、Send-MailMessage -From $From -To $To -Body $Body $Body -SmtpServer {$smtpServer URI} -Credential $credentials -Verbose -UseSslを呼び出すときに資格情報を使用します

13
Jstar

Gmailはポート587で動作するため、Send-MailMessageでポート番号を変更できるかどうかはわかりません。とにかく、.NET SmtpClientでgmailを介してメールを送信する方法は次のとおりです。

$smtpClient = new-object system.net.mail.smtpClient 
$smtpClient.Host = 'smtp.gmail.com'
$smtpClient.Port = 587
$smtpClient.EnableSsl = $true
$smtpClient.Credentials = [Net.NetworkCredential](Get-Credential GmailUserID) 
$smtpClient.Send('[email protected]','[email protected]','test subject', 'test message')
7
Shay Levy

私はちょうど同じ問題を抱えていて、この投稿に遭遇しました。実際、ネイティブのSend-MailMessageコマンドレットで実行するのに役立ちました。ここに私のコードを示します。

$cred = Get-Credential
Send-MailMessage ....... -SmtpServer "smtp.gmail.com" -UseSsl -Credential $cred -Port 587 

ただし、GmailでSMTPサーバーを使用できるようにするには、Gmailアカウントにログインし、このリンクの下でログインする必要がありました https://www.google.com/settings/security 「安全性の低いアプリへのアクセス」から「有効」へ。そしてついにうまくいきました!!

チャオ・マルコ

7
Marco Mirandola

私はクリスチャンの2月12日のソリューションを使用し、PowerShellを習い始めたばかりです。添付ファイルに関しては、Get-Memberのしくみを調べて、Send()には2つの定義があることに気付きました。2番目の定義では、添付ファイルとより強力なCcやBccなどの便利な機能。添付ファイルのある例を次に示します(上記の彼の例と混ぜてください):

# append to Christian's code above --^
$emailMessage = New-Object System.Net.Mail.MailMessage
$emailMessage.From = $EmailFrom
$emailMessage.To.Add($EmailTo)
$emailMessage.Subject = $Subject
$emailMessage.Body = $Body
$emailMessage.Attachments.Add("C:\Test.txt")
$SMTPClient.Send($emailMessage)

楽しい!

4
core

多くのテストとソリューションの長い検索の後。 http://www.powershellmagazine.com/2012/10/25/pstip-sending-emails-using-your-gmail-account/ で機能的で興味深いスクリプトコードを見つけました。

$param = @{
    SmtpServer = 'smtp.gmail.com'
    Port = 587
    UseSsl = $true
    Credential  = '[email protected]'
    From = '[email protected]'
    To = '[email protected]'
    Subject = 'Sending emails through Gmail with Send-MailMessage'
    Body = "Check out the PowerShellMagazine.com website!"
    Attachments = 'D:\articles.csv'
}

Send-MailMessage @param

楽しい

3
BSF

これはここでチャイムするのは本当に遅い日付ですが、おそらくこれは他の誰かを助けることができます。

私は本当にPowerShellが初めてで、PSからGmailingについて検索していました。皆さんが上記で行ったことを少し修正し、添付ファイルを追加する前にチェックするスクリプトを作成しました。また、受信者の配列も取得します。後でさらにエラーチェックなどを追加しますが、ここに投稿するのに十分(そして基本的)であると思いました。

## Send-Gmail.ps1 - Send a gmail message
## By Rodney Fisk - [email protected]
## 2 / 13 / 2011

# Get command line arguments to fill in the fields
# Must be the first statement in the script
param(
    [Parameter(Mandatory = $true,
                    Position = 0,
                    ValueFromPipelineByPropertyName = $true)]
    [Alias('From')] # This is the name of the parameter e.g. -From [email protected]
    [String]$EmailFrom, # This is the value [Don't forget the comma at the end!]

    [Parameter(Mandatory = $true,
                    Position = 1,
                    ValueFromPipelineByPropertyName = $true)]
    [Alias('To')]
    [String[]]$Arry_EmailTo,

    [Parameter(Mandatory = $true,
                    Position = 2,
                    ValueFromPipelineByPropertyName = $true)]
    [Alias( 'Subj' )]
    [String]$EmailSubj,

    [Parameter(Mandatory = $true,
                    Position = 3,
                    ValueFromPipelineByPropertyName = $true)]
    [Alias( 'Body' )]
    [String]$EmailBody,

    [Parameter(Mandatory = $false,
                    Position = 4,
                    ValueFromPipelineByPropertyName = $true)]
    [Alias( 'Attachment' )]
    [String[]]$Arry_EmailAttachments

)

# From Christian @ StackOverflow.com
$SMTPServer = "smtp.gmail.com" 
$SMTPClient = New-Object Net.Mail.SMTPClient( $SmtpServer, 587 )  
$SMTPClient.EnableSSL = $true 
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential( "GMAIL_USERNAME", "GMAIL_PASSWORD" ); 

# From Core @ StackOverflow.com
$emailMessage = New-Object System.Net.Mail.MailMessage
$emailMessage.From = $EmailFrom
foreach ( $recipient in $Arry_EmailTo )
{
    $emailMessage.To.Add( $recipient )
}
$emailMessage.Subject = $EmailSubj
$emailMessage.Body = $EmailBody
# Do we have any attachments?
# If yes, then add them, if not, do nothing
if ( $Arry_EmailAttachments.Count -ne $NULL ) 
{
    $emailMessage.Attachments.Add()
}
$SMTPClient.Send( $emailMessage )

もちろん、GMAIL_USERNAMEとGMAIL_PASSWORDの値を特定のユーザーに変更してパスします。

3
Rodney Fisk

PowerShellを使用して添付ファイル付きのメールを送信-

      $EmailTo = "[email protected]"  // [email protected]
      $EmailFrom = "[email protected]"  //[email protected]
      $Subject = "zx"  //subject
      $Body = "Test Body"  //body of message
      $SMTPServer = "smtp.gmail.com" 
      $filenameAndPath = "G:\abc.jpg"  //attachment
      $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("[email protected]", "xxxxxxxx");    // xxxxxx-password
      $SMTPClient.Send($SMTPMessage)
2
udit043

Windows 8.1マシンでは、Send-MailMessage次のスクリプトを使用して、GMailで添付ファイル付きのメールを送信します。

$EmFrom = "[email protected]"    
$username = "[email protected]"    
$pwd = "YOURPASSWORD"    
$EmTo = "[email protected]"    
$Server = "smtp.gmail.com"    
$port = 587    
$Subj = "Test"    
$Bod = "Test 123"    
$Att = "c:\Filename.FileType"    
$securepwd = ConvertTo-SecureString $pwd -AsPlainText -Force    
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $username, $securepwd    
Send-MailMessage -To $EmTo -From $EmFrom -Body $Bod -Subject $Subj -Attachments $Att -SmtpServer $Server -port $port -UseSsl  -Credential $cred
2
Andy Urban

ここにあります

$filename = “c:\scripts_scott\test9999.xls”
$smtpserver = “smtp.gmail.com”
$msg = new-object Net.Mail.MailMessage
$att = new-object Net.Mail.Attachment($filename)
$smtp = new-object Net.Mail.SmtpClient($smtpServer )
$smtp.EnableSsl = $True
$smtp.Credentials = New-Object System.Net.NetworkCredential(“username”, “password_here”); # Put username without the @GMAIL.com or – @gmail.com
$msg.From = “[email protected]”
$msg.To.Add(”[email protected]”)
$msg.Subject = “Monthly Report”
$msg.Body = “Good MorningATTACHED”
$msg.Attachments.Add($att)
$smtp.Send($msg)

SanがWww.techjunkie.tvのsend-mailmessageも使用するのに役立つかどうかを教えてください

1

Christian Muggliのソリューションに同意しますが、最初はScott Weinsteinが報告したエラーがまだありました。それを乗り越える方法:

指定されたアカウントを使用して、これが実行されるマシンからGmailに最初にログインします。 (Internet Explorerセキュリティ強化の構成が有効になっている場合でも、Googleサイトを信頼済みサイトゾーンに追加する必要はありません。)

または、最初の試行でエラーが発生し、Gmailアカウントに疑わしいログインに関する通知が表示されるため、指示に従って、これが実行されるマシンからの今後のログインを許可します。

0
Tom Keller

PowerShell V2 send-mailmessageを使用したことはありませんが、V1のSystem.Net.Mail.SMTPClientクラスを使用して、デモ目的でGmailアカウントにメッセージを送信しました。これはやり過ぎかもしれませんが、私のVistaラップトップでsmtpサーバーを実行します このリンク を参照してください。企業にいる場合は、すでにメール依存サーバーがあり、この手順は不要です。 smtpサーバーを使用すると、次のコードを使用してGmailアカウントにメールを送信できます。

$smtpmail = [System.Net.Mail.SMTPClient]("127.0.0.1")
$smtpmail.Send("[email protected]", "[email protected]", "Test Message", "Message via local smtp")
0
Chad Miller