Отправка почты через gmail с помощью PowerShell V2 Send-MailMessage - PullRequest
41 голосов
/ 10 августа 2009

Я пытаюсь понять, как использовать PowerShell V2 Send-MailMessage с gmail.

Вот что у меня есть.

$ss = new-object Security.SecureString
foreach ($ch in "password".ToCharArray())
{
    $ss.AppendChar($ch)
}
$cred = new-object Management.Automation.PSCredential "uid@domain.com", $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 понятна.

Ответы [ 13 ]

45 голосов
/ 12 февраля 2010

Только что нашел этот вопрос .. вот мой пример PowerShell Send-MailMessage для Gmail. Проверенное и работающее решение:

$EmailFrom = "notifications@somedomain.com"
$EmailTo = "me@earth.com" 
$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 в ваше имя пользователя ..

может быть, это помощь другим, кто сталкивался с этим вопросом ..

13 голосов
/ 07 июня 2013

Это должно решить вашу проблему

$credentials = new-object Management.Automation.PSCredential “mailserver@yourcompany.com”, (“password” | ConvertTo-SecureString -AsPlainText -Force)

Затем используйте учетные данные, которые вы называете Send-MailMessage -From $From -To $To -Body $Body $Body -SmtpServer {$smtpServer URI} -Credential $credentials -Verbose -UseSsl

7 голосов
/ 03 сентября 2014

У меня была такая же проблема, и я столкнулся с этим постом. Это фактически помогло мне запустить его с помощью встроенной команды send-MailMessage-let, и вот мой код:

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

Однако, чтобы Gmail позволил мне использовать SMTP-сервер, мне пришлось войти в свою учетную запись gmail и по этой ссылке https://www.google.com/settings/security установить для «Доступ к менее защищенным приложениям» значение «Включено». Тогда наконец это сработало !!

чао марко

7 голосов
/ 10 августа 2009

Я не уверен, что вы можете изменить номера портов с помощью Send-MailMessage, так как gmail работает на порту 587. В любом случае, вот как отправлять электронную почту через gmail с помощью .NET SmtpClient:

$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('GmailUserID@gmail.com','yourself@somewhere.com','test subject', 'test message')
4 голосов
/ 08 июля 2010

Я использовал решение Christian от 12 февраля, и я только начинаю изучать PowerShell. Что касается вложений, я изучал, как работает Get-Member, и заметил, что Send () имеет два определения ... второе определение использует объект System.Net.Mail.MailMessage, который допускает вложения и многие более мощные и полезные функции, такие как 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)

Наслаждайтесь!

3 голосов
/ 15 ноября 2014

После многих испытаний и длительного поиска решений. Я нашел функциональные и интересные коды скриптов на http://www.powershellmagazine.com/2012/10/25/pstip-sending-emails-using-your-gmail-account/.

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

Send-MailMessage @param

Наслаждайтесь

3 голосов
/ 13 февраля 2011

Это действительно запоздалое свидание, но здесь может помочь кто-то еще.

Я действительно новичок в powershell, и я искал почту из PS. Я взял то, что вы, ребята, сделали выше, немного изменил и придумал скрипт, который будет проверять наличие вложений перед их добавлением, а также принимать массив получателей. Я собираюсь добавить еще несколько проверок ошибок и прочее, но я подумал, что это может быть достаточно (и достаточно просто) для публикации здесь.

## Send-Gmail.ps1 - Send a gmail message
## By Rodney Fisk - xizdaqrian@gmail.com
## 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 user@mail.com
    [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 для вашего конкретного пользователя и передайте.

2 голосов
/ 07 мая 2015

Отправить письмо с вложением, используя powershell -

      $EmailTo = "udit043.ur@gmail.com"  // abc@domain.com
      $EmailFrom = "udit821@gmail.com"  //xyz@gmail.com
      $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("udit821@gmail.com", "xxxxxxxx");    // xxxxxx-password
      $SMTPClient.Send($SMTPMessage)
2 голосов
/ 14 сентября 2014

На компьютере с Windows 8.1 я получил Send-MailMessage для отправки электронного письма с вложением через GMail, используя следующий скрипт:

$EmFrom = "user@gmail.com"    
$username = "user@gmail.com"    
$pwd = "YOURPASSWORD"    
$EmTo = "recipient@theiremail.com"    
$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
1 голос
/ 26 марта 2011

Вот оно

$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 = “username@gmail.com”
$msg.To.Add(”boss@job.com”)
$msg.Subject = “Monthly Report”
$msg.Body = “Good MorningATTACHED”
$msg.Attachments.Add($att)
$smtp.Send($msg)

Дайте мне знать, если это поможет вам. Сан также использует сообщение send-mail также по адресу Www.techjunkie.tv Для этого также, что я думаю, что лучше и чистее использовать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...