2009-08-09 6 views
37

Ich versuche herauszufinden, wie man die PowerShell V2 Send-MailMessage mit Google Mail verwendet.Senden Sie E-Mails über Google Mail mit Send-MailMessage von PowerShell V2

Hier ist, was ich bisher habe.

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

bekomme ich folgende Fehler

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 

Bin ich etwas falsch zu machen, oder ist Send-MailMessage nicht vollständig gebacken noch (ich bin auf CTP 3)?

Einige zusätzlichen Einschränkungen

  1. ich das will nicht interaktiv sein, arbeitet get-credential wird so nicht
  2. Das Benutzerkonto ist nicht auf der gmail Domain, sondern ein Google Apps-Domain
  3. registriert
  4. Bei dieser Frage interessiert mich nur das Cmdlet Send-MailMessage, das Senden von Mail über die normale .Net-API ist gut verstanden.
+0

Für was es wert ich den gleichen Fehler und es sieht aus wie alles in Ordnung ist. Ich werde noch etwas damit spielen. – EBGreen

+0

Nun, jetzt bist du nur wählerisch.: P – EBGreen

+0

Ich denke, die Art, wie Sie die Anmeldeinformationen erstellen, sollte in Ordnung sein. Ich habe mich erst direkt bei Google Mail authentifiziert, bevor ich nicht über eine App-Domain bin, also bin ich mir nicht sicher, ob ich jetzt viel helfen kann. Es tut uns leid. – EBGreen

Antwort

6

Ich bin nicht sicher, dass Sie Port-Nummern mit Send-Mailmessage ändern können, da gmail auf Port funktioniert 587. Wie auch immer, hier ist, wie mit .NET SmtpClient E-Mail über gmail senden:

$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

I haven habe PowerShell V2 send-mailmessage nicht verwendet, aber ich habe die Klasse System.Net.Mail.SMTPClient in V1 verwendet, um Nachrichten für Demozwecke an ein Google Mail-Konto zu senden. Dies könnte Overkill sein, aber führen Sie einen SMTP-Server auf meinem Vista Laptop siehe this link, wenn Sie in einem Unternehmen sind, haben Sie bereits einen Mail-Server und dieser Schritt ist nicht notwendig. Mit einem SMTP-Server Ich bin in der Lage E-Mail an meine Google Mail-Konto mit dem folgenden Code senden:

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

Genau diese Frage gefunden .. hier ist meine Powershell Verschicken Mailmessage-Beispiel für Gmail .. Getestet und Arbeitslösung:

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

Gerade $ EmailTo ändern und Benutzername/Passwort in $ SMTPClient.Credentials .. nicht enthalten @ gmail.com in Ihren Benutzernamen ..

vielleicht ist dies eine Hilfe für andere in dieser Frage kommen.

+0

danke I ' m ein Serverfault/Superuser-Mitglied und das half mir, ein Skript zu erstellen, um zu sehen, wenn mein Server neu gestartet wird. –

+2

Fast dort jedoch möglicherweise Fehlermeldung "Der SMTP-Server erfordert eine sichere Verbindung oder der Client wurde nicht authentifiziert. Die Serverantwort war: 5.5.1 Authentifizierung erforderlich." Und dies ist, weil die Standardsicherheitseinstellungen von Google Mail blockieren Verbindung, wie von der automatischen Nachricht von Google vorgeschlagen. Folgen Sie einfach den Anweisungen in der Nachricht und aktivieren Sie "Zugriff für weniger sichere Apps". Auf eigene Gefahr. :) – ZZZ

+0

Stellen Sie außerdem sicher, dass das "Captcha" deaktiviert ist - dies kann erforderlich sein, wenn Sie das Skript auf einem Remote-Server ausführen (nicht erforderlich auf dem lokalen Computer): https://accounts.google.com/DisplayUnlockCaptcha – Jens

4

Ich habe Christian Feb 12 Lösung verwendet und ich bin gerade dabei, PowerShell zu lernen. Was Attachments betrifft, habe ich mit Get-Member herumgesucht, wie es funktioniert, und festgestellt, dass Send() zwei Definitionen hat ... die zweite Definition nimmt ein System.Net.Mail.MailMessage-Objekt, das Attachments und viel mehr ermöglicht und nützliche Funktionen wie Cc und Bcc. Hier ist ein Beispiel, das Anhänge hat (mit seinem obigen Beispiel zu mischen):

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

