Я пытаюсь создать небольшой сценарий 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()
}