2009-08-09 52 views
37

Estoy tratando de averiguar cómo usar PowerShell V2's Send-MailMessage con gmail.Enviar correo a través de gmail con Send-MailMessage de PowerShell V2

Esto es lo que tengo hasta ahora.

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

me sale el siguiente error

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 

¿Estoy haciendo algo mal, o es Send-MailMessage no está completamente cocido sin embargo (estoy en CTP 3)?

algunas restricciones adicionales

  1. Quiero que esto no sean interactivos, por lo get-credential no funcionará
  2. La cuenta de usuario no está en el dominio de Gmail, pero un dominio de Google Apps registrado
  3. Para esta pregunta, solo estoy interesado en el cmdlet Send-MailMessage, el envío de correo a través de la API .Net normal se entiende bien.
+0

Por lo que vale la pena me da el mismo error y parece que todo está bien. Jugaré un poco más con eso. – EBGreen

+0

Bueno, ahora estás siendo exigente.: P – EBGreen

+0

Creo que la forma en que está creando la credencial debería estar bien. Solo me he autenticado directamente en Gmail antes que a través de un dominio de aplicaciones, por lo que no estoy seguro de que sea de mucha ayuda ahora. Lo siento. – EBGreen

Respuesta

6

No estoy seguro de que puede cambiar los números de puerto con Send-MailMessage desde Gmail funciona en el puerto 587. De todos modos, aquí está cómo enviar correo electrónico a través de 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

no he No usé el mensaje de envío de PowerShell V2, pero he utilizado la clase System.Net.Mail.SMTPClient en V1 para enviar mensajes a una cuenta de gmail con fines de demostración. Esto podría ser exagerado, pero ejecute un servidor smtp en mi computadora portátil Vista, vea this link, si está en una empresa ya tendrá un servidor de correo dependiente y este paso no es necesario. Tener un servidor SMTP que soy capaz de enviar correo electrónico a mi cuenta de gmail con el siguiente código:

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

acaba de encontrar esta pregunta .. aquí está mi PowerShell Enviar-MailMessage muestra para Gmail .. Probado y solución de trabajo:

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

Sólo cambia $ EmailTo, y nombre de usuario/contraseña en $ SMTPClient.Credentials .. no incluyen @ gmail.com en su nombre de usuario ..

tal vez esto es una ayuda para el otro viene a través de esta pregunta.

+0

gracias I ' m un miembro serverfault/superuser y esto me ayudó a hacer un script para ver cuando mi servidor se reinicia. –

+2

Casi allí, sin embargo, puede aparecer el mensaje de error "El servidor SMTP requiere una conexión segura o el cliente no fue autenticado. La respuesta del servidor fue: 5.5.1 Autenticación requerida." Y esto se debe a que la configuración de seguridad predeterminada de Gmail bloquea el conexión, como lo sugiere el mensaje automático de Google. Simplemente siga las instrucciones en el mensaje y habilite "Acceso para aplicaciones menos seguras". Bajo tu propio riesgo. :) – ZZZ

+0

Además, asegúrese de que el "Captcha" esté deshabilitado; esto puede ser necesario si está ejecutando el script en un servidor remoto (no es necesario cuando se ejecuta en el equipo local): https://accounts.google.com/DisplayUnlockCaptcha – Jens

4

Utilicé la solución de Christian el 12 de febrero y también estoy empezando a aprender PowerShell. En cuanto a los archivos adjuntos, estaba hurgando con Get-Member aprendiendo cómo funciona y noté que Send() tiene dos definiciones ... la segunda definición toma un objeto System.Net.Mail.MailMessage que permite archivos adjuntos y muchos más poderosos y funciones útiles como Cc y Bcc. Aquí hay un ejemplo que tiene archivos adjuntos (para ser mezclado con el ejemplo anterior):

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

¡Disfrútalo!

-2

la salida este post para la manera de enviar archivos adjuntos de Gmail con Powershell Examples de manera que se puede ver cómo enviar archivos adjuntos de Gmail usando Avísame si le ayuda a cabo Scott A www.techjunkie.tv

+5

Resumir el artículo vinculado sería útil, si eso es posible. –

3

Esta es una fecha realmente tardía en la que sonar aquí, pero tal vez esto pueda ayudar a otra persona.

Soy realmente nuevo en powershell y estaba buscando gmailing desde la PS. Tomé lo que ustedes hicieron anteriormente, lo modifiqué un poco y obtuve un script que verificará los archivos adjuntos antes de agregarlos, y también para tomar una serie de destinatarios. Voy a agregar algunas verificaciones de errores más y cosas más tarde, pero pensé que podría ser lo suficientemente bueno (y lo suficientemente básico) para publicar aquí.

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

Por supuesto, cambiar los valores gmail_username y GMAIL_PASSWORD a su usuario en particular y pase.

1

Aquí 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) 

Avisadme si le ayuda a San también utiliza el envío-MailMessage también en Www.techjunkie.tv Para esa manera también creo que es mucho mejor y puro a use

+0

Agradable y claro. – bgmCoder

0

Estoy de acuerdo con la solución de Christian Muggli, aunque al principio todavía tengo el error que informó Scott Weinstein. Cómo se pasa esto es:

YA SEA primer inicio de sesión desde Gmail desde la máquina, esto se ejecutará utilizando la cuenta especificada. (NO es necesario agregar ningún sitio de Google a la zona de Sitios de confianza, incluso si la Configuración de seguridad mejorada de Internet Explorer está habilitada).

O, en su primer intento, obtendrá el error y su cuenta de gmail obtendrá un aviso sobre el inicio de sesión sospechoso, por lo tanto, siga sus instrucciones para permitir futuros inicios de sesión de la máquina en la que se ejecutará.

12

Esto debería solucionar su problema

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

A continuación, utilice la credencial en la que llame a Send-MailMessage -From $From -To $To -Body $Body $Body -SmtpServer {$smtpServer URI} -Credential $credentials -Verbose -UseSsl

+0

Esta es de lejos la mejor respuesta. No necesita ir a clases .NET, manténgase en la sintaxis de Powershell y hágalo de esta manera. – NealWalters

5

sólo tenía el mismo problema y se encuentra con este puesto. En realidad me ayudó a ponerlo en marcha con la Enviar-MailMessage nativa de comandos-deja y aquí está mi código:

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

Sin embargo, con el fin de tener Gmail permitir que utilice el servidor SMTP, tuve que iniciar sesión en mi cuenta de gmail y en este enlace https://www.google.com/settings/security establecen el "Acceso para aplicaciones menos seguras" a "Activado". ¡Entonces finalmente funcionó!

Ciao marco

2

En un 8.1 Máquina de Windows llegué Send-MailMessage para enviar un correo electrónico con un archivo adjunto a través de Gmail mediante la siguiente secuencia de comandos:

$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

Después de muchas pruebas y una larga búsqueda de soluciones. Encontré un código de script funcional e interesante en 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 

Disfrute

2

Enviar correo electrónico con el archivo adjunto mediante 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) 
Cuestiones relacionadas