Genießen Sie!

-2

Check out this post für die Art und Weise, Anhänge mit gmail zu senden Powershell Examples, so dass Sie sehen, wie Anhänge gmail senden Lassen Sie mich wissen, ob es Sie heraus hilft Scott A www.techjunkie.tv

+5

Die Zusammenfassung des verlinkten Artikels wäre hilfreich, wenn das möglich ist. –

3

Dies ist ein wirklich spätes Datum, um hier zu spielen, aber vielleicht kann dies jemand anderem helfen.

Ich bin wirklich neu in Powershell und ich suchte über Gmail von PS. Ich nahm, was Sie oben getan haben, und änderten es ein bisschen und haben ein Skript entwickelt, das nach Anhängen sucht, bevor sie hinzugefügt werden, und auch um ein Array von Empfängern zu nehmen. Ich werde später weitere Fehlerüberprüfungen hinzufügen, aber ich dachte, es wäre gut genug (und einfach genug), um hier zu posten.

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

Natürlich ändern die gmail_username und GMAIL_PASSWORD Werte an den betreffenden Benutzer und übergeben.

1

Hier ist es

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

Lassen Sie mich wissen, ob es Ihnen hilft, San auch die Sende-Mailmessage verwenden auch bei Www.techjunkie.tv Für diese Art und Weise auch, dass ich denke, viel besser ist und rein Verwenden Sie

+0

Schön und klar. – bgmCoder

0

Ich stimme der Lösung von Christian Muggli zu, obwohl ich zunächst immer noch den Fehler bekam, den Scott Weinstein meldete. Wie Sie daran vorbeikommen, ist:

ENTWEDER erste Anmeldung in Google Mail von der Maschine, die mit dem angegebenen Konto ausgeführt wird. (Es ist NICHT notwendig, der Zone der vertrauenswürdigen Sites Google-Sites hinzuzufügen, selbst wenn die verstärkte Sicherheitskonfiguration von Internet Explorer aktiviert ist.)

ODER, bei Ihrem ersten Versuch erhalten Sie den Fehler, und Ihr Google Mail-Konto erhält einen Wenn Sie sich über verdächtige Anmeldungen informieren, folgen Sie deren Anweisungen, um zukünftige Anmeldungen von der Maschine, auf der diese ausgeführt wird, zu erlauben.

12

Dies sollte Ihr Problem

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

dann die Anmeldeinformationen beheben verwenden in Sie Send-MailMessage -From $From -To $To -Body $Body $Body -SmtpServer {$smtpServer URI} -Credential $credentials -Verbose -UseSsl nennen

+0

Dies ist bei weitem die beste Antwort. Keine Notwendigkeit, zu .NET-Klassen zu gehen, in Powershell-Syntax zu bleiben und es so zu machen! – NealWalters

5

Ich hatte gerade das gleiche Problem und in diesem Beitrag ausgeführt werden. Es half mir wirklich, um es mit der nativen Send-Mailmessage laufenden Befehl lassen und hier ist mein Code:

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

Um jedoch Gmail zu haben mich erlaubt, den SMTP-Server zu verwenden, musste ich anmelden in mein Google Mail-Konto und unter diesem Link https://www.google.com/settings/security setzen Sie den "Zugang für weniger sichere Anwendungen" auf "aktiviert". Dann hat es endlich geklappt !!

ciao marco

2

auf einem Windows 8.1 Maschine I Send-MailMessage bekam eine E-Mail mit einem Anhang über GMail mit dem folgenden Skript zu senden:

$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

Nach vielen Tests und einer langen Suche nach Lösungen. Ich habe bei http://www.powershellmagazine.com/2012/10/25/pstip-sending-emails-using-your-gmail-account/ einen funktionsfähigen und interessanten Skriptcode gefunden.

$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 

Genießen

2

E-Mail senden mit Anhang mit 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) 
Verwandte Themen