Security 使用PowerShell V2'通过Gmail发送邮件;让我们发邮件吧

Security 使用PowerShell V2'通过Gmail发送邮件;让我们发邮件吧,security,powershell,gmail,Security,Powershell,Gmail,我正在尝试了解如何使用PowerShell V2的发送邮件消息 这是我到目前为止所拥有的 $ss = New-Object Security.SecureString foreach ($ch in "password".ToCharArray()) { $ss.AppendChar($ch) } $cred = New-Object Management.Automation.PSCredential "uid@domain.com", $ss Send-MailMessage -S

我正在尝试了解如何使用PowerShell V2的
发送邮件消息

这是我到目前为止所拥有的

$ss = New-Object Security.SecureString
foreach ($ch in "password".ToCharArray())
{
    $ss.AppendChar($ch)
}
$cred = New-Object Management.Automation.PSCredential "uid@domain.com", $ss
Send-MailMessage  -SmtpServer smtp.gmail.com -UseSsl -Credential $cred -Body...
我得到以下错误

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
Send MailMessage:SMTP服务器需要安全连接,或者客户端未通过身份验证。服务器响应为:需要5.5.1身份验证。学习
更多
在foo.ps1:18 char:21

+Send MailMessage我不确定你是否可以用Send MailMessage更改端口号,因为Gmail在587端口上工作。总之,以下是如何通过Gmail和.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('GmailUserID@gmail.com', 'yourself@somewhere.com', 'test subject', 'test message')

我没有使用PowerShell V2,但我在V1中使用了System.Net.Mail.SMTPClient类将消息发送到Gmail帐户以供演示。这可能有些过分,但我在WindowsVista笔记本电脑上运行服务器(请参阅)。如果您在企业中,您将已经有了一个邮件中继服务器,而这一步不是必需的。有了SMTP服务器,我可以用以下代码向我的Gmail帐户发送电子邮件:

$smtpmail = [System.Net.Mail.SMTPClient]("127.0.0.1")
$smtpmail.Send("myacct@gmail.com", "myacct@gmail.com", "Test Message", "Message via local SMTP")
这是我的Gmail PowerShell示例

测试和工作解决方案:

$EmailFrom = "notifications@somedomain.com"
$EmailTo = "me@earth.com"
$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)

只需将$EmailTo和$SMTPClient中的用户名/密码更改为。凭据。。。不要在您的用户名中包含@gmail.com…

我使用了Christian的2月12日解决方案,我也刚刚开始学习PowerShell。至于附件,我一直在研究Get Member的工作原理,并注意到Send()有两个定义。。。第二个定义采用System.Net.Mail.MailMessage对象,该对象允许附件和许多更强大、更有用的功能,如Cc和Bcc。下面是一个带有附件的示例(与上面的示例混合):


享受吧

我对PowerShell真的很陌生,我在PowerShell上搜索Gmail。我采用了你们在前面的答案中所做的,并对其进行了一些修改,提出了一个脚本,在添加附件之前检查附件,并获取一组收件人

## Send-Gmail.ps1 - Send a gmail message
## By Rodney Fisk - xizdaqrian@gmail.com
## 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 user@mail.com
    [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)
当然,将GMAIL_用户名和GMAIL_密码值更改为您的特定用户和密码。

这里是:

$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 = “username@gmail.com”
$msg.To.Add(”boss@job.com”)
$msg.Subject = “Monthly Report”
$msg.Body = “Good MorningATTACHED”
$msg.Attachments.Add($att)
$smtp.Send($msg)
如果对你有帮助,请告诉我。也可以在以下位置使用发送邮件消息: Www.techjunkie.tv


我也认为这样做更好、更纯粹。

我同意克里斯蒂安·穆格利的解决方案,尽管一开始我仍然得到了斯科特·温斯坦报告的错误。你如何克服这一点:

使用指定的帐户,首先从运行Gmail的机器登录Gmail。(即使启用了Internet Explorer增强的安全配置,也无需将任何Google站点添加到受信任的站点区域。)


或者,在您第一次尝试时,您将收到错误,并且您的Gmail帐户将收到关于可疑登录的通知,因此请按照他们的指示,允许将来从运行此操作的计算机进行登录。

