繁体   English   中英

用于发送 email 的脚本不适用于 Gmail 帐户

[英]Script for sending email doesn't work with Gmail account

这里有一个发送 email 的简单脚本。

If I run it using Gmail settings (ie smtp.gmail.com on port 465 or 587) the script doesn't work returning the error

服务器错误响应: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中,我没有找到任何强制身份验证的参数。 如何有效发送 email?

SMTP 服务器需要安全连接或客户端未通过身份验证。 服务器响应是:5.5.1 需要身份验证:

解决方案按可能提供帮助的顺序排列。

  1. 检查用户是否启用了 2fa,如果是,您将需要应用程序密码
  2. 检查您的验证码位置
  3. 查看Xoauth2

我解决了这个问题。 如此所述,我必须:

1 - 强制脚本使用 TLS 1.2

2 - 关闭双重身份验证并允许访问不安全的应用程序

感谢DaImTo的启发

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM