0
votes

here there is a simple script to send an 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

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')
    }   
}

In the cmdlet Send-MailMessage I haven't found any parameter to force authentication. How can I effectively send an email?

2
This error would also occur if the username/password combo is incorrect (more likely) or the account is not authorized to connect to SMTP with password-authentication (could be the case in GSuite orgs with tight security policies)Mathias R. Jessen
username/password are correct, as well ;-)Dario Corrada
Please do not edit solution announcements into the question. Accept (i.e. click the "tick" next to it) one of the existing answer, if there are any. You can also create your own answer, and even accept it, if your solution is not yet covered by an existing answer. That is what you did, I see. So please do not work against the habits and established mechanisms of this community please.Yunnosch
Sorry, I thought that adding "SOLVED" flag to the title was a good habit since this method is adopted by most of the communities. Ok @Yunnosch, I understood.Dario Corrada
Finding your way in a new community takes some learning and time, of course. I understand. You could however demonstrate that you are serious about it, by taking the highly recommended tour. You are quite on track, by making your own answer and accepting it. Details to be "polished". Have fun.Yunnosch

2 Answers

2
votes

The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication Required:

Solutions in order of likely hood to help.

  1. Check if the user has 2fa enabled if so you will need an apps password
  2. Check your Captcha loc
  3. Look into Xoauth2
0
votes

I solved the issue. As stated here, I have to:

1 - Force the script to use TLS 1.2

2 - Turn off two-factor authentication and allow access to insecure apps

Thank you DaImTo for the inspiration