Automatiseer e-mail met Python's imaplib. Deze gids behandelt het verbinden met IMAP-servers, zoeken, ophalen, e-mails ontleden, omgaan met bijlagen en mailboxbeheer.
Python IMAP Client: Een uitgebreide gids voor het ophalen van e-mail en mailboxbeheer
E-mail blijft een hoeksteen van digitale communicatie voor bedrijven en particulieren wereldwijd. Het beheren van een groot aantal e-mails kan echter een tijdrovende en repetitieve taak zijn. Van het verwerken van facturen en het filteren van meldingen tot het archiveren van belangrijke gesprekken, de handmatige inspanning kan snel overweldigend worden. Dit is waar programmatische automatisering schittert, en Python, met zijn rijke standaardbibliotheek, biedt krachtige tools om de controle over uw inbox te nemen.
Deze uitgebreide gids leidt u door het proces van het bouwen van een Python IMAP-client vanaf de basis met behulp van de ingebouwde imaplib
bibliotheek. U leert niet alleen hoe u e-mails kunt ophalen, maar ook hoe u hun inhoud kunt ontleden, bijlagen kunt downloaden en uw mailbox kunt beheren door berichten als gelezen te markeren, ze te verplaatsen of te verwijderen. Aan het einde van dit artikel bent u uitgerust om uw meest vervelende e-mailtaken te automatiseren, waardoor u tijd bespaart en uw productiviteit verhoogt.
Inzicht in de Protocollen: IMAP vs. POP3 vs. SMTP
Voordat we in de code duiken, is het essentieel om de fundamentele protocollen te begrijpen die e-mail beheren. U zult vaak drie acroniemen horen: SMTP, POP3 en IMAP. Ze dienen elk een afzonderlijk doel.
- SMTP (Simple Mail Transfer Protocol): Dit is het protocol voor het verzenden van e-mail. Beschouw SMTP als de postdienst die uw brief ophaalt en aflevert bij de mailboxserver van de ontvanger. Wanneer uw Python-script een e-mail verzendt, gebruikt het SMTP.
- POP3 (Post Office Protocol 3): Dit is een protocol voor het ophalen van e-mail. POP3 is ontworpen om verbinding te maken met een server, alle nieuwe berichten naar uw lokale client te downloaden en ze vervolgens standaard van de server te verwijderen. Het is alsof u naar het postkantoor gaat, al uw post ophaalt en mee naar huis neemt; zodra het bij u thuis is, bevindt het zich niet meer op het postkantoor. Dit model komt tegenwoordig minder vaak voor vanwege de beperkingen in een wereld met meerdere apparaten.
- IMAP (Internet Message Access Protocol): Dit is het moderne protocol voor toegang tot en beheer van e-mail. In tegenstelling tot POP3 laat IMAP de berichten op de server staan en synchroniseert de status (gelezen, ongelezen, gemarkeerd, verwijderd) over alle verbonden clients. Wanneer u een e-mail op uw telefoon leest, verschijnt deze als gelezen op uw laptop. Dit servergerichte model is perfect voor automatisering, omdat uw script kan communiceren met de mailbox als een andere client, en de wijzigingen die het aanbrengt, overal worden weergegeven. Voor deze gids zullen we ons uitsluitend richten op IMAP.
Aan de slag met Python's imaplib
De standaardbibliotheek van Python bevat imaplib
, een module die alle noodzakelijke tools biedt om te communiceren met een IMAP-server. Er zijn geen externe pakketten vereist om aan de slag te gaan.
Vereisten
- Python geïnstalleerd: Zorg ervoor dat u een recente versie van Python (3.6 of nieuwer) op uw systeem hebt geïnstalleerd.
- Een e-mailaccount met IMAP ingeschakeld: De meeste moderne e-mailproviders (Gmail, Outlook, Yahoo, enz.) ondersteunen IMAP. Mogelijk moet u het inschakelen in de instellingen van uw account.
Beveiliging eerst: gebruik app-wachtwoorden, niet uw hoofdwachtwoord
Dit is de meest cruciale stap voor beveiliging. Hardcodeer uw hoofdwachtwoord van uw e-mailaccount niet in uw script. Als uw code ooit wordt gecompromitteerd, loopt uw hele account gevaar. De meeste grote e-mailproviders die Two-Factor Authentication (2FA) gebruiken, vereisen dat u een "App-wachtwoord" genereert.
Een app-wachtwoord is een unieke toegangscode van 16 cijfers die een specifieke applicatie toestemming geeft om toegang te krijgen tot uw account zonder uw primaire wachtwoord of 2FA-codes nodig te hebben. U kunt er een genereren en op elk moment intrekken zonder dat dit van invloed is op uw hoofdwachtwoord.
- Voor Gmail: Ga naar uw Google Account-instellingen -> Beveiliging -> 2-staps verificatie -> App-wachtwoorden.
- Voor Outlook/Microsoft: Ga naar uw Microsoft Account-beveiligingsdashboard -> Geavanceerde beveiligingsopties -> App-wachtwoorden.
- Voor andere providers: Zoek in hun documentatie naar "app-wachtwoord" of "applicatiespecifiek wachtwoord".
Behandel dit app-wachtwoord na het genereren als elke andere inloggegevens. Een best practice is om het op te slaan in een omgevingsvariabele of een beveiligd geheimenbeheersysteem in plaats van rechtstreeks in uw broncode.
De basisverbinding
Laten we ons eerste stukje code schrijven om een veilige verbinding met een IMAP-server tot stand te brengen, in te loggen en vervolgens netjes uit te loggen. We gebruiken imaplib.IMAP4_SSL
om ervoor te zorgen dat onze verbinding is versleuteld.
import imaplib
import os
# --- Inloggegevens ---
# Het is het beste om deze te laden vanuit omgevingsvariabelen of een configuratiebestand
# Voor dit voorbeeld definiëren we ze hier. Vervang door uw gegevens.
EMAIL_ACCOUNT = "your_email@example.com"
APP_PASSWORD = "your_16_digit_app_password"
IMAP_SERVER = "imap.example.com" # bijv. "imap.gmail.com"
# --- Verbinden met de IMAP-server ---
# We gebruiken een try...finally-blok om ervoor te zorgen dat we netjes uitloggen
conn = None
try:
# Verbinden met behulp van SSL voor een veilige verbinding
conn = imaplib.IMAP4_SSL(IMAP_SERVER)
# Inloggen op het account
status, messages = conn.login(EMAIL_ACCOUNT, APP_PASSWORD)
if status == 'OK':
print("Succesvol ingelogd!")
# We zullen hier later meer logica toevoegen
else:
print(f"Inloggen mislukt: {messages}")
finally:
if conn:
# Altijd uitloggen en de verbinding sluiten
conn.logout()
print("Uitgelogd en verbinding gesloten.")
Dit script legt een basis. Het try...finally
blok is cruciaal omdat het garandeert dat conn.logout()
wordt aangeroepen, waardoor de sessie met de server wordt gesloten, zelfs als er een fout optreedt tijdens onze bewerkingen.
Navigeren door uw mailbox
Eenmaal ingelogd, kunt u beginnen met het communiceren met de mailboxen (vaak mappen genoemd) in uw account.
Alle mailboxen weergeven
Om te zien welke mailboxen beschikbaar zijn, kunt u de conn.list()
methode gebruiken. De uitvoer kan een beetje rommelig zijn, dus er is een beetje parsing vereist om een schone lijst met namen te krijgen.
# Binnen het 'try'-blok na een succesvolle login:
status, mailbox_list = conn.list()
if status == 'OK':
print("Beschikbare Mailboxen:")
for mailbox in mailbox_list:
# De onbewerkte mailbox-entry is een bytestring die moet worden gedecodeerd
# Het is vaak geformatteerd als: (\HasNoChildren) "/" "INBOX"
# We kunnen wat basisparsing uitvoeren om het op te schonen
parts = mailbox.decode().split(' "/" ')
if len(parts) == 2:
mailbox_name = parts[1].strip('"')
print(f"- {mailbox_name}")
Dit drukt een lijst af zoals 'INBOX', 'Verzonden', '[Gmail]/Spam', enz., afhankelijk van uw e-mailprovider.
Een mailbox selecteren
Voordat u kunt zoeken of e-mails kunt ophalen, moet u een mailbox selecteren om mee te werken. De meest voorkomende keuze is 'INBOX'. De conn.select()
methode maakt een mailbox actief. U kunt het ook in alleen-lezenmodus openen als u niet van plan bent wijzigingen aan te brengen (zoals het markeren van e-mails als gelezen).
# Selecteer de 'INBOX' om mee te werken.
# Gebruik readonly=True als u geen e-mailvlaggen wilt wijzigen (bijv. van UNSEEN naar SEEN)
status, messages = conn.select('INBOX', readonly=False)
if status == 'OK':
total_messages = int(messages[0])
print(f"INBOX geselecteerd. Totaal aantal berichten: {total_messages}")
else:
print(f"Kan INBOX niet selecteren: {messages}")
E-mails zoeken en ophalen
Dit is de kern van het ophalen van e-mail. Het proces omvat twee stappen: eerst zoeken naar berichten die overeenkomen met specifieke criteria om hun unieke ID's te krijgen, en ten tweede de inhoud van die berichten ophalen met behulp van hun ID's.
De kracht van `search()`
De search()
methode is ongelooflijk veelzijdig. Het retourneert niet de e-mails zelf, maar eerder een lijst met berichtvolgnummers (ID's) die overeenkomen met uw query. Deze ID's zijn specifiek voor de huidige sessie en geselecteerde mailbox.
Hier zijn enkele van de meest voorkomende zoekcriteria:
'ALL'
: Alle berichten in de mailbox.'UNSEEN'
: Berichten die nog niet zijn gelezen.'SEEN'
: Berichten die zijn gelezen.'FROM "sender@example.com"'
: Berichten van een specifieke afzender.'TO "recipient@example.com"'
: Berichten verzonden naar een specifieke ontvanger.'SUBJECT "Your Subject Line"'
: Berichten met een specifiek onderwerp.'BODY "a keyword in the body"'
: Berichten die een bepaalde string in de body bevatten.'SINCE "01-Jan-2024"'
: Berichten ontvangen op of na een specifieke datum.'BEFORE "31-Jan-2024"'
: Berichten ontvangen vóór een specifieke datum.
U kunt ook criteria combineren. Om bijvoorbeeld alle ongelezen e-mails van een specifieke afzender met een bepaald onderwerp te vinden, zoekt u naar '(UNSEEN FROM "alerts@example.com" SUBJECT "System Alert")'
.
Laten we het in actie zien:
# Zoeken naar alle ongelezen e-mails in de INBOX
status, message_ids = conn.search(None, 'UNSEEN')
if status == 'OK':
# message_ids is een lijst met bytestrings, bijv. [b'1 2 3']
# We moeten het opsplitsen in afzonderlijke ID's
email_id_list = message_ids[0].split()
if email_id_list:
print(f"{len(email_id_list)} ongelezen e-mails gevonden.")
else:
print("Geen ongelezen e-mails gevonden.")
else:
print("Zoeken mislukt.")
E-mailinhoud ophalen met `fetch()`
Nu u de bericht-ID's hebt, kunt u de fetch()
methode gebruiken om de daadwerkelijke e-mailgegevens op te halen. U moet specificeren welke delen van de e-mail u wilt.
'RFC822'
: Dit haalt de volledige onbewerkte e-mailinhoud op, inclusief alle headers en body-delen. Het is de meest voorkomende en uitgebreide optie.'BODY[]'
: Een synoniem voor `RFC822`.'ENVELOPE'
: Haalt belangrijke headerinformatie op, zoals Datum, Onderwerp, Van, Naar en In-Reply-To. Dit is sneller als u alleen metadata nodig hebt.'BODY[HEADER]'
: Haalt alleen de headers op.
Laten we de volledige inhoud van de eerste ongelezen e-mail ophalen die we hebben gevonden:
if email_id_list:
first_email_id = email_id_list[0]
# Haal de e-mailgegevens op voor het opgegeven ID
# 'RFC822' is een standaard die de indeling van tekstberichten specificeert
status, msg_data = conn.fetch(first_email_id, '(RFC822)')
if status == 'OK':
for response_part in msg_data:
# De fetch-opdracht retourneert een tuple, waarbij het tweede deel de e-mailinhoud is
if isinstance(response_part, tuple):
raw_email = response_part[1]
# Nu hebben we de onbewerkte e-mailgegevens als bytes
# De volgende stap is om het te ontleden
print("Succesvol een e-mail opgehaald.")
# We zullen `raw_email` in de volgende sectie verwerken
else:
print("Ophalen mislukt.")
E-mailinhoud ontleden met de `email` module
De onbewerkte gegevens die door fetch()
worden geretourneerd, zijn een bytestring die is opgemaakt volgens de RFC 822-standaard. Het is niet gemakkelijk leesbaar. De ingebouwde email
module van Python is speciaal ontworpen om deze onbewerkte berichten te ontleden in een gebruiksvriendelijke objectstructuur.
Een `Message` object maken
De eerste stap is het converteren van de onbewerkte bytestring naar een Message
object met behulp van `email.message_from_bytes()`.
import email
from email.header import decode_header
# Aangenomen dat `raw_email` de bytegegevens van de fetch-opdracht bevat
email_message = email.message_from_bytes(raw_email)
Belangrijke informatie (Headers) extraheren
Zodra u het Message
object hebt, kunt u de headers ervan benaderen als een woordenboek.
# Onderwerp, van, naar en datum ophalen
subject = email_message["Subject"]
from_ = email_message["From"]
to_ = email_message["To"]
date_ = email_message["Date"]
# E-mailheaders kunnen niet-ASCII-tekens bevatten, dus we moeten ze decoderen
def decode_email_header(header):
decoded_parts = decode_header(header)
header_str = ""
for part, encoding in decoded_parts:
if isinstance(part, bytes):
# Als er een encoding is, gebruik deze dan. Anders is utf-8 de standaard.
header_str += part.decode(encoding or 'utf-8')
else:
header_str += part
return header_str
subject = decode_email_header(subject)
from_ = decode_email_header(from_)
print(f"Onderwerp: {subject}")
print(f"Van: {from_}")
De helperfunctie decode_email_header
is belangrijk omdat headers vaak zijn gecodeerd om internationale tekensets te verwerken. Het simpelweg openen van email_message["Subject"]
kan u een string met verwarrende tekenreeksen geven als u deze niet correct decodeert.
E-mailbodies en bijlagen verwerken
Moderne e-mails zijn vaak "multipart", wat betekent dat ze verschillende versies van de inhoud bevatten (zoals platte tekst en HTML) en mogelijk ook bijlagen bevatten. We moeten deze delen doorlopen om te vinden wat we zoeken.
De msg.is_multipart()
methode vertelt ons of een e-mail meerdere delen heeft, en `msg.walk()` biedt een eenvoudige manier om ze te doorlopen.
def process_email_body(msg):
body = ""
attachments = []
if msg.is_multipart():
# Doorloop de e-mailonderdelen
for part in msg.walk():
content_type = part.get_content_type()
content_disposition = str(part.get("Content-Disposition"))
try:
# Haal de e-mailbody op
if content_type == "text/plain" and "attachment" not in content_disposition:
payload = part.get_payload(decode=True)
charset = part.get_content_charset() or 'utf-8'
body = payload.decode(charset)
# Bijlagen ophalen
elif "attachment" in content_disposition:
filename = part.get_filename()
if filename:
# Bestandsnaam indien nodig decoderen
decoded_filename = decode_email_header(filename)
attachments.append({
'filename': decoded_filename,
'data': part.get_payload(decode=True)
})
except Exception as e:
print(f"Fout bij het verwerken van onderdeel: {e}")
else:
# Geen multipart-bericht, haal gewoon de payload op
payload = msg.get_payload(decode=True)
charset = msg.get_content_charset() or 'utf-8'
body = payload.decode(charset)
return body, attachments
# De functie gebruiken met ons opgehaalde bericht
email_body, email_attachments = process_email_body(email_message)
print("\n--- E-mailbody ---")
print(email_body)
if email_attachments:
print("\n--- Bijlagen ---")
for att in email_attachments:
print(f"Bestandsnaam: {att['filename']}")
# Voorbeeld van het opslaan van een bijlage
with open(att['filename'], 'wb') as f:
f.write(att['data'])
print(f"Bijlage opgeslagen: {att['filename']}")
Deze functie maakt op intelligente wijze onderscheid tussen de platte tekstbody en de bestandsbijlagen door de Content-Type
en Content-Disposition
headers van elk onderdeel te inspecteren.
Geavanceerd mailboxbeheer
Het ophalen van e-mails is slechts de helft van de strijd. Echte automatisering omvat het wijzigen van de status van berichten op de server. De store()
opdracht is uw primaire tool hiervoor.
E-mails markeren (gelezen, ongelezen, gemarkeerd)
U kunt vlaggen aan een bericht toevoegen, verwijderen of vervangen. De meest voorkomende vlag is \Seen
, die de status gelezen/ongelezen regelt.
- Markeren als gelezen:
conn.store(msg_id, '+FLAGS', '\Seen')
- Markeren als ongelezen:
conn.store(msg_id, '-FLAGS', '\Seen')
- Een e-mail markeren/ster geven:
conn.store(msg_id, '+FLAGS', '\Flagged')
- Een e-mail demarkeren:
conn.store(msg_id, '-FLAGS', '\Flagged')
E-mails kopiëren en verplaatsen
Er is geen directe "verplaats"-opdracht in IMAP. Het verplaatsen van een e-mail is een proces in twee stappen:
- Kopieer het bericht naar de doelmailbox met behulp van
conn.copy()
. - Markeer het originele bericht voor verwijdering met behulp van de
\Deleted
vlag.
# Aangenomen dat `msg_id` het ID is van de e-mail die moet worden verplaatst
# 1. Kopieer naar de 'Archive'-mailbox
status, _ = conn.copy(msg_id, 'Archive')
if status == 'OK':
print(f"Bericht {msg_id.decode()} gekopieerd naar Archief.")
# 2. Markeer het origineel voor verwijdering
conn.store(msg_id, '+FLAGS', '\Deleted')
print(f"Bericht {msg_id.decode()} gemarkeerd voor verwijdering.")
E-mails permanent verwijderen
Het markeren van een bericht met \Deleted
verwijdert het niet onmiddellijk. Het verbergt het eenvoudigweg in de meeste e-mailclients. Om alle berichten in de momenteel geselecteerde mailbox die zijn gemarkeerd voor verwijdering permanent te verwijderen, moet u de expunge()
methode aanroepen.
Waarschuwing: expunge()
is onomkeerbaar. Eenmaal aangeroepen, zijn de gegevens voorgoed verdwenen.
# Dit verwijdert permanent alle berichten met de \Deleted vlag
status, response = conn.expunge()
if status == 'OK':
print(f"{len(response)} berichten verwijderd (permanent verwijderd).")
Een cruciaal neveneffect van expunge()
is dat het de bericht-ID's voor alle volgende berichten in de mailbox opnieuw kan nummeren. Om deze reden is het het beste om alle berichten te identificeren die u wilt verwerken, uw acties uit te voeren (zoals kopiëren en markeren voor verwijdering) en vervolgens expunge()
eenmaal aan het einde van uw sessie aan te roepen.
Alles samenvoegen: Een praktisch voorbeeld
Laten we een compleet script maken dat een real-world taak uitvoert: Scan de inbox op ongelezen e-mails van "invoices@mycorp.com", download alle PDF-bijlagen en verplaats de verwerkte e-mail naar een mailbox met de naam "Processed-Invoices".
import imaplib
import email
from email.header import decode_header
import os
# --- Configuratie ---
EMAIL_ACCOUNT = "your_email@example.com"
APP_PASSWORD = "your_16_digit_app_password"
IMAP_SERVER = "imap.gmail.com"
TARGET_SENDER = "invoices@mycorp.com"
DESTINATION_MAILBOX = "Processed-Invoices"
DOWNLOAD_DIR = "invoices"
# Maak de downloadmap als deze niet bestaat
if not os.path.isdir(DOWNLOAD_DIR):
os.mkdir(DOWNLOAD_DIR)
def decode_email_header(header):
# (Dezelfde functie als eerder gedefinieerd)
decoded_parts = decode_header(header)
header_str = ""
for part, encoding in decoded_parts:
if isinstance(part, bytes):
header_str += part.decode(encoding or 'utf-8')
else:
header_str += part
return header_str
conn = None
try:
# --- Verbinden en inloggen ---
conn = imaplib.IMAP4_SSL(IMAP_SERVER)
conn.login(EMAIL_ACCOUNT, APP_PASSWORD)
print("Inloggen gelukt.")
# --- INBOX selecteren ---
conn.select('INBOX')
print("INBOX geselecteerd.")
# --- Zoeken naar e-mails ---
search_criteria = f'(UNSEEN FROM "{TARGET_SENDER}")'
status, message_ids = conn.search(None, search_criteria)
if status != 'OK':
raise Exception("Zoeken mislukt")
email_id_list = message_ids[0].split()
if not email_id_list:
print("Geen nieuwe facturen gevonden.")
else:
print(f"{len(email_id_list)} nieuwe facturen gevonden om te verwerken.")
# --- Elke e-mail verwerken ---
for email_id in email_id_list:
print(f"\nE-mail-ID verwerken: {email_id.decode()}")
# E-mail ophalen
status, msg_data = conn.fetch(email_id, '(RFC822)')
if status != 'OK':
print(f"Kan e-mail-ID {email_id.decode()} niet ophalen")
continue
raw_email = msg_data[0][1]
email_message = email.message_from_bytes(raw_email)
subject = decode_email_header(email_message["Subject"])
print(f" Onderwerp: {subject}")
# Zoeken naar bijlagen
for part in email_message.walk():
if part.get_content_maintype() == 'multipart':
continue
if part.get('Content-Disposition') is None:
continue
filename = part.get_filename()
if filename and filename.lower().endswith('.pdf'):
decoded_filename = decode_email_header(filename)
filepath = os.path.join(DOWNLOAD_DIR, decoded_filename)
# De bijlage opslaan
with open(filepath, 'wb') as f:
f.write(part.get_payload(decode=True))
print(f" -> Bijlage gedownload: {decoded_filename}")
# --- De verwerkte e-mail verplaatsen ---
# 1. Kopiëren naar de doelmailbox
status, _ = conn.copy(email_id, DESTINATION_MAILBOX)
if status == 'OK':
# 2. Origineel markeren voor verwijdering
conn.store(email_id, '+FLAGS', '\Deleted')
print(f" E-mail verplaatst naar '{DESTINATION_MAILBOX}'.")
# --- Verwijderen en opschonen ---
if email_id_list:
conn.expunge()
print("\nVerwijderde e-mails verwijderd.")
except Exception as e:
print(f"Er is een fout opgetreden: {e}")
finally:
if conn:
conn.logout()
print("Uitgelogd.")
Best practices en foutafhandeling
Houd bij het bouwen van robuuste automatiseringsscripts rekening met de volgende best practices:
- Robuuste foutafhandeling: Omwikkel uw code met
try...except
blokken om potentiële problemen op te vangen, zoals inlogfouten (imaplib.IMAP4.error
), netwerkproblemen of parseringsfouten. - Configuratiebeheer: Hardcodeer nooit inloggegevens. Gebruik omgevingsvariabelen (
os.getenv()
), een configuratiebestand (bijv. INI of YAML) of een speciale geheimenbeheerder. - Logging: Gebruik in plaats van
print()
statements Python'slogging
module. Hiermee kunt u de uitvoer uitgebreid bepalen, naar bestanden schrijven en tijdstempels toevoegen, wat van onschatbare waarde is voor het debuggen van scripts die zonder toezicht worden uitgevoerd. - Snelheidsbeperking: Wees een goede internetburger. Poll de e-mailserver niet overmatig. Als u regelmatig op nieuwe e-mail moet controleren, overweeg dan intervallen van enkele minuten in plaats van seconden.
- Tekencoderingen: E-mail is een wereldwijde standaard en u zult verschillende tekencoderingen tegenkomen. Probeer altijd de tekenset van het e-mailonderdeel te bepalen (
part.get_content_charset()
) en heb een fallback (zoals 'utf-8') om `UnicodeDecodeError` te voorkomen.
Conclusie
U hebt nu de volledige levenscyclus doorlopen van interactie met een e-mailserver met behulp van Python's imaplib
. We hebben het gehad over het tot stand brengen van een veilige verbinding, het weergeven van mailboxen, het uitvoeren van krachtige zoekopdrachten, het ophalen en ontleden van complexe multipart-e-mails, het downloaden van bijlagen en het beheren van berichtstatussen op de server.
De kracht van deze kennis is enorm. U kunt systemen bouwen om automatisch ondersteuningstickets te categoriseren, gegevens uit dagelijkse rapporten te ontleden, nieuwsbrieven te archiveren, acties te activeren op basis van e-mailwaarschuwingen en nog veel meer. De inbox, ooit een bron van handmatige arbeid, kan een krachtige, geautomatiseerde gegevensbron worden voor uw applicaties en workflows.
Welke e-mailtaken gaat u als eerste automatiseren? De mogelijkheden worden alleen beperkt door uw verbeeldingskracht. Begin klein, bouw voort op de voorbeelden in deze handleiding en claim uw tijd terug uit de diepten van uw inbox.