Envoyer un e-mail via gmail avec L'envoi-MailMessage de PowerShell V2

j'essaie de trouver comment utiliser le Send-MailMessage de PowerShell V2 avec gmail.

voilà ce que j'ai pour l'instant.

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

j'obtiens 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 Send-MailMessage n'est pas encore complètement cuit (je suis sur CTP 3)?

Certaines restrictions supplémentaires

  1. je veux que ce soit non-interactif, donc get-credential ne sera pas travail
  2. le compte d'utilisateur n'est pas sur le domaine gmail, mais un domaine google apps enregistré""
  3. pour cette question, Je ne m'intéresse qu'au cmdlet Send-MailMessage , qui envoie du courrier via L'API normal .Net est bien compris.
37
demandé sur Scott Weinstein 2009-08-10 01:28:02

13 réponses

vient de trouver cette question .. voici mon échantillon D'envoi de PowerShell pour Gmail.. Solution testée et opérationnelle:

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

il suffit de changer $EmailTo, et nom d'utilisateur/mot de passe dans $SMTPClient.Références.. ne pas inclure @gmail.com votre nom d'utilisateur..

peut-être que ceci est une aide pour d'autres venant à travers cette question ..

41
répondu Christian Muggli 2010-02-12 07:56:04

, Cela devrait résoudre votre problème

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

puis utiliser le justificatif d'identité dans vous appelez à Send-MailMessage -From $From -To $To -Body $Body $Body -SmtpServer {$smtpServer URI} -Credential $credentials -Verbose -UseSsl

13
répondu Jstar 2015-09-03 18:06:52

j'ai juste eu le même problème et courir dans ce post. Il m'a en fait aidé à le faire tourner avec la commande native Send-MailMessage-let Et voici mon code:

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

Cependant, pour avoir Gmail me permettant d'utiliser le serveur SMTP, j'ai dû me connecter sur mon compte gmail et sous ce lien https://www.google.com/settings/security définit" accès pour les applications moins sécurisées "à"Activé". Puis, finalement, il a fait un travail!!

ciao marco

7
répondu Marco Mirandola 2014-09-03 14:38:52

Je ne suis pas sûr que vous puissiez changer les numéros de port avec Send-MailMessage puisque gmail travaille sur le port 587. Quoi qu'il en soit, voici comment envoyer un e-mail 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('GmailUserID@gmail.com','yourself@somewhere.com','test subject', 'test message')
6
répondu Shay Levy 2010-07-08 15:45:47

J'ai utilisé la solution du 12 février de Christian et je commence juste à apprendre PowerShell. En ce qui concerne les pièces jointes, je fouillais autour avec Get-Member pour apprendre comment cela fonctionne et j'ai remarqué que Send() a deux définitions... la deuxième définition prend un système.Net.Courrier.MailMessage objet qui permet des pièces jointes et de nombreuses fonctionnalités plus puissantes et utiles comme Cc et Bcc. Voici un exemple qui a des attachements (à 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)

Profitez-en!

4
répondu core 2010-07-08 15:43:34

c'est une date vraiment tardive dans laquelle sonner ici, mais peut-être que cela peut aider quelqu'un d'autre.

je suis vraiment nouveau à powershell et je cherchais à propos de gmailing à partir de PS. J'ai pris ce que vous avez fait ci-dessus, et je l'ai modifié un peu et j'ai trouvé un script qui vérifiera les pièces jointes avant de les ajouter, et aussi de prendre un tableau de destinataires. Je vais ajouter plus de vérification d'erreur et des trucs plus tard, mais j'ai pensé qu'il pourrait être assez bon (et de base suffisamment) pour poster ici.

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

bien sûr, changez les valeurs GMAIL_USERNAME et GMAIL_PASSWORD pour votre utilisateur particulier et passez.

3
répondu Rodney Fisk 2011-02-13 19:05:44

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

Profiter

3
répondu BSF 2014-11-15 02:12:29

sur une machine Windows 8.1 j'ai eu Send-MailMessage pour envoyer un email avec une pièce jointe par GMail en utilisant le script suivant:

$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
2
répondu Andy Urban 2014-09-14 18:19:38

envoyer un courriel avec pièce jointe en utilisant 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
répondu udit043 2015-05-07 05:50:17

ici c'est

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

faites-moi savoir si cela vous aide San aussi utiliser le send-mailmessage aussi à Www.techjunkie.tv Pour cette voie aussi que je pense est beaucoup mieux et propre à utiliser

1
répondu Scottalvarino.com 2011-03-26 12:46:44

Je n'ai pas utilisé PowerShell V2 send-mailmessage, mais j'ai utilisé le système.Net.Courrier.Classe SMTPClient dans V1 pour envoyer des messages à un compte gmail à des fins de démonstration. Cela pourrait être exagéré, mais exécuter un serveur smtp sur mon ordinateur portable Vista voir ce lien , si vous êtes dans une entreprise, vous aurez déjà un serveur mail rely et cette étape n'est pas nécessaire. Ayant un serveur smtp je suis en mesure d'envoyer un e-mail à mon compte gmail avec le code suivant:

$smtpmail = [System.Net.Mail.SMTPClient]("127.0.0.1")
$smtpmail.Send("myacct@gmail.com", "myacct@gmail.com", "Test Message", "Message via local smtp")
0
répondu Chad Miller 2009-08-10 17:28:58

je suis d'accord avec la solution de Christian Muggli, bien qu'au début j'ai toujours eu l'erreur que Scott Weinstein a rapporté.

soit se connecter d'abord à gmail depuis la machine sur laquelle il s'exécute, en utilisant le compte spécifié. (Il N'est pas nécessaire d'ajouter des sites google à la zone des Sites de confiance, même si la Configuration de sécurité améliorée D'Internet Explorer est activée.)

OU, sur votre première tentative, vous obtiendrez l'erreur, et votre gmail acct obtiendra un avis au sujet de connexion suspecte, alors suivez leurs instructions pour permettre de futures connexions à partir de la machine sur laquelle cela va s'exécuter.

0
répondu Tom Keller 2013-04-09 07:40:30