这将解决您的问题:

$credentials = New-Object Management.Automation.PSCredential “mailserver@yourcompany.com”, (“password” | ConvertTo-SecureString -AsPlainText -Force)

然后在调用中使用凭据发送邮件消息-从$From-到$to-Body$Body-SmtpServer{$SmtpServer URI}-凭据$credentials-Verbose-usesl

我也遇到了同样的问题,因此写了这篇文章。它实际上帮助我使用本机命令let运行它,下面是我的代码:

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

然而,为了让Gmail允许我使用SMTP服务器,我必须登录到我的Gmail帐户,并在该链接下将“访问不太安全的应用程序”设置为“已启用”。最后终于成功了

在Windows 8.1机器上,我使用以下脚本通过Gmail发送了一封带有附件的电子邮件:

$EmFrom = "user@gmail.com"
$username = "user@gmail.com"
$pwd = "YOURPASSWORD"
$EmTo = "recipient@theiremail.com"
$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

经过多次测试和漫长的解决方案搜索,我在以下位置找到了一个功能强大且有趣的脚本代码:


使用PowerShell发送带有附件的电子邮件-

      $EmailTo = "udit043.ur@gmail.com"  // abc@domain.com
      $EmailFrom = "udit821@gmail.com"  // xyz@gmail.com
      $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("udit821@gmail.com", "xxxxxxxx"); // xxxxxx-password
      $SMTPClient.Send($SMTPMessage)

我在使用powershell发送邮件时遇到了很多问题。事实证明,你需要为你的gmail帐户创建一个应用程序密码,以便在脚本中进行身份验证。现在它的工作完美无瑕

值得一提的是,我也犯了同样的错误,看起来一切正常。我会再玩一玩的。好吧,现在你只是太挑剔了我认为您创建凭证的方式应该可以。我以前只直接通过gmail认证,没有通过应用程序域,所以我不确定现在能帮上什么忙。对不起,我注意到这是一个老问题(2009年),你在几年前(2011年)更新了它,但仍然没有被接受的答案。这是否意味着您永远无法解决问题?在您可以从powershell发送电子邮件之前,您必须执行一些gmail配置。在谷歌安全控制面板中启用“不太安全的应用程序”。确保禁用了双因素身份验证。此外,请确保禁用“验证码”-如果您在远程服务器上运行脚本,这可能是必需的(在本地计算机上运行时不必):谢谢,我是serverfault/超级用户成员,这帮助我创建了一个脚本,以查看服务器何时重新启动。不过,您可能会收到错误消息“SMTP服务器需要安全连接,或者客户端未通过身份验证。服务器响应为:需要5.5.1身份验证。这是因为Gmail的默认安全设置阻止了连接,正如谷歌的自动消息所建议的那样。因此,只需按照消息中的说明,启用“访问不太安全的应用程序”。风险自负。:)此外,确保“验证码”“已禁用-如果您在远程服务器上运行脚本,这可能是必需的(在本地计算机上运行时不必):是否继续使用Gmail帐户获取身份验证失败?我有这个问题,正是这个问题把我带到了这个职位上。我想我肯定出了什么问题。事实证明,我需要使用“应用程序密码”而不是我的谷歌帐户密码(因为这是MFA-multi-factor auth)。创建应用程序密码:这是迄今为止最好的答案。无需转到.NET类,只需使用Powershell语法,就可以这样做!
$param = @{
    SmtpServer = 'smtp.gmail.com'
    Port = 587
    UseSsl = $true
    Credential  = 'you@gmail.com'
    From = 'you@gmail.com'
    To = 'someone@somewhere.com'
    Subject = 'Sending emails through Gmail with Send-MailMessage'
    Body = "Check out the PowerShellMagazine.com website!"
    Attachments = 'D:\articles.csv'
}

Send-MailMessage @param
      $EmailTo = "udit043.ur@gmail.com"  // abc@domain.com
      $EmailFrom = "udit821@gmail.com"  // xyz@gmail.com
      $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("udit821@gmail.com", "xxxxxxxx"); // xxxxxx-password
      $SMTPClient.Send($SMTPMessage)