OpenPop в Powershell. Получение «Аутентификация не удалась, потому что удаленная сторона закрыла транспортный поток». - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь создать небольшой сценарий PowerShell для обработки внутренней электронной почты в базе данных электронной почты Exchange.

Я нашел сборку OpenPop, которая может справиться с этим, но когда я пытаюсь подключиться к серверу я получаю неудачную аутентификацию. Полное сообщение:

C: \ Users \ Administrator \ Desktop \ Outlook365ReadEMail \ Outlook365ReadEMail_POP.ps1: Обнаружено исключение: исключение, вызывающее «Подключиться» с аргументом (ами) «3»: «Ошибка аутентификации, потому что удаленная сторона закрыла транспортный поток». + CategoryInfo: NotSpecified: (:) [Ошибка записи], WriteErrorException + FullyQualifiedErrorId: Microsoft.PowerShell.Commands.WriteErrorException, Outlook365ReadEMail_POP.ps1

То, что я проверил до сих пор ..

  • Я проверил, работает ли сетевая связь
  • Я проверил, будет ли pop работать с почтовым клиентом - который работает (я использовал thunderbird, чтобы установить соединение, никаких проблем)
  • .. .проверив это, я подтвердил, что учетные данные также в порядке - они

Я верю, что проблема связана с SSL / TLS.

  • Я пробовал чтобы добавить эту строку в скрипт для обеспечения соблюдения tls1.2

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

Это тоже ничего не меняет.

А вот и скрипт, до которого я дошел ...

function makePOP3Client
   {
   Param
      (
      [string] $server,
      [int] $port,
      [bool] $enableSSL,
      [string] $username,
      [string] $password
      )

   $pop3Client = New-Object OpenPop.Pop3.Pop3Client

   $pop3Client.connect( $server, $port, $enableSSL )

   if ( !$pop3Client.connected )
      {
      throw "Unable to create POP3 client. Connection failed with server $server"
      }

   $pop3Client.authenticate( $username, $password )

   return $pop3Client
   }

#enforce tls 1.2
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

# Path configurations
$openPopLibraryURL = "C:\Users\Administrator\Desktop\Outlook365ReadEMail\Binaries\OpenPop.dll"
$tempBaseURL = "C:\Users\Administrator\Desktop\Outlook365ReadEMail\Temp\"
$testMessageURL = "C:\Users\Administrator\Desktop\Outlook365ReadEMail\Examples\example.eml"

# Incoming email configuration used for fetching messages
$incomingUsername  = "username"
$incomingPassword  = "password"
$incomingServer    = "myserver.mydomain.net"
$incomingPortPOP3  = 995   # Normally 110 (not secure), or 995 (SSL)
$incomingEnableSSL = $true

# Connect to the POP3 server and fetch messages
[Reflection.Assembly]::LoadFile( $openPopLibraryURL )

try {
   Write-Host "Connecting to POP3 server: $incomingServer`:$incomingPortPOP3"

   $pop3Client = makePOP3Client `
      $incomingServer $incomingPortPOP3 $incomingEnableSSL `
      $incomingUsername $incomingPassword

   Remove-Variable -Name incomingPassword

   fetchAndListMessages $pop3Client 10
   fetchAndSaveMessages $pop3Client 10 $tempBaseURL
   fetchAndSaveAttachments $pop3Client 10 $tempBaseURL
   loadAndListMessage $testMessageURL

   Write-Host "Disconnecting from POP3 server: $incomingServer`:$incomingPortPOP3"

   if ( $pop3Client.connected )
      {
      $pop3Client.disconnect()
      }

   $pop3Client.dispose()

   Remove-Variable -Name pop3Client
   }

catch { Write-Error "Caught exception:`n`t$PSItem" }

Я пробовал другой способ .. без "OpenPop" ... та же ошибка.

# foren entry hier: https://www.itnator.net/pop3-postfach-mit-powershell-loschen/

# POP HOST
$pop_host = "myhost.mydomain.net"
# POP SSL PORT
$pop_port = 995
# POP USERNAME
$pop_username = "myuser"
# POP PASSWORD
$pop_password = 'mypassword'

#enforce tls 1.2
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

function Get-Response([string]$command){
    try{
        if ($command -ne ''){
            if ($client.Connected){
                $command = $command + "`r`n"
                $bytes = [System.Text.ASCIIEncoding]::ASCII.GetBytes($command)
                $ssl.Write($bytes,0,$bytes.length)
            }else{
                throw "TCP Verbindung getrennt."
            }
        }
        $ssl.Flush()
        $data = @()
        $sr = New-Object System.IO.StreamReader $ssl
        while ($sr.Peek() -gt -1){$data += $sr.ReadLine()}
        return $data
    }catch{
        throw $_.Exception.Message
    }
}


try{
    $client = New-Object System.Net.Sockets.TcpClient($pop_host,$pop_port)
    $ssl = New-Object System.Net.Security.SslStream($client.GetStream())
    $ssl.ReadTimeout = 20 * 1000
    $ssl.AuthenticateAsClient($pop_host)
    Get-Response ""
    Get-Response "USER $pop_username"
    Get-Response "PASS $pop_password"
    Get-Response "LIST" | ?{$_ -match '^(\d+) \d+'} | %{
        #Get-Response "DELE $($matches[1])"
        write-Host "DELE $($matches[1])"
    }
    Get-Response "QUIT"
}catch{
    write-host $_.Exception.Message
}finally{
    $ssl.close()
    $ssl.Dispose()
    $client.Close()
    $client.Dispose()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...