我将凭据传递给Send-MailMessage
命令时遇到了困难
这就是我正在运行的:
Send-MailMessage -smtpServer smtp.gmail.com -from 'myself@gmail.com' `
-to 'myself@gmail.com' -subject 'Test' -attachment C:\CDF.pdf
Run Code Online (Sandbox Code Playgroud)
它错误显示在消息下方,这显然是因为我没有通过我的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.
Run Code Online (Sandbox Code Playgroud)
我google了一下,也浏览了手册页,Send-MailMessage
发现需要传递"-credential"参数.
我的问题是:怎么样?
我尝试使用Get-Credentials,如下所示:
$mycredentials = Get-Credential
Run Code Online (Sandbox Code Playgroud)
然后在弹出的框中输入我的用户名和密码.
然后我运行以下命令:
Send-MailMessage -smtpServer smtp.gmail.com -credentail $mycredentials `
-from 'myself@gmail.com' -to 'myself@gmail.com' -subject 'Test' -attachment C:\CDF.pdf
Run Code Online (Sandbox Code Playgroud)
并且它仍然以完全相同的错误失败.
所以我需要你们帮助我们如何将我的证书传递给Send-MailMessage
命令.我了解了PScredentials,但不完全确定它是什么以及如何在这种情况下使用它.
Nic*_*ick 37
我发现这个博客网站:Adam Kahtava
我也发现了这个问题:send-mail-via-gmail-with-powershell-v2s-send-mailmessage
问题是,它们都没有解决你的需求(附件用密码),所以我做了两者的组合并得出了这个:
$EmailTo = "myself@gmail.com"
$EmailFrom = "me@mydomain.com"
$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)
Run Code Online (Sandbox Code Playgroud)
既然我喜欢为事物做功能,而且我需要我能得到的所有练习,我继续写下这个:
Function Send-EMail {
Param (
[Parameter(`
Mandatory=$true)]
[String]$EmailTo,
[Parameter(`
Mandatory=$true)]
[String]$Subject,
[Parameter(`
Mandatory=$true)]
[String]$Body,
[Parameter(`
Mandatory=$true)]
[String]$EmailFrom="myself@gmail.com", #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
Run Code Online (Sandbox Code Playgroud)
要调用它,只需使用此命令:
Send-EMail -EmailTo "Myself@gmail.com" -Body "Test Body" -Subject "Test Subject" -attachment "C:\cdf.pdf" -password "Passowrd"
Run Code Online (Sandbox Code Playgroud)
我知道把密码简单地放在那里是不安全的.我会看看我是否可以提出更安全的东西并在以后更新,但至少这应该可以帮助您了解入门所需的内容.祝你度过愉快的一周!
编辑:$EmailFrom
根据JuanPablo的评论添加
编辑:SMTP在附件中拼写为STMP.
Dim*_*ima 15
我花了一段时间来整合所有内容,使其有点安全,并让它与Gmail一起使用.我希望这个答案能节省一些时间.
使用加密的服务器密码创建文件:
在Powershell中,输入以下命令(将myPassword替换为您的实际密码):
"myPassword" | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-File "C:\EmailPassword.txt"
Run Code Online (Sandbox Code Playgroud)
创建一个powershell脚本(例如sendEmail.ps1):
$User = "usernameForEmailPassword@gmail.com"
$File = "C:\EmailPassword.txt"
$cred=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, (Get-Content $File | ConvertTo-SecureString)
$EmailTo = "emailTo@yahoo.com"
$EmailFrom = "emailFrom@gmail.com"
$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)
Run Code Online (Sandbox Code Playgroud)
使用任务计划程序自动执行:
使用以下命令创建批处理文件(例如,emailFile.bat):
powershell -ExecutionPolicy ByPass -File C:\sendEmail.ps1
Run Code Online (Sandbox Code Playgroud)
创建任务以运行批处理文件.注意:您必须使用与加密密码相同的用户帐户运行任务!(Aka,可能是登录用户)
就这样; 您现在可以使用Windows任务计划程序和Powershell自动执行和计划发送电子邮件和附件.没有第三方软件和密码不会以纯文本形式存储(虽然已授予,但也不是非常安全).
您还可以阅读本文提供的有关您的电子邮件密码的安全级别.
小智 6
PSH> $ cred = Get-Credential
PSH> $ cred | Export-CliXml c:\ temp\cred.clixml
PSH> $ cred2 = Import-CliXml c:\ temp\cred.clixml
这会将其与您的SID和机器的SID进行哈希处理,因此该文件在任何其他计算机或其他任何人的手中都无法使用.
这是一个简单的Send-MailMessage
带有用户名/密码的例子
$secpasswd = ConvertTo-SecureString "PlainTextPassword" -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential ("username", $secpasswd)
Send-MailMessage -SmtpServer mysmptp -Credential $cred -UseSsl -From 'sender@gmail.com' -To 'recipient@gmail.com' -Subject 'TEST'
Run Code Online (Sandbox Code Playgroud)
小智 5
除了 UseSsl 之外,您还必须包括 smtp 端口 587 才能使其工作。
Send-MailMessage -SmtpServer smtp.gmail.com -Port 587 -Credential $credential -UseSsl -From 'yyy@gmail.com' -To 'xxx@email.com' -Subject 'TEST'
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
164173 次 |
最近记录: |