使用powershell发送电子邮件,同时在加密文件中安全地保存密码

时间:2017-02-27 16:58:28

标签: powershell email security smtp

我找到了类似的线程但没有解决我的问题。我正在尝试使用SMTP服务器发送电子邮件,附件(通过gmail)。这很容易做到。我得到的主要错误响应是

  

SMTP服务器需要安全连接,或者客户端未经过身份验证。服务器响应为:5.5.1需要身份验证。"

我认为这与将密码文件中的密码输入凭证

有关
"Password123" | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-File "C:\Folder\Password.txt"
$EmailFrom = "emailaddress@gmail.com"
$EmailTo = "otheremailaddress@gmail.com" 
$Subject = "Log file from server" 
$Subject = "Subject" 
$Body = "Here is the log file from the server" 
$File = "C:\Folder\LogFile.txt"
$attachment = New-Object System.Net.Mail.Attachment($File,'text/plain')

$mailmessage = New-Object system.net.mail.mailmessage
$mailmessage.from = ($EmailFrom)
$mailmessage.To.add($emailto)
$mailmessage.Subject = $Subject
$mailmessage.Body = $Body
$mailmessage.Attachments.Add($attachment)

$SMTPServer = "smtp.gmail.com" 
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587) 
$SMTPClient.EnableSsl = $true 

$username = "emailaddress@gmail.com"
$pass = Get-Content "C:\Folder\Password.txt" | ConvertTo-SecureString -AsPlainText -Force

$SMTPClient.Credentials = New-Object System.Net.NetworkCredential($username, $pass);

$SMTPClient.Send($mailmessage)

我想删除此代码的第一行,因为在脚本中输入密码永远不是一个好主意。

如果我将密码变量更改为以下内容我没有问题

$pass = "Password123"

我发现的所有其他论坛帖子都表明事情无法解决我的问题。

同时更改gmails设置以允许来自不太安全的应用程序的访问并不能解决我的问题。

非常感谢任何帮助

提前致谢。

编辑:

  1. 我可以使用gmail访问安全性较低的应用
  2. 我为gmail提供了2步验证
  3. 我认为问题在于读取密码文件。这是一种在加密时无法接受文件密码的情况。我尝试使用未加密的密码,但这对于编写脚本来说并不是很好。

1 个答案:

答案 0 :(得分:0)

我在过去遇到过这个问题 - 我认为Mathias已经提到了一个常见的问题 - 注意因为解码运行不同的凭据(作为计划工作运行)取决于使用用户的会话信息。我在你的例子中不太确定的一件事是你为什么要进行后续转换为纯文本 - 否则,下面应该使用你的用户名和密码,将它导出到一个文件,然后导入它作为您可以在以后使用的凭证。

$user = "UsernameGoesHere"
$passwordtostore = 'PasswordGoesHere'
$secureStringPWD = $passwordtostore | ConvertTo-SecureString -AsPlainText -Force
$secureStringText = $secureStringPWD | ConvertFrom-SecureString
Set-Content "C:\temp\authenticationfile.cfg" $secureStringText
# Retrieve password
$pwdin = Get-Content "C:\temp\authenticationfile.cfg"
$password = $pwdin | ConvertTo-SecureString
$creds = New-Object System.Management.Automation.PSCredential -ArgumentList $user,$password

希望有帮助吗?