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-Key: 1186940566

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

Printed on: April 26, 2024 at 07:04 o'clock

Mitglied: 149062
149062 Aug 23, 2021 updated at 16:15:03 (UTC)
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/
Member: laster
laster Aug 23, 2021 at 14:24:51 (UTC)
Goto Top
ok, schau ich mir an, schon mal Dankeschön
Member: mbehrens
mbehrens Aug 23, 2021 at 14:39:22 (UTC)
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.
Member: colinardo
Solution colinardo Aug 23, 2021 updated at 17:19:41 (UTC)
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
Member: laster
laster Aug 24, 2021 at 08:04:52 (UTC)
Goto Top
Hallo Uwe,
exchangelib hatte ich schon mal verwendet, aber nicht für PublicFolder - nun schon. Vielen Dank!
LS
Member: laster
laster Sep 15, 2021 at 13:14:30 (UTC)
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
Member: colinardo
colinardo Sep 15, 2021 updated at 14:37:56 (UTC)
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
Member: laster
laster Sep 15, 2021 at 14:05:37 (UTC)
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
Member: colinardo
Solution colinardo Sep 15, 2021 updated at 14:39:37 (UTC)
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.
Member: laster
laster Sep 15, 2021 at 14:28:27 (UTC)
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