Solución:
Encontré este sitio de blog: Adam Kahtava
También encontré esta pregunta: send-mail-via-gmail-with-powershell-v2s-send-mailmessage
El problema es que ninguno de ellos abordó sus dos necesidades (archivo adjunto con 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)
Como me encanta hacer funciones para las cosas, y necesito toda la práctica que pueda obtener, seguí adelante 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, simplemente use 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 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 comenzar. ¡Que tengas una buena semana!
Editar: Agregado $EmailFrom
basado en el comentario de JuanPablo
Editar: SMTP se deletreaba STMP en los archivos adjuntos.
Me tomó un tiempo combinar todo, hacerlo un poco seguro y hacerlo funcionar con Gmail. Espero que esta respuesta le ahorre a alguien algo de tiempo.
Cree un archivo con la contraseña del servidor encriptada:
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)
Automatizar con el Programador de tareas:
Cree un archivo por lotes (por ejemplo, emailFile.bat) con lo siguiente:
powershell -ExecutionPolicy ByPass -File C:sendEmail.ps1
Cree 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 que inició sesión)
Eso es todo; ahora tiene una forma de automatizar y programar el envío de un correo electrónico y un archivo adjunto con el Programador de tareas de Windows y Powershell. No hay software de terceros y la contraseña no se almacena 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.
Y aquí hay un simple Send-MailMessage
ejemplo con nombre de usuario / contraseña para cualquiera que busque precisamente eso
$secpasswd = ConvertTo-SecureString "PlainTextPassword" -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential ("username", $secpasswd)
Send-MailMessage -SmtpServer mysmptp -Credential $cred -UseSsl -From '[email protected]' -To '[email protected]' -Subject 'TEST'