2009-08-09 19 views
37

Sto cercando di capire come utilizzare PowerShell V2 Send-MailMessage con gmail.Invia posta tramite Gmail con Send-MailMessage di PowerShell V2

Ecco quello che ho finora.

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

ottengo il seguente errore

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 

sto facendo qualcosa di sbagliato, o è Send-MailMessage non pienamente al forno ancora (sono in CTP 3)?

Alcune restrizioni aggiuntive

  1. io voglio che questo sia non interattivo, in modo da get-credential non funziona
  2. L'account utente non è sul dominio di Gmail, ma un registrati a Google Apps dominio
  3. Per questa domanda, sono interessato solo al cmdlet Send-MailMessage, l'invio di posta tramite la normale API .Net è ben compreso.
+0

Per quello che vale ottengo lo stesso errore e sembra che tutto è ok. Ne giocherò un po 'di più con esso. – EBGreen

+0

Bene, ora sei solo schizzinoso.: P – EBGreen

+0

Penso che il modo in cui si creano le credenziali dovrebbe essere ok. Mi sono autenticato solo direttamente su Gmail prima non tramite un dominio di app, quindi non sono sicuro che mi sarà di grande aiuto ora. Scusate. – EBGreen

risposta

6

Non sono sicuro che è possibile modificare i numeri di porta con Send-MailMessage dal gmail funziona sulla porta 587. In ogni caso, ecco come fare per inviare e-mail tramite Gmail con .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') 
0

Mi rifugio È stato utilizzato il messaggio send-mail di PowerShell V2, ma ho utilizzato la classe System.Net.Mail.SMTPClient in V1 per inviare messaggi a un account Gmail a scopo dimostrativo. Questo potrebbe essere eccessivo, ma eseguire un server smtp sul mio computer portatile Vista vedere this link, se si è in un'azienda si dispone già di un server di posta e questo passaggio non è necessario. Avere un server SMTP sono in grado di inviare e-mail al mio account Gmail con il seguente codice:

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

appena trovato questa domanda .. ecco la mia PowerShell Send-MailMessage campione per Gmail .. Testato e soluzione di lavoro:

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

basta cambiare $ emailto, e il nome utente/password in $ SMTPClient.Credentials .. non includono @ gmail.com il nome utente ..

forse questo è un aiuto per altri imbattersi in questa domanda.

+0

grazie I ' m un serverfault/superuser member e questo mi ha aiutato a fare uno script per vedere quando il mio server si riavvia. –

+2

Ci sono quasi tutti i messaggi di errore "Il server SMTP richiede una connessione sicura o il client non è stato autenticato La risposta del server è stata: 5.5.1 Autenticazione richiesta." E questo perché le impostazioni di sicurezza predefinite di Gmail bloccano il connessione, come suggerito dal messaggio automatico di Google. Quindi segui semplicemente le istruzioni nel messaggio e abilita "Accesso per app meno sicure". A tuo rischio. :) – ZZZ

+0

Inoltre, assicurati che il "Captcha" sia disabilitato - potrebbe essere necessario se stai eseguendo lo script su un server remoto (non necessario quando si esegue sul computer locale): https://accounts.google.com/DisplayUnlockCaptcha – Jens

4

Ho usato la soluzione 12 febbraio di Christian e sto anche iniziando a imparare PowerShell. Per quanto riguarda gli allegati, stavo curiosando con Get-Member per imparare come funziona e ho notato che Send() ha due definizioni ... la seconda definizione prende un oggetto System.Net.Mail.Mail.MailMessage che consente gli allegati e molti altri potenti e funzioni utili come Cc e Ccn. Ecco un esempio che deve allegati (da miscelare con il suo esempio di cui sopra):

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

Enjoy!

-2

check-out questo post per il modo di inviare allegati con gmail Powershell Examples in modo che si può vedere come inviare gli allegati utilizzando gmail Fatemi sapere se ti aiuta Scott A www.techjunkie.tv

+5

Riassumendo l'articolo collegato sarebbe utile, se possibile. –

3

È un appuntamento davvero tardivo in cui recitare qui, ma forse questo può aiutare qualcun altro.

Sono davvero nuovo in PowerShell e stavo cercando su Gmail da PS. Ho preso ciò che hai fatto in precedenza, lo ho modificato un po 'e ho creato uno script che controllerà gli allegati prima di aggiungerli e anche di prendere una serie di destinatari. Aggiungerò un po 'più di controllo degli errori e altro, ma ho pensato che potrebbe essere abbastanza buono (e abbastanza basilare) da postare qui.

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

Naturalmente, modificare i valori gmail_username e GMAIL_PASSWORD al particolare utente e passare.

1

Qui è

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

Fatemi sapere se vi aiuta a San anche utilizzare il send-MailMessage anche Www.techjunkie.tv Per questo modo, inoltre, che credo sia il modo migliore e puro utilizzare

+0

Bello e chiaro. – bgmCoder

0

Sono d'accordo con la soluzione di Christian Muggli, anche se in un primo momento ho ancora ottenuto l'errore segnalato da Scott Weinstein. Come si ottiene che:

EITHER prima accesso a gmail dalla macchina su cui verrà eseguito, utilizzando l'account specificato. (NON è necessario aggiungere alcun sito Google all'area Siti attendibili, anche se è attivata la Protezione avanzata di Internet Explorer.)

OPPURE, al primo tentativo, verrà visualizzato l'errore e il tuo account di Gmail riceverà un errore avviso di accesso sospetto, quindi seguire le loro istruzioni per consentire accessi futuri dalla macchina su cui verrà eseguito.

12

Questo dovrebbe risolvere il problema

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

quindi utilizzare la credenziale in si chiama per Send-MailMessage -From $From -To $To -Body $Body $Body -SmtpServer {$smtpServer URI} -Credential $credentials -Verbose -UseSsl

+0

Questa è di gran lunga la migliore risposta. Non c'è bisogno di andare alle classi .NET, rimanere nella sintassi di PowerShell e farlo in questo modo! – NealWalters

5

Ho appena avuto lo stesso problema e esegue in questo post. In realtà mi ha aiutato a farlo funzionare con il nativo Send-MailMessage command-let, e qui è il mio codice:

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

Tuttavia, al fine di avere Gmail che mi permette di utilizzare il server SMTP, ho dovuto effettuare il login in il mio account Gmail e sotto questo link https://www.google.com/settings/security impostano "Accesso per app meno sicure" su "Abilitato". Poi finalmente ha funzionato !!

Ciao Marco

2

Su un Windows 8.1 macchina ho avuto Send-MailMessage per inviare una e-mail con un allegato tramite Gmail utilizzando il seguente script:

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

Dopo molte prove e una lunga ricerca di soluzioni. Ho trovato un codice di script funzionale e interessante allo 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 

Godetevi

2

Invia e-mail con allegato con 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)