powershell - via - send-mailmessage multiple recipients
Cómo pasar credenciales al comando Send-MailMessage para enviar correos electrónicos (5)
Tengo dificultades para pasar mis credenciales al comando Send-MailMessage
Esto es lo que estoy ejecutando:
Send-MailMessage -smtpServer smtp.gmail.com -from ''[email protected]'' `
-to ''[email protected]'' -subject ''Test'' -attachment C:/CDF.pdf
errores con debajo del mensaje que es obviamente porque no he pasado mis credenciales de Gmail
Send-MailMessage : The SMTP server requires a secure connection or the client was not
authenticated. The server response was: 5.7.0 Must issue a STARTTLS command first.
Busqué en Google un poco y también fui a través de la página del hombre de Send-MailMessage
y encontré que el parámetro "-credential" necesita ser pasado.
Mi problema es: ¿CÓMO?
Intenté con Get-Credentials como a continuación:
$mycredentials = Get-Credential
Luego ingresé mi nombre de usuario y contraseña para gmail en el cuadro que aparece.
luego corro debajo del comando:
Send-MailMessage -smtpServer smtp.gmail.com -credentail $mycredentials `
-from ''[email protected]'' -to ''[email protected]'' -subject ''Test'' -attachment C:/CDF.pdf
y aún falla con exactamente el mismo error.
Así que necesito ayuda de ustedes sobre cómo paso mis credenciales al comando Send-MailMessage
. Aprendí sobre PScredentials pero no estoy seguro de qué se trata y cómo usarlo en este contexto.
PSH> $ cred = Obtener Credencial
PSH> $ cred | Export-CliXml c: / temp / cred.clixml
PSH> $ cred2 = Import-CliXml c: / temp / cred.clixml
Eso lo hace contra su SID y el SID de la máquina, por lo que el archivo es inútil en cualquier otra máquina o en manos de los demás.
Encontré este blog: Adam Kahtava
También encontré esta pregunta: send-mail-via-gmail-with-powershell-v2s-send-mailmessage
El problema es que ninguno de los dos abordaba sus necesidades (Adjunto con una contraseña), así que hice una combinación de los dos y se me ocurrió esto:
$EmailTo = "[email protected]"
$EmailFrom = "[email protected]"
$Subject = "Test"
$Body = "Test Body"
$SMTPServer = "smtp.gmail.com"
$filenameAndPath = "C:/CDF.pdf"
$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("username", "password");
$SMTPClient.Send($SMTPMessage)
Dado que me encanta hacer funciones para las cosas, y necesito toda la práctica que pueda obtener, continué y escribí esto:
Function Send-EMail {
Param (
[Parameter(`
Mandatory=$true)]
[String]$EmailTo,
[Parameter(`
Mandatory=$true)]
[String]$Subject,
[Parameter(`
Mandatory=$true)]
[String]$Body,
[Parameter(`
Mandatory=$true)]
[String]$EmailFrom="[email protected]", #This gives a default value to the $EmailFrom command
[Parameter(`
mandatory=$false)]
[String]$attachment,
[Parameter(`
mandatory=$true)]
[String]$Password
)
$SMTPServer = "smtp.gmail.com"
$SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom,$EmailTo,$Subject,$Body)
if ($attachment -ne $null) {
$SMTPattachment = New-Object System.Net.Mail.Attachment($attachment)
$SMTPMessage.Attachments.Add($SMTPattachment)
}
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)
$SMTPClient.EnableSsl = $true
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential($EmailFrom.Split("@")[0], $Password);
$SMTPClient.Send($SMTPMessage)
Remove-Variable -Name SMTPClient
Remove-Variable -Name Password
} #End Function Send-EMail
Para llamarlo, solo usa este comando:
Send-EMail -EmailTo "[email protected]" -Body "Test Body" -Subject "Test Subject" -attachment "C:/cdf.pdf" -password "Passowrd"
Sé que no es seguro poner la contraseña claramente así. Veré si puedo encontrar algo más seguro y actualizarlo más tarde, pero al menos esto debería darte lo que necesitas para empezar. ¡Que tengas una buena semana!
Editar: Agregó $EmailFrom
basado en el comentario de JuanPablo
Editar: SMTP se deletreó STMP en los archivos adjuntos.
Entonces ... era un problema de SSL. Lo que sea que estuve haciendo fue absolutamente correcto. Solo que no estaba usando la opción ssl. Así que agregué "-Usessl true" a mi comando original y funcionó.
Me tomó un tiempo combinar todo, hacerlo un poco seguro y hacer que funcione con Gmail. Espero que esta respuesta le ahorre a alguien algo de tiempo.
Crea un archivo con la contraseña del servidor cifrado:
En Powershell, ingrese el siguiente comando (reemplace myPassword con su contraseña real):
"myPassword" | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-File "C:/EmailPassword.txt"
Cree una secuencia de comandos de powershell (por ejemplo, sendEmail.ps1):
$User = "[email protected]"
$File = "C:/EmailPassword.txt"
$cred=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, (Get-Content $File | ConvertTo-SecureString)
$EmailTo = "[email protected]"
$EmailFrom = "[email protected]"
$Subject = "Email Subject"
$Body = "Email body text"
$SMTPServer = "smtp.gmail.com"
$filenameAndPath = "C:/fileIwantToSend.csv"
$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($cred.UserName, $cred.Password);
$SMTPClient.Send($SMTPMessage)
Automatice con el Programador de tareas:
Cree un archivo por lotes (por ejemplo, emailFile.bat) con lo siguiente:
powershell -ExecutionPolicy ByPass -File C:/sendEmail.ps1
Crea una tarea para ejecutar el archivo por lotes. Nota: debe ejecutar la tarea con la misma cuenta de usuario que utilizó para cifrar la contraseña. (Aka, probablemente el usuario conectado)
Eso es todo; ahora tiene una forma de automatizar y programar el envío de un correo electrónico y un archivo adjunto con Windows Task Scheduler y Powershell. No se almacena ningún software de terceros ni la contraseña como texto sin formato (aunque se otorga, tampoco es terriblemente segura).
También puede leer este artículo sobre el nivel de seguridad que proporciona para su contraseña de correo electrónico.
además de UseSsl, debe incluir el puerto smtp 587 para que funcione.
Send-MailMessage -SmtpServer smtp.gmail.com -Port 587 -Credential $credential -UseSsl -From ''[email protected]'' -To ''[email protected]'' -Subject ''TEST''