rs-varel
Goto Top

Emails auf einem Windows Server 2012 abrufen und PDF Anhänge automatisch speichern

Hallo,

ich suche eine gute Lösung für eingehende Faxe!

Faxe werden bereits digital als Emailanhang im PDF Format zu einer Email Adresse geschickt. Ich möchte diese Email Adresse auf einem Windows Server 2012 abrufen und die PDF anhänge automatisch in einen Ordner "FAX" speichern, da das jeder Client im Netzwerk auf diese Anhänge zugreifen kann.

Das ganze habe ich Testweise mit Thunderbird realisiert. Da dieses aber kein Dienst ist, bzw nach einem Serverneustart nicht startet ( ohne das ich mich anmelde ) ist es logischerweise nur eine NOT Lösung.

Vielleicht hat jemand eine gute Idee, wie man sowas umsetzten kann.

Danke im vorraus

Content-Key: 334040

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

Ausgedruckt am: 19.03.2024 um 10:03 Uhr

Mitglied: colinardo
colinardo 04.04.2017 aktualisiert um 18:36:05 Uhr
Goto Top
Servus,
ach da gibts so viele Möglichkeiten face-smile
Hier mal zwei davon, welche sich alle per Aufgabenplanung realisieren lassen:

  • Die erste hatte ich hier schon mal gespostet und ist für IMAP Konten
E-Mail Client für Kommandozeile

  • Die Zweite wenn ein Exchange-Server im Einsatz ist mal schnell Quick n' Dirty als EWS gescriptet, welches sich periodisch aufrufen lässt:
Skript benötigt die EWS-DLL (Microsoft.Exchange.WebServices.dll) / Download hier
<#
    Extrahiert alle PDF Attachments aus den Mails der Inbox einer beliebigen Mailbox ins Dateisystem und verschiebt die Mail anschließend in einen Archivordner in der Mailbox / (c) @colinardo

   Vor dem Start des Skript ist dem User welcher das Skript später ausführt die Impersonation-Berechtigungzu erteilen:
   In diesem Beispiel der User 'Administrator' (Bitte einmalig in einer EMS ausführen)  

    New-ManagementRoleAssignment -Name:impersonationAssignmentName -Role:ApplicationImpersonation -User:Administrator
#>

# Start Variablen -------------------------------------------------------------------------
$exserver = "server.domain.tld"  
# Name des Ordners in dem die Kontake angelegt werden
$mailbox = "fax@domain.tld"  
# Name des Ablageordners der Mailbox (Unterordner des Posteingangs)
$mailboxarchive = "Archiv"  
# Dateipfad zur Ablage der PDFs
$ablage = "D:\attachments"  
# Ende Variablen -------------------------------------------------------------------------

if ($PSVersionTable.PSVersion.Major -lt 3){write-host "ERROR: Minimum Powershell Version 3.0 is required!" -F Yellow; return}    

# Active Directory Modul laden
Import-Module ActiveDirectory

# EWS DLL laden
Add-Type -Path "$(Split-Path $MyInvocation.MyCommand.Definition -Parent)\Microsoft.Exchange.WebServices.dll"  

# Allen Zertifikaten vertrauen
Add-Type @"  
    using System.Net;
    using System.Security.Cryptography.X509Certificates;
    public class TrustAllCertsPolicy : ICertificatePolicy {
        public bool CheckValidationResult(
            ServicePoint srvPoint, X509Certificate certificate,
            WebRequest request, int certificateProblem) {
            return true;
        }
    }
"@  
# Trust all certs policy dem ServicePointManager zuweisen
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy

# EWS Objekt erstellen
$ews = new-object Microsoft.Exchange.WebServices.Data.ExchangeService
$ews.Url = "https://$exserver/ews/exchange.asmx"  
# Benutze die Credentials mit dem das Skript ausgeführt wird
$ews.UseDefaultCredentials = $true
$ews.ImpersonatedUserId = New-Object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, [string]$mailbox)



# Finde Mailbox Archivordner --------------
$view = New-Object Microsoft.Exchange.WebServices.Data.FolderView(1)
$view.PropertySet = New-Object Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::IdOnly,[Microsoft.Exchange.WebServices.Data.FolderSchema]::DisplayName)
$view.Traversal = [Microsoft.Exchange.WebServices.Data.FolderTraversal]::Shallow
$filter = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo([Microsoft.Exchange.WebServices.Data.FolderSchema]::DisplayName,$mailboxarchive)
$result = $ews.FindFolders([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox,$filter,$view)
if ($result.TotalCount){
    # Ordner wurde gefunden
    $targetFolder = $result.Folders
}else{
    # Mailbox Archiv-Ordner existiert noch nicht, lege ihn an
    write-host "Creating folder '$foldername' in Mailbox." -ForegroundColor Green  
    try{
        $targetFolder = New-Object Microsoft.Exchange.WebServices.Data.Folder($ews)
        $targetFolder.DisplayName = $mailboxarchive
        $targetFolder.Save([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox)
    }catch{
        Write-Host $_ -F Red
        return
    }
}
# -----------------------------
$view = New-Object Microsoft.Exchange.WebServices.Data.ItemView(10000)
$view.PropertySet = New-Object Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties)
$result = $ews.FindItems([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox,$view)
$result.Items | ?{$_.HasAttachments} | %{
    $mail = $_
    $mail.Load()
    $mail.Attachments | ?{[IO.Path]::GetExtension($_.Name) -eq '.pdf' -and !$_.IsInline} | %{  
        # Dateiname zusammensetzen, Format: <ReceivedTime: yyyyMMdd_HHmmss>_<FILENAME>_<DATETIME TICKS>.pdf
        $getnewfilepath = {$ablage + "\" + ($mail.DateTimeReceived.toString('yyyyMMdd_HHmmss')) + "_" + [IO.Path]::GetFileNameWithoutExtension($_.Name) + "_" + (get-date).Ticks + [IO.Path]::GetExtension($_.Name)}  
        $filepath = . $getnewfilepath
        # Prüfen ob Dateiname schon existiert, wenn ja generiere so lange einen neuen Namen bis einer frei ist
        while((Test-Path $filepath)){. $filepath = $getnewfilepath}
        write-host "Speichere Attachment mit dem Namen '$($_.Name)' nach '$filepath'." -F Green  
        $_.Load($filepath)
        # Mail gelesen markieren
        $mail.IsRead = $true
        $mail.Update([Microsoft.Exchange.WebServices.Data.ConflictResolutionMode]::AutoResolve) | out-null
        # Mail ins Archiv verschieben
        $mail.move($targetFolder.id) | out-null
    }
}
Grüße Uwe

Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
Mitglied: rs-varel
rs-varel 04.04.2017 um 18:31:58 Uhr
Goto Top
Hallo,

ich habe eben den Automatic Email Manager 6 getestet. Der ist zwar kostenpflichtig, kann dafür aber als Dienst laufen und Emails, speichern, Drucken, ....

Perfekt frü mich

Danke
Mitglied: colinardo
colinardo 04.04.2017 aktualisiert um 19:23:30 Uhr
Goto Top
Wow, 89€ für so eine einfache Sache die sich kostenlos über die Aufgabenplanung auch als Dienst abfackeln lässt. Naja, muss jeder selbst entscheiden face-wink.

Bitte, gerne.