发送电子邮件的脚本不适用于 Gmail 帐户
Script for sending email doesn't work with Gmail account
这里有一个发送电子邮件的简单脚本。
如果我运行它使用 Gmail 设置(即 smtp.gmail.com 在端口 465 或 587 上)脚本无法返回错误
Server error response: 5.7.0 Authentication Required
# graphical stuff
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
Add-Type -AssemblyName PresentationFramework
# import modules
$workdir = Get-Location
Import-Module -Name "$workdir\Modules\Forms.psm1" # module for windows forms
$answ = [System.Windows.MessageBox]::Show("Configure for sending mail alerts?",'ALERTS','YesNo','Info')
if ($answ -eq "Yes") {
# dialog box
$formail = New-Object System.Windows.Forms.Form
$formail.Text = "CONFIG"
$formail.Size = "500,300"
$formail.StartPosition = 'CenterScreen'
$formail.Topmost = $true
$address = New-Object System.Windows.Forms.Label
$address.Location = New-Object System.Drawing.Size(10,20)
$address.Size = New-Object System.Drawing.Size(120,20)
$address.Text = "Mail address:"
$formail.Controls.Add($address)
$addressbox = New-Object System.Windows.Forms.TextBox
$addressbox.Location = New-Object System.Drawing.Point(130,20)
$addressbox.Size = New-Object System.Drawing.Size(300,20)
$formail.Add_Shown({$addressbox.Select()})
$formail.Controls.Add($addressbox)
$passwd = New-Object System.Windows.Forms.Label
$passwd.Location = New-Object System.Drawing.Size(10,50)
$passwd.Size = New-Object System.Drawing.Size(120,20)
$passwd.Text = "Password:"
$formail.Controls.Add($passwd)
$passwdbox = New-Object System.Windows.Forms.MaskedTextBox
$passwdbox.PasswordChar = '*'
$passwdbox.Location = New-Object System.Drawing.Point(130,50)
$passwdbox.Size = New-Object System.Drawing.Size(300,20)
$formail.Add_Shown({$passwdbox.Select()})
$formail.Controls.Add($passwdbox)
$smtp = New-Object System.Windows.Forms.Label
$smtp.Location = New-Object System.Drawing.Size(10,80)
$smtp.Size = New-Object System.Drawing.Size(120,20)
$smtp.Text = "SMTP server:"
$formail.Controls.Add($smtp)
$smtpbox = New-Object System.Windows.Forms.TextBox
$smtpbox.Location = New-Object System.Drawing.Point(130,80)
$smtpbox.Size = New-Object System.Drawing.Size(300,20)
$formail.Add_Shown({$smtpbox.Select()})
$formail.Controls.Add($smtpbox)
$port = New-Object System.Windows.Forms.Label
$port.Location = New-Object System.Drawing.Size(10,110)
$port.Size = New-Object System.Drawing.Size(120,20)
$port.Text = "Port:"
$formail.Controls.Add($port)
$portbox = New-Object System.Windows.Forms.TextBox
$portbox.Location = New-Object System.Drawing.Point(130,110)
$portbox.Size = New-Object System.Drawing.Size(300,20)
$portbox.Text = '587'
$formail.Add_Shown({$portbox.Select()})
$formail.Controls.Add($portbox)
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = "150,160"
$OKButton.Size = '100,30'
$OKButton.Text = "Ok"
$OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$formail.AcceptButton = $OKButton
$formail.Controls.Add($OKButton)
$result = $formail.ShowDialog()
# setting credentials
$usr = $addressbox.Text
$pwd = ConvertTo-SecureString $passwdbox.Text -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential($usr, $pwd)
# define email content
$subject = 'TestMail.ps1'
$body = "Questa mail è stata mandata da uno script PowerShell"
# sending email
$ErrorActionPreference= 'Stop'
Try {
Send-MailMessage -From $addressbox.Text `
-To $addressbox.Text `
-Subject $subject `
-Body $body `
-SmtpServer $smtpbox.Text `
-UseSsl `
-Port $portbox.Text `
-Credential $credential
$ErrorActionPreference= 'Inquire'
}
Catch {
Write-Output "`nError: $($error[0].ToString())"
$answ = [System.Windows.MessageBox]::Show("Sending alert email failed",'WARNING','Ok','Warning')
}
}
在 cmdlet Send-MailMessage 中,我没有找到任何强制身份验证的参数。如何有效地发送电子邮件?
The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication Required:
解决方案按可能提供帮助的顺序排列。
- 检查用户是否启用了 2fa,如果是,您将需要 apps password
- 检查你的Captcha loc
- 调查Xoauth2
我解决了这个问题。如前所述 here,我必须:
1 - 强制脚本使用 TLS 1.2
2 - 关闭双因素身份验证并允许访问不安全的应用程序
谢谢DaImTo的启发
这里有一个发送电子邮件的简单脚本。
如果我运行它使用 Gmail 设置(即 smtp.gmail.com 在端口 465 或 587 上)脚本无法返回错误
Server error response: 5.7.0 Authentication Required
# graphical stuff
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
Add-Type -AssemblyName PresentationFramework
# import modules
$workdir = Get-Location
Import-Module -Name "$workdir\Modules\Forms.psm1" # module for windows forms
$answ = [System.Windows.MessageBox]::Show("Configure for sending mail alerts?",'ALERTS','YesNo','Info')
if ($answ -eq "Yes") {
# dialog box
$formail = New-Object System.Windows.Forms.Form
$formail.Text = "CONFIG"
$formail.Size = "500,300"
$formail.StartPosition = 'CenterScreen'
$formail.Topmost = $true
$address = New-Object System.Windows.Forms.Label
$address.Location = New-Object System.Drawing.Size(10,20)
$address.Size = New-Object System.Drawing.Size(120,20)
$address.Text = "Mail address:"
$formail.Controls.Add($address)
$addressbox = New-Object System.Windows.Forms.TextBox
$addressbox.Location = New-Object System.Drawing.Point(130,20)
$addressbox.Size = New-Object System.Drawing.Size(300,20)
$formail.Add_Shown({$addressbox.Select()})
$formail.Controls.Add($addressbox)
$passwd = New-Object System.Windows.Forms.Label
$passwd.Location = New-Object System.Drawing.Size(10,50)
$passwd.Size = New-Object System.Drawing.Size(120,20)
$passwd.Text = "Password:"
$formail.Controls.Add($passwd)
$passwdbox = New-Object System.Windows.Forms.MaskedTextBox
$passwdbox.PasswordChar = '*'
$passwdbox.Location = New-Object System.Drawing.Point(130,50)
$passwdbox.Size = New-Object System.Drawing.Size(300,20)
$formail.Add_Shown({$passwdbox.Select()})
$formail.Controls.Add($passwdbox)
$smtp = New-Object System.Windows.Forms.Label
$smtp.Location = New-Object System.Drawing.Size(10,80)
$smtp.Size = New-Object System.Drawing.Size(120,20)
$smtp.Text = "SMTP server:"
$formail.Controls.Add($smtp)
$smtpbox = New-Object System.Windows.Forms.TextBox
$smtpbox.Location = New-Object System.Drawing.Point(130,80)
$smtpbox.Size = New-Object System.Drawing.Size(300,20)
$formail.Add_Shown({$smtpbox.Select()})
$formail.Controls.Add($smtpbox)
$port = New-Object System.Windows.Forms.Label
$port.Location = New-Object System.Drawing.Size(10,110)
$port.Size = New-Object System.Drawing.Size(120,20)
$port.Text = "Port:"
$formail.Controls.Add($port)
$portbox = New-Object System.Windows.Forms.TextBox
$portbox.Location = New-Object System.Drawing.Point(130,110)
$portbox.Size = New-Object System.Drawing.Size(300,20)
$portbox.Text = '587'
$formail.Add_Shown({$portbox.Select()})
$formail.Controls.Add($portbox)
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = "150,160"
$OKButton.Size = '100,30'
$OKButton.Text = "Ok"
$OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$formail.AcceptButton = $OKButton
$formail.Controls.Add($OKButton)
$result = $formail.ShowDialog()
# setting credentials
$usr = $addressbox.Text
$pwd = ConvertTo-SecureString $passwdbox.Text -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential($usr, $pwd)
# define email content
$subject = 'TestMail.ps1'
$body = "Questa mail è stata mandata da uno script PowerShell"
# sending email
$ErrorActionPreference= 'Stop'
Try {
Send-MailMessage -From $addressbox.Text `
-To $addressbox.Text `
-Subject $subject `
-Body $body `
-SmtpServer $smtpbox.Text `
-UseSsl `
-Port $portbox.Text `
-Credential $credential
$ErrorActionPreference= 'Inquire'
}
Catch {
Write-Output "`nError: $($error[0].ToString())"
$answ = [System.Windows.MessageBox]::Show("Sending alert email failed",'WARNING','Ok','Warning')
}
}
在 cmdlet Send-MailMessage 中,我没有找到任何强制身份验证的参数。如何有效地发送电子邮件?
The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication Required:
解决方案按可能提供帮助的顺序排列。
- 检查用户是否启用了 2fa,如果是,您将需要 apps password
- 检查你的Captcha loc
- 调查Xoauth2
我解决了这个问题。如前所述 here,我必须:
1 - 强制脚本使用 TLS 1.2
2 - 关闭双因素身份验证并允许访问不安全的应用程序
谢谢DaImTo的启发