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
get-credential
ne fonctionnera pasSend-MailMessage
m'intéresse, l'envoi de courrier via l'API .Net normale est bien compris.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.
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
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
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')
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!
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
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.
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)
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
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
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.
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")