laster
Goto Top

E-Mails aus Exchange öffentlicher Ordner per IMAP lesen

Hallo,
wie kann ich per Python3 (imaplib) E-Mails aus einem (E-Mail aktivierten) öffentlichen Ordner auslesen?
Ich finde nicht die Möglichkeit das Postfach (den öO) anzugeben. Kann nur die E-Mails aus dem Postfach lesen, welches direkt zu den Anmeldedaten passt.
Beim Exchange 2013 ist aber der Zugriff auf öO per IMAP möglich (so habe ich es gelesen).
vG
LS

Content-ID: 1186940566

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

Ausgedruckt am: 21.11.2024 um 20:11 Uhr

149062
149062 23.08.2021 aktualisiert um 18:15:03 Uhr
Goto Top
Benutze statt IMAP die Exchange Web Services (EWS) für den Zugriff auf den öffentlichen Ordner
https://pypi.org/project/exchangelib/
https://pypi.org/project/py-ews/
laster
laster 23.08.2021 um 16:24:51 Uhr
Goto Top
ok, schau ich mir an, schon mal Dankeschön
mbehrens
mbehrens 23.08.2021 um 16:39:22 Uhr
Goto Top
Zitat von @laster:

wie kann ich per Python3 (imaplib) E-Mails aus einem (E-Mail aktivierten) öffentlichen Ordner auslesen?
Ich finde nicht die Möglichkeit das Postfach (den öO) anzugeben. Kann nur die E-Mails aus dem Postfach lesen, welches direkt zu den Anmeldedaten passt.
Beim Exchange 2013 ist aber der Zugriff auf öO per IMAP möglich (so habe ich es gelesen).

Nein das funktioniert schon lange nicht mehr, laut Dokumentation (Exchange 2013):

IMAP4 also doesn't support public folder access.
colinardo
Lösung colinardo 23.08.2021 aktualisiert um 19:19:41 Uhr
Goto Top
Servus.
Hier mal ein einfaches Beispiel mit dem exchangelib Modul = > Für weitere Details siehe Dokumentation bzw. für noch mehr Details wie Felder und Funktionen der Objekte der Source-Code

Username (Zeile 5), Passwort (Zeile 6) und Pfad zum Public Folder (Zeile 20) sind anzupassen.
#!/usr/bin/python3
import exchangelib

#credentials
user = 'user@domain.tld'  
pass = 'Passw0rd'  

# create credentials object
creds = exchangelib.Credentials(user,pass)
# account
exchangelib.Account(primary_smtp_address=user,credential=creds,autodiscover=True,access_type=exchangelib.DELEGATE)
# get public folder root
pfroot = account.public_folders_root
# refresh folders
pfroot.refresh()
print("Showing Public folder tree:\n")  
print(pfroot.tree())
print("\nShowing unread items in folder 'MyMailfolder':\n")  
# select folder from tree (in this example an folder named "MyMailFolder" in the root of the IPM_SUBTREE 
folder = pfroot / 'MyMailFolder'  
# for each unread message in folder ...
for msg in folder.filter(is_read=False):
	print("="*80)  
	print("Mail sender	: " + msg.sender.email_address)  
	print("Mail subject	: " + msg.subject)  
	print("Mail body	:\n" + msg.body)  
Grüße Uwe
laster
laster 24.08.2021 um 10:04:52 Uhr
Goto Top
Hallo Uwe,
exchangelib hatte ich schon mal verwendet, aber nicht für PublicFolder - nun schon. Vielen Dank!
LS
laster
laster 15.09.2021 um 15:14:30 Uhr
Goto Top
Hallo Uwe,

nun ist noch eine Frage aufgekommen, für die ich noch keine Lösung gefunden habe.

In Deinem Beispiel in Zeile 20 wird der Folder definiert: folder = pfroot / 'MyMailFolder'

Wie kann ich den Folder dynamisch angeben?
z.B:
my_folder = createFolder(pfroot, "MyMailFolder", "MyMail_Under_Folder")  

Wie könnte aber die Funktion createFolder() aussehen?

vG
LS
colinardo
colinardo 15.09.2021 aktualisiert um 16:37:56 Uhr
Goto Top
Servus
Zitat von @laster:
Wie kann ich den Folder dynamisch angeben?
z.B:
> my_folder = createFolder(pfroot, "MyMailFolder", "MyMail_Under_Folder")  
> 

Wie könnte aber die Funktion createFolder() aussehen?
im einfachsten Fall z.B. so: Mailbox-Root als erster Parameter, und im zweiten die Subfolder definiert als Liste
def createFolder(root,subfolders):
    if len(subfolders) > 0:
        result = root.glob('/'.join(subfolders))  
        if len(result) > 0:
            return result._get_single_folder()
    else:
        raise ValueError('subfolder cannot be empty')  

my_folder = createFolder(pfroot, ["MyMailFolder", "MyMail_Under_Folder"])  
https://ecederstrand.github.io/exchangelib/#folders

Grüße Uwe
laster
laster 15.09.2021 um 16:05:37 Uhr
Goto Top
Danke für die schnelle Antwort.

Beim Aufruf von my_folder.tree() bekomme ich dann
AttributeError: 'FolderCollection' object has no attribute 'tree'

Hast Du noch eine Idee?

vielen Dank
LS
colinardo
Lösung colinardo 15.09.2021 aktualisiert um 16:39:37 Uhr
Goto Top
Zitat von @laster:
Beim Aufruf von my_folder.tree() bekomme ich dann
AttributeError: 'FolderCollection' object has no attribute 'tree'
-Das ist volkommen normal denn das Ergebnis Object der Funktion hat die Funktion tree() nicht
Zeigt dir übrigens auch ein :
dir(my_folder)

#edit#, Sorry das kam weil die Funktion eine collection zurückgegeben hat statt einem einzelnen Ordner, ist korrigiert.
laster
laster 15.09.2021 um 16:28:27 Uhr
Goto Top
OK, da habe ich mich auf .tree() konzentriert, obwohl ich das ja nicht brauche.
root.glob() ist das was ich suchte, hatte es auch schon in der Doku gelesen und probiert, aber .tree() ....

vielen Dank für die Hilfe!
LS