简体   繁体   English

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

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

here there is a simple script to send an email.这里有一个发送 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 If I run it using Gmail settings (ie smtp.gmail.com on port 465 or 587) the script doesn't work returning the error

Server error response: 5.7.0 Authentication Required服务器错误响应: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')
    }   
}

In the cmdlet Send-MailMessage I haven't found any parameter to force authentication.在 cmdlet Send-MailMessage中,我没有找到任何强制身份验证的参数。 How can I effectively send an email?如何有效发送 email?

The SMTP server requires a secure connection or the client was not authenticated. SMTP 服务器需要安全连接或客户端未通过身份验证。 The server response was: 5.5.1 Authentication Required:服务器响应是:5.5.1 需要身份验证:

Solutions in order of likely hood to help.解决方案按可能提供帮助的顺序排列。

  1. Check if the user has 2fa enabled if so you will need an apps password检查用户是否启用了 2fa,如果是,您将需要应用程序密码
  2. Check your Captcha loc检查您的验证码位置
  3. Look into Xoauth2查看Xoauth2

I solved the issue.我解决了这个问题。 As stated here , I have to:如此所述,我必须:

1 - Force the script to use TLS 1.2 1 - 强制脚本使用 TLS 1.2

2 - Turn off two-factor authentication and allow access to insecure apps 2 - 关闭双重身份验证并允许访问不安全的应用程序

Thank you DaImTo for the inspiration感谢DaImTo的启发

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

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