web-dev-qa-db-fra.com

Envoyez un courrier via gmail avec SendMailMessage de PowerShell V2

J'essaie de comprendre comment utiliser le Send-MailMessage de PowerShell V2 avec Gmail.

Voici ce que j'ai jusqu'à présent.

$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...

Je reçois l'erreur suivante

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

Est-ce que je fais quelque chose de mal ou est-ce que Send-MailMessage n'est pas encore complètement cuit (je suis sur CTP 3)?

Quelques restrictions supplémentaires

  1. Je veux que ce soit non interactif, donc get-credential ne fonctionnera pas
  2. Le compte d'utilisateur ne se trouve pas sur le domaine Gmail, mais sur un domaine enregistré dans Google Apps.
  3. Pour cette question, seule la cmdlet Send-MailMessage m'intéresse, l'envoi de courrier via l'API .Net normale est bien compris.
39
Scott Weinstein

Vient de trouver cette question. Voici mon exemple d’envoi de message MailServer par Gmail pour PowerShell. Solution testée et opérationnelle: 

$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)

Il suffit de changer $ EmailTo, et nom d'utilisateur/mot de passe dans $ SMTPClient.Credentials .. n'incluez pas @ gmail.com dans votre nom d'utilisateur .. 

c'est peut-être une aide pour les autres qui tombent sur cette question. 

45
Christian Casutt

Cela devrait résoudre votre problème

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

Ensuite, utilisez les informations d'identification dans votre appel à Send-MailMessage -From $From -To $To -Body $Body $Body -SmtpServer {$smtpServer URI} -Credential $credentials -Verbose -UseSsl

13
Jstar

je viens d'avoir le même problème et courir dans ce post. Cela m'a en fait aidé à le faire fonctionner avec la commande-let native Send-MailMessage et voici mon code:

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

Cependant, pour que Gmail me permette d'utiliser le serveur SMTP, je devais me connecter à mon compte gmail et sous ce lien https://www.google.com/settings/security définir le "Accès pour moins applications sécurisées "à" Activé ". Puis finalement ça a marché !!

ciao marco

7
Marco Mirandola

Je ne suis pas sûr que vous puissiez modifier les numéros de port avec Send-MailMessage puisque Gmail fonctionne sur le port 587. Quoi qu'il en soit, voici comment envoyer un courrier électronique via gmail avec .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('[email protected]','[email protected]','test subject', 'test message')
6
Shay Levy

J'ai utilisé la solution de Christian datée du 12 février et je commence tout juste à apprendre PowerShell. En ce qui concerne les pièces jointes, je m'amusais à apprendre à Get-Member comment cela fonctionne et remarquai que Send () avait deux définitions ... la deuxième définition prend un objet System.Net.Mail.MailMessage qui permet des pièces jointes et bien plus et des fonctionnalités utiles comme Cc et Cci. Voici un exemple qui a des pièces jointes (à mélanger avec son exemple ci-dessus):

# 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)

Prendre plaisir!

4
core

Après de nombreux tests et une longue recherche de solutions. J'ai trouvé un code de script fonctionnel et intéressant sur 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

Prendre plaisir

3
BSF

C’est une date très tardive, mais cela peut peut-être aider quelqu'un d’autre.

Je suis vraiment nouveau chez PowerShell et je cherchais des messages émanant du PS. J'ai pris ce que vous avez fait ci-dessus, je l'ai légèrement modifié et j'ai créé un script qui vérifie la présence de pièces jointes avant de les ajouter, ainsi qu'un tableau de destinataires. Je vais ajouter un peu plus de vérification d’erreur et d’autres choses plus tard, mais j’ai pensé que cela pourrait être assez bon (et assez basique) pour poster ici. 

## 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 )

Bien sûr, remplacez les valeurs GMAIL_USERNAME et GMAIL_PASSWORD par votre utilisateur particulier et transmettez-le.

3
Rodney Fisk

Envoyer un email avec pièce jointe à l'aide de 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

Sur une machine Windows 8.1, j'ai reçu Send-MailMessage pour envoyer un email avec une pièce jointe via GMail en utilisant le script suivant:

$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

C'est ici 

$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)

Faites-moi savoir si cela vous aide également à utiliser le message send-mail à l'adresse Www.techjunkie.tv

1
Scottalvarino.com

Je suis d’accord avec la solution de Christian Muggli, même si au début j’ai toujours eu l’erreur rapportée par Scott Weinstein. Comment vous avez dépassé cela:

SOIT la première connexion à gmail à partir de la machine sur laquelle sera exécuté le compte spécifié. (Il n'est PAS nécessaire d'ajouter de sites Google à la zone Sites de confiance, même si la configuration de sécurité renforcée d'Internet Explorer est activée.)

OU, lors de votre première tentative, vous obtiendrez l'erreur et votre compte gmail obtiendra une notification relative à une connexion suspecte. Suivez donc les instructions pour autoriser les futures connexions depuis la machine sur laquelle elle sera exécutée.

0
Tom Keller

Je n'ai pas utilisé le message d'envoi-mail de PowerShell V2, mais j'ai utilisé la classe System.Net.Mail.SMTPClient en V1 pour envoyer des messages à un compte gmail à des fins de démonstration. C’est peut-être exagéré, mais exécutez un serveur smtp sur mon ordinateur portable Vista. Voir ce lien , si vous êtes dans une entreprise, vous aurez déjà un serveur de messagerie de confiance et cette étape n’est pas nécessaire. Ayant un serveur smtp, je peux envoyer un email à mon compte gmail avec le code suivant:

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