theunreal
Goto Top

Powershellscript ändert CSV Codierung?

Moin zusammen,

ich habe mir (ich glaube es war tatsächlich hier) ein Powershellscript besorgt, mit dem ich automatisiert Emailanhänge speichern kann.


# ---------------------------------
# Anhang-Pfad
$DOWNLOADPATH = 'D:\yourpath\anhang'  
# IMAP-Host
$IMAP_HOST = 'imap.yourdomain.de'  
# IMAP-Port
$IMAP_PORT = 993
# IMAP USERNAME
$IMAP_USERNAME = 'YOURUSERNAME'  
# IMAP PASSWORD
$IMAP_PASSWORD = 'YOURPASSWORD'  
# SSL verwenden
$IMAP_USESSL = $true
# ---------------------------------
if ($PSVersionTable.PSVersion.Major -lt 3){write-host "ERROR: Minimum Powershell Version 3.0 is required!" -F Yellow; return}    
# IMAPX DLL laden
Add-Type -Path "$PSScriptRoot\ImapX.dll"  
# Ordner erstellen, wenn er nicht existiert
if (!(Test-Path $DOWNLOADPATH)){md $DOWNLOADPATH -Force | out-null}
# IMAPX Eigenschaften festlegen
$imap = New-Object ImapX.ImapClient
$imap.Behavior.MessageFetchMode = [ImapX.Enums.MessageFetchMode]::Full
$imap.Host = $IMAP_HOST
$imap.Port = $IMAP_PORT
$imap.UseSsl = $IMAP_USESSL
try{
    # Verbinden
    $imap.Connect() | out-null
    # Login
    $imap.Login($IMAP_USERNAME,$IMAP_PASSWORD) | out-null
    # ungelesene Nachrichten im Posteingang laden
    $messages = $imap.Folders.Inbox.Search("UNSEEN",[ImapX.Enums.MessageFetchMode]::Full,1000)  
    # wenn es Nachrichten gibt
    if($messages.Count -gt 0){
        # Für jede Nachricht
        foreach ($m in $messages){
            # Durchlaufe jedes Attachment
            foreach($a in $m.Attachments){
                try{
                    # Ist das Attachment aus einem Grund noch nicht heruntergeladen, lade es
                    if (!$a.Downloaded){$a.Download()}
                    # Zieldateiname  = Dateiname des Original-Attachments
                    $targetfile = $a.FileName; $cnt = 1
                    # Sollte bereits eine Datei mit diesem Zielnamen im Download-Ordner existieren hänge an den Namen so lange eine
                    # Zahl an _NN bis der Name frei ist.
                    #----------------------------------------------------------------------------------------------------------------------------------------------
                    # Irgendwo hier vermute ich das Problem :)
                    while(Test-Path "$DOWNLOADPATH\$targetfile"){  
                        **$targetfile = "$([IO.Path]::GetFileNameWithoutExtension($a.Filename))_$("{0:00}" -f $cnt)$([IO.Path]::GetExtension($a.Filename))"  
                        $cnt++
                    }
                    write-host "Saving Attachment '$targetfile' ($("{0:F3} MB" -F ($a.FileSize / 1MB))) ... " -NoNewline -ForegroundColor Green  
                    $a.Save($DOWNLOADPATH,$targetfile)**
                     #---------------------------------------------------------------------------------------------------------------------------------------------
                    Write-Host "Done." -ForegroundColor Green  
                }catch{
                    write-Error "Error with Attachment: '$($a.FileName)' of Message with ID '$($m.MessageId)': $($_.Exception.Message)" -EA Continue  
                }
            }
            # markiere die Nachricht als gelesen
            $m.Seen = $true
        }
    }else{
        # Keine ungelesenen Nachrichten vorhanden
        write-host "No unseen message in inbox."  
    }
    # Beende Session
    $imap.Disconnect()
}catch{
    throw $_
}finally{
    $imap.Dispose()
}

Ursprünglich haben wir von einem FTP Server XML-Dateien in unser ERP gepollt - nun wurde die EDV dort von XML per FTP auf CSV per Email umgestellt und der Anhang sollte automatisiert gespeichert werden um ihn dort abzuholen. Funktioniert erstklassig mit dem Script - eigentlich face-smile.
Irgendetwas wird beim ablösen aus der Email verändert, sodass die Codierung der Sonderzeichen nicht mehr stimmt. Statt ö/ä werden ?? von der CSV genutzt. Ich habe mir diverse Infos zum Thema UTF8, ISO 8859 etc durchgelesen, aber irgendwie verstehe ich dieses Kapitel überhaupt nicht - ein "?" ist in allen Tabellen hexadezimal F3...(einegworfen - falls jemand ein leicht verständliches tutorial dazu kennt immer ehr damit^^).

Die Frage : Kann mir jemand helfen, dem Script beizubringen die Codierung nicht zu ändern und tatsächlich den Anhang "as it is" zu speichern?

Gruß
Unreal

Content-ID: 373776

Url: https://administrator.de/contentid/373776

Ausgedruckt am: 22.11.2024 um 07:11 Uhr

136166
Lösung 136166 14.05.2018 aktualisiert um 10:13:52 Uhr
Goto Top
Ich schätze du nutzt eine verbuggten Imapx.dll. Da gibt es einige Versionen die Probleme mit dem Attachmenthandling bei manchen Mails haben.
TheUnreal
TheUnreal 14.05.2018 um 10:20:08 Uhr
Goto Top
Moin,
danke für den schnellen Kommentar - das werde ich direkt checken !
TheUnreal
TheUnreal 14.05.2018 um 12:50:16 Uhr
Goto Top
Wirklich gelöst ist es nicht - aber nachdem ich in der Powershell IDE mal die Variablen beim durchlauf angesehen habe ist mir aufgefallen dass *.csv als "encoded-US ACSII" durchgereicht wird, während eine TXT die direkt aus der CSV erstellt wurde UTF-8 codiert ist. Da liegt also der Hase im Pfeffer.

Da das ganze über die DLL gesteuert wird, hat ReadyPlayerOne schon recht - nur habe ich v2.0 - 4.6 ausprobiert und KEINE geht face-sad.

Gibt es alternativen um einen Emailanhang zu lösen?
136166
136166 14.05.2018 aktualisiert um 12:55:42 Uhr
Goto Top
Datei einfach vor dem Versenden zippen oder eines der vielen NET Controls nutzen ...
https://www.google.de/search?q=.net+imap+library
TheUnreal
TheUnreal 21.05.2018 um 13:59:45 Uhr
Goto Top
Wenn es denn so einfach wäre würde ich die Datei als txt erhalten, aber ich habe auf das erhaltene Format leider keinen Einfluss.