Apache James: modulær e-postserver og Mailet-plattform

Apache James er en åpen kildekode-e-postserver og samtidig et byggesett for applikasjoner der forretningslogikken bygger på e-post. Navnet står for Java Apache Mail Enterprise Server. James kan ta imot og videresende meldinger via SMTP, administrere lokale postbokser, gjøre dem tilgjengelige via IMAP, POP3 eller JMAP og styre hele meldingsflyten gjennom fritt kombinerbare behandlingskomponenter. Prosjektet beskriver seg derfor ikke bare som en server, men som en modulært sammensettbar Inversion-of-Control-plattform på JVM (Apache James – prosjektoversikt).

Denne dobbeltrollen skiller James fra klassiske Mail Transfer Agents som Postfix og fra ferdige sikkerhetsappliances. En administrator kan bruke James som et rent SMTP-relé, som en komplett postboksserver eller som en innebygd e-postmotor i et produkt. Spamkontroll, kryptering, arkivering eller domenespesifikk ruting oppstår ikke fra en fast funksjonsblokk, men fra en pipeline av Matchers og Mailets. Dette gjør James svært tilpasningsdyktig, men flytter deler av produktansvaret fra produsenten til organisasjonen som drifter løsningen.

Forklaringen følger en melding gjennom James: fra protokollserverne via køen og Mailet-pipelinen til postbokslagringen. Deretter behandles driftsvariantene, diagnostikk og til slutt prosjektets tekniske utvikling.

Innplassering: MTA, MDA og applikasjonsplattform

I e-postsystemet har ikke alle komponenter samme rolle. En Mail User Agent (MUA) er brukerens klient, for eksempel Thunderbird. En Mail Transfer Agent (MTA) transporterer meldinger mellom systemer. En Mail Delivery Agent (MDA) legger en melding i målpostboksen. James kan være MTA og MDA samtidig; gjennom protokoll- og postboksmodulene tilbyr den i tillegg tjenester på serversiden for MUA-er. Den offisielle komponentoversikten angir separate prosjekter for server, protokoller, Mailets, postbokser og tester (Apache James – Software Components).

RolleImplementasjon i JamesOverleveringspunkt
MeldingstransportSMTP- og LMTP-server, kø, Remote-Delivery-Mailetandre MTA-er, reléer og gatewayer
Lokal leveringMailet-pipeline og Mailbox APIbrukere, domener og kvoter
PostbokstilgangIMAP, POP3 og JMAPe-postklienter og webapplikasjoner
FilterlogikkMatchers, Mailets, Processors og Sieveinterne regler og eksterne kontrolltjenester
AdministrasjonWebAdmin REST API, CLI, Health Checks og måledataautomatisering og overvåking

James er dermed ingen e-postklient og heller ingen forhåndskonfigurert sikker e-postgateway. Den leverer byggeklosser for transport, levering, lagring og behandling. Om resultatet blir et enkelt relé, en flerleietakertjeneste for e-post eller en produktspesifikk gateway, avgjøres av valgt distribusjon og konfigurasjon.

Protokoller, TLS og porter

James tilbyr SMTP, LMTP, IMAP, POP3 og ManageSieve som TCP-baserte tjenester; JMAP og WebAdmin bruker HTTP (Apache James – Protocol Servers). TLS beskytter, avhengig av lytter, enten en forbindelse som er kryptert fra starten, eller legges inn i en eksisterende økt via StartTLS. DNS er ikke en del av James-prosessen, men er uunnværlig for en offentlig MTA: MX-poster bestemmer målet, A- og AAAA-poster adressene og PTR-poster påvirker omdømmet til utgående forbindelser.

Portnummeret alene beskriver ikke sikkerhetssemantikken. Port 25 er beregnet på server-til-server-transport; autentisert innsending fra klienter hører ifølge RFC 6409 hjemme på port 587. Port 465 er siden RFC 8314 igjen registrert for implisitt kryptert Message Submission. For IMAP og POP3 gjelder de samme to mønstrene: klartekstforbindelse med mulig StartTLS eller umiddelbar TLS-etablering.

TjenesteTypiske porterStandardBetydning i James
SMTP25, 587, 465RFC 5321Mottak, relé og innsending
LMTPkonfigurerbar, registrert 24RFC 2033lokal overlevering med status per mottaker
IMAP4rev2143, 993RFC 9051synkron postbokstilgang
POP3110, 995RFC 1939enkel meldingshenting
ManageSieve4190RFC 5804administrasjon av brukerspesifikke Sieve-regler
JMAP Mailvanligvis 443RFC 8621HTTP-basert postbokstilgang for moderne klienter

Portene kan konfigureres; det bindende er kombinasjonen av lytter, protokoll, TLS-modus og autentisering. IANA Service Name and Port Number Registry er fortsatt referansen for registrerte tilordninger.

Arkitekturtilnærming

James følger en komponentbasert arkitektur. Protokollservere, kø, behandlingslogikk, postboks, brukeradministrasjon, søkeindeks og administrasjon er adskilt gjennom API-er og settes sammen med dependency injection. Distribusjonene dokumentert for James 3.9 bruker Google Guice til dette; Spring-oppsettet tilhører en eldre generasjon. Frikoblingen er ikke bare kodeorganisering: Den gjør det mulig å bruke den samme Mailbox API med ulike persistenslag og den samme Mailet-logikken i svært ulike serverprofiler.

Den sentrale databanen er asynkron. En SMTP-lytter trenger ikke å levere en mottatt melding fullstendig før den svarer på forbindelsen. Den legger et e-postobjekt i en kø; en Spooler henter det senere og fører det gjennom Mailet-containeren. Køen skiller dermed mottaksbelastning, behandlingstid og tilgjengeligheten til etterfølgende systemer. Den distribuerte driftsdokumentasjonen beskriver den derfor som en obligatorisk del av en SMTP-server (Apache James – Distributed Server Operations).

Behandlingsveien til en melding

  1. Protokollmottak: SMTP eller LMTP kontrollerer økt, autentisering, konvoluttavsender og mottaker. Etter slutten på DATA opprettes et internt Mail-objekt med konvolutt, MIME-innhold og attributter.
  2. Kø: Objektet settes i en permanent eller flyktig kø. Først fra dette punktet er mottak frikoblet fra behandling.
  3. Spooler: Arbeidere henter køoppføringer og overleverer dem til Mailet-containeren.
  4. Processor: En navngitt Processor inneholder en ordnet liste med Matcher/Mailet-par. Den obligatoriske root-Processoren utgjør inngangen.
  5. Matcher: En Matcher endrer ikke meldingen, men returnerer delmengden av mottakere som oppfyller en betingelse.
  6. Mailet: Den tilhørende Maileten endrer melding eller konvolutt, utløser en bieffekt, leverer lokalt eller eksternt, eller forgrener til en annen Processor.
  7. Resultat: Meldingen havner i en brukerpostboks, i utgående levering, i et Mail Repository for senere behandling, eller er fullført etter vellykket handling.

En viktig detalj er den mottakerrelaterte splittingen. Dersom en Matcher bare passer for noen av adressatene, deler containeren behandlingen i passende og ikke-passende mottakergrupper. Regler gjelder derfor ikke nødvendigvis for en komplett MIME-melding. En Mailet kan dessuten hoppe direkte til en annen Processor via ToProcessor; pipelinen er dermed mer en rettet behandlingsgraf enn én enkelt lineær liste. Den offisielle dokumentasjonen for Mailet-containeren beskriver nettopp denne modellen.

Et minimalt, forenklet mønster ser slik ut:

<processor state="root" enableJmx="true">
  <mailet match="RelayLimit=30" class="ToRepository">
    <repositoryPath>cassandra://var/mail/relay-denied/</repositoryPath>
  </mailet>
  <mailet match="RecipientIsLocal" class="LocalDelivery" />
  <mailet match="All" class="RemoteDelivery" />
</processor>

Rekkefølgen er en del av semantikken. En regel som passer bredt i starten, kan gjøre etterfølgende regler uoppnåelige; en endeløs løkke mellom Processors kan binde Spooleren. James tilbyr derfor definerbar feilhåndtering per Matcher og Mailet samt egne feil-Processors (Mailet Container Configuration).

Komponentarkitekturen blir konkret så snart en melding når køen. Da avgjør Processor, Matcher og Mailet hvilke behandlingstrinn som følger, og hvor resultatet havner.

Teknisk oppbygning

Arkitekturen beskriver meldingsveien; for installasjon og drift må den nå omsettes til et konkret komponentbilde. Avgjørende er hvilken kjøretid, lagring og tilleggstjenester den valgte James-profilen faktisk krever.

Teknologistack og administrasjonsoversikt

For den første produktvurderingen er driftsgrensene viktigere enn klassenavn. Følgende oversikt kondenserer stakken til spørsmålene som bør avklares før installasjon, integrasjon eller overtakelse av et eksisterende miljø:

OmrådeTeknologi eller artefaktDet administratoren må vite
KjøretidJava 21, JVM; kildekode hovedsakelig Java, enkelte Scala-modulerHeap, Garbage Collection, trådhåndtering og JVM-patcher er del av serverdriften
Bygg og pakkeMaven-multimodulprosjekt; ZIP-filer og Docker-imagesegne Mailets må passe til James-, Java- og Jakarta-generasjonen
KoblingGuice i 3.9-generasjonen; Spring i eldre installasjonervalgt distribusjon avgjør tilgjengelige moduler og konfigurasjonsfiler
Konfigurasjonconf/*.xml, conf/*.properties, miljøvariablersærlig viktig: smtpserver.xml, mailetcontainer.xml, webadmin.properties, JMAP- og backend-filer
BehandlingMailQueue, Spooler, Processor, Matcher, Mailetmottak, behandling og endelig levering er separate tilstander
DataPostgreSQL/JPA eller Cassandra; valgfritt S3, OpenSearch, RabbitMQkilde, projeksjon, kø og Blob-innhold krever separate gjenopprettingsplaner
AdministrasjonWebAdmin REST API og james-cliREST er kraftigere; CLI følger med i alle koblingsvarianter
ObserverbarhetHealth Checks, Dropwizard Metrics, Prometheus, JMX, logger, Grafanakø, Mailets, Matchers, protokoller og bakender har egne måledata
SikkerhetTLS-keystores, SMTP AUTH, JWT for WebAdmin, nettverkssegmenteringWebAdmin uten aktivert JWT er ikke beskyttet som standard

Alle konfigurasjonsfiler ligger ifølge prosjektet i conf eller conf/META-INF; hvilke som faktisk gjelder, avhenger av kobling og backend. Verdier kan hentes fra miljøet med ${env:VARIABLE} (Apache James – Configuration). Dette er praktisk for containere, men erstatter ikke secrets-håndtering: Sertifikater, private nøkler, JWT-nøkler og databasepassord bør leveres som monterte secrets eller gjennom orkestreringsplattformen.

Protokollag

Protocols-prosjektet tilbyr utvidbare serverimplementasjoner for SMTP, LMTP, IMAP, POP3, ManageSieve og JMAP (James Protocols). Lytterne er ikke fast koblet til en bestemt lagring. IMAP og JMAP bruker Mailbox API; SMTP overleverer mottatte meldinger til kø og Mailet-container. Dermed kan protokoller skaleres eller deaktiveres uavhengig av backend-topologien.

Postboks, Mail Repository og Blob-lagring

James skiller mellom tre lagringsbegreper som ikke bør blandes i drift:

LagringInnholdSynlighetTypisk gjenoppretting
Mailboxmapper, meldinger, flagg, UID-er, ACL-er og kvoter for en brukerIMAP/JMAP/POP3gjenoppretting eller replikering av postboks-backenden
Mail Repositorymeldinger fra behandlingsveier som error, relay-denied eller karantenekun administrasjonrett årsaken og behandle meldingen på nytt
Blob Storebinært MIME-innhold eller store objekterindirekte referert via metadatakonsistent sikkerhetskopi med metadata og referanser

PERSISTENSDOKUMENTASJONEN understreker at et Mail Repository nettopp ikke er brukerens postboks. Dette skillet er verdifullt for Incident Response: En feilaktig melding kan isoleres, undersøkes og etter en korrigering føres tilbake i pipelinen uten å omgå postboksmodellen.

Hendelsesbuss, søk og projeksjoner

Postboksoperasjoner genererer hendelser, for eksempel MailboxAdded, MessageMoveEvent, FlagsUpdated eller kvoteendringer. Lyttere oppdaterer kvoter, søkeindekser og andre projeksjoner fra disse. I den distribuerte profilen håndterer RabbitMQ kommunikasjonen, OpenSearch søket og Cassandra metadataene; binært innhold ligger i en S3-kompatibel Object Store. Denne oppdelingen muliggjør horisontal skalering, men medfører eventual consistency mellom kilde og projeksjoner. Mislykkede lytterhendelser havner i en Event Dead Letter og må overvåkes og eventuelt leveres på nytt (Distributed James – Mailbox Event Bus).

MIME, Sieve og avsenderautentisering

James-prosjektet omfatter mer enn serveren. Apache Mime4J analyserer MIME-strukturer strømorientert eller som objektmodell; jSieve implementerer Sieve-filterspråket; jSPF og jDKIM tilbyr Java-biblioteker for henholdsvis avsenderkontroll og DKIM-signering og -verifisering. Disse modulene er selvstendige prosjekter og kan også brukes utenfor en komplett James-server (Apache James – komponenter).

Hvilke av disse komponentene som kjører på én node eller distribuert, er ikke bare et ytelsesspørsmål. Valget fastsetter også konsistens, gjenoppstart og antall bakender som må overvåkes.

Driftsvarianter og skalering

For James 3.9.0 dokumenterer Apache flere profiler. Dette er ikke bare ulike installasjonsprogrammer, men forskjellige konsistens-, skalerings- og driftsmodeller. I denne versjonen er JPA-varianten uttrykkelig betegnet som legacy; ved siden av den finnes en PostgreSQL-distribusjon og en distribuert distribusjon (Apache James – Downloads). Punktene som i grafikken betegnes som driftsavledning, er anbefalinger utledet av dette og ikke ordrette produsentutsagn.

ProfilPersistens og tjenesterEgnet forDriftsmessig konsekvens
JPA/Guice (legacy)innebygd H2-database eller ekstern SQL-database; klassisk enkeltservermodelllaboratorium, migrering av eldre installasjoner, små spesialløsningerfå komponenter, men begrenset strategisk vei og vertikal skalering
PostgreSQLPostgreSQL som kjerne; valgfritt OpenSearch, RabbitMQ og S3-kompatibel lagringnye enkelt- eller flernodeinstallasjoner med relasjonell basebackup og HA er velkjent; innfør tilleggstjenester bare ved nødvendig skalering
Distributed/GuiceCassandra, RabbitMQ, OpenSearch og S3-kompatibel Object Storestore, horisontalt skalerbare tjenesterflere feilområder, projeksjoner, Dead Letters og mer krevende konsistenskontroller
Memoryflyktige in-memory-komponentertester og utviklingingen bevaring av produksjonsdata

3.9-utgivelsen fremhever den kraftige PostgreSQL-implementasjonen som en vesentlig nyhet og beskriver den som både standalone-kapabel og skalerbar med RabbitMQ, OpenSearch og S3 (Apache James 3.9.0). For nye installasjoner er dette vanligvis det mest forståelige utgangspunktet: først relasjonell konsistens og kjente sikkerhetskopieringsmetoder, deretter tilleggstjenester kun for konkrete, målte behov.

Sikkerhetsmodell

James tilbyr TLS, SMTP-autentisering, protokollkontroller og kryptografiske Mailets. Dette innebærer likevel ikke automatisk sikker produksjonsdrift. Transportkryptering beskytter ett hopp; den erstatter verken ende-til-ende-kryptering eller bindende mottakerkontroll. TLS-konfigurasjonen skiller mellom keystore, aktiverte Cipher Suites, StartTLS og implisitt TLS per lytter. Et sertifikatbytte må derfor spores separat for SMTP, IMAP, POP3 og HTTP.

WebAdmin fortjener særlig oppmerksomhet. REST API-et kan endre domener, brukere, postbokser, køer, repositories, kvoter og vedlikeholdsoppgaver. Ifølge WebAdmin-dokumentasjonen er JWT-autentisering deaktivert som standard; uten ytterligere sikring må API-et derfor aldri være tilgjengelig fra et ukontrollert nettverk. Helseendepunkter og API-dokumentasjon kan dessuten bevisst ligge utenfor autentiseringen.

En minimal produksjonsherding omfatter:

  • bind WebAdmin til et administrasjonsnettverk, aktiver JWT og begrens tilgangen ytterligere med brannmur eller reverse proxy;
  • forhindre åpne reléer med eksplisitte regler for relé, autentisering og mottakere;
  • drift innsending og server-til-server-SMTP på separate lyttere med ulike policyer;
  • fjern demodomener, eksempelbrukere og standardpassord fra container-images før første eksterne oppstart;
  • administrer private nøkler utenfor containerlaget og overvåk utløpsdatoer;
  • behandle egendefinerte Mailets som applikasjonskode: kontroller avhengigheter, kjør tester og begrens kjøretidsrettigheter;
  • utform spam- og malwarekontroll bevisst. James er en plattform; eksterne skannere og omdømmetjenester integreres via Mailets eller protokolloverleveringer.

Ved feilsøking kontrolleres meldingsveien igjen i samme rekkefølge: lytter, kø, Mailet-pipeline, repository, postboks og utgående levering.

Drift og feilsøking

For en modulær e-postserver er «tjenesten kjører» ikke en tilstrekkelig statusbeskrivelse. WebAdmin-Health-Checks skiller mellom healthy, degraded og unhealthy; i streng modus fører allerede en degradert komponent til HTTP 503. Avhengig av profil kontrolleres blant annet JPA eller Cassandra, OpenSearch, RabbitMQ, Guice-livssyklusen, Event Dead Letters og en fullstendig testlevering (WebAdmin Health Checks).

For diagnostikk er en lagvis fremgangsmåte mer effektiv enn et globalt logsøk:

  1. Forbindelse: Når klienten riktig lytter, og lykkes TLS med forventet sertifikat og vertsnavn?
  2. SMTP-transaksjon: Hvilken svarkode ble levert for MAIL FROM, RCPT TO og DATA? En 250 etter DATA betyr mottak, ikke nødvendigvis endelig levering.
  3. Kø: Vokser antallet ventende oppføringer, øker alderen deres, eller gjentas den samme eksterne feilen?
  4. Mailet-pipeline: Hvilken Processor og hvilket Matcher/Mailet-par behandlet meldingen? Mail-ID-en fungerer som korrelasjonsnøkkel.
  5. Repository: Ligger meldingen i error, address-error, relay-denied eller i et eget repository? Rett først årsaken, og behandle deretter på nytt.
  6. Postboks og hendelser: Finnes meldingen i den ledende postboksbutikken, men mangler i søkeindeksen eller JMAP? Da er lyttere, Dead Letters og reindeksering mer relevante enn SMTP.
  7. Remote Delivery: Ved utgående levering må DNS, rute, TLS, motpartskode, retry-plan og bounce-generering kontrolleres separat.

En kompakt syntetisk kontroll kan koble sammen administrasjons- og dataplanet:

$headers = @{ Authorization = "Bearer $env:JAMES_ADMIN_JWT" }
Invoke-RestMethod `
  -Uri "https://james-admin.example.net/healthcheck?strict" `
  -Headers $headers

I Windows kaller Invoke-RestMethod REST-endepunktet; i Linux og Unix utfører curl den samme HTTP-kontrollen. Begge kommandoene tester her utelukkende den dokumenterte WebAdmin-Health-Check og erstatter ingen syntetisk SMTP- eller postbokstransaksjon.

I tillegg bør minst kødybde og -alder, feil-repositories, Event Dead Letters, forsinkelse i OpenSearch-indeksering, backend-latenser, SMTP-svarklasser, JVM-minne og sertifikatgyldighet alarmovervåkes. I den distribuerte varianten er en grønn James-prosess ved forstyrret RabbitMQ eller OpenSearch bare en delvis suksess.

Verktøy for administratorarbeidsplassen

James har en kommandolinjeklient for domener, brukere, postbokser, mappings, kvoter og reindeksering; i Guice-containere er den tilgjengelig som james-cli (James CLI). For robust diagnostikk bør administratorarbeidsplassen dessuten ha noen protokollnøytrale verktøy:

VerktøyBruk med James
swaksfullstendig SMTP- og innsendingstransaksjon med AUTH, TLS, konvolutt og fritt angitte headere
openssl s_clientkontroller sertifikatkjede, SNI, Cipher og StartTLS for SMTP, IMAP eller POP3
curl og jqspør WebAdmin, Health Checks, oppgaver og måledata automatisert
dig eller Resolve-DnsNamekontroller MX, A/AAAA, PTR, SPF, DKIM og DMARC
tcpdump eller Wiresharkskill mellom handshake, retransmits, forbindelsesbrudd og protokolldialoger
Prometheus og Grafanaobserver kø- og protokollmåledata, latenspersentiler, Mailet-/Matcher-kjøretider og backendtilstander
JMX, VisualVM og jcmdundersøk heap, tråder, Garbage Collection og JVM-interne måledata

Den innebygde måledokumentasjonen lister blant annet aktive SMTP-, IMAP- og LMTP-forbindelser, køoppføringer, sendte og leverte meldinger, svartider per protokoll samt kjøretider for enkeltstående Mailets og Matchers. Disse måledataene er mer utsagnskraftige enn en enkelt prosessoppetid fordi de avbilder meldingsveien gjennom arkitekturen.

Teknisk historie

James oppstod ikke som en port av en eksisterende Unix-MTA. De eldste bevarte prosjektsidene fra 1997/1998 beskriver først en planlagt Java-server som ennå ikke kunne brukes, basert på felles pakker fra Java Apache Project. Planen omfattet et felles protokollgrensesnitt, JDBC-lagring og et MailServlet-grensesnitt inspirert av Servlets; infrastrukturen fra Apache-JServ-miljøet fungerte som teknisk forarbeid (James-1.0-arkiv). Den senere Mailet API-en beholdt grunntanken om små, distribuerbare behandlingskomponenter uten å bli en del av Java Servlet-spesifikasjonen.

TidsromTeknisk utviklingstrinn
1997–1998utforming i Java Apache Project: ren Java-server, felles protokoll- og ressursgrensesnitt, MailServlet-idé
Februar 2001migrering fra Java Apache Project til Jakarta-prosjektet (Jakarta News 2001)
James 1.x/2.xstabil SMTP-/POP3-server, periodevis NNTP; Mailet-motor, fil- og RDBMS-lagring; komponentcontainere Avalon/Phoenix (dokumentarkiv)
tidlig 2000-tallopprykk fra Jakarta-underprosjekt til selvstendig Top-Level Project i Apache Software Foundation (James 2.1.3 – arkivert prosjektside)
2010James 3.0 M1 med full IMAP-støtte, SMTP/LMTP, revidert Mailet API samt Maildir-, JPA- og JCR-lagring (utgivelsesmelding)
James 3.xerstatning av Avalon/Phoenix med Spring og senere strategisk orientering mot Guice; utbygging av IMAP, JMAP, REST-administrasjon og distribuerte bakender
September 2025James 3.9.0: overgang fra javax til jakarta, Java 21 og ny PostgreSQL-implementasjon (utgivelsesmelding)

Kildekoden ligger i det offisielle repositoriet apache/james-project. Den her omtalte 3.9-generasjonen består hovedsakelig av Java; enkelte moduler bruker Scala. Den bygges som et stort Maven-multimodulprosjekt. Den lange utviklingshistorien forklarer hvorfor flere generasjoner er synlige side om side i dokumentasjon og installasjoner: Phoenix- og Spring-begreper i eldre tekster, Guice i 3.x-dokumentasjonen, JPA som legacy-vei og PostgreSQL- eller Cassandra-profiler for distribuerte utrullinger.

Egnethet og begrensninger

James er særlig egnet når e-post er en del av en applikasjon og ikke bare infrastruktur: regelbasert behandling, egne Mailets, åpne protokoller, JMAP, kontrollerbar datahåndtering eller horisontal skalering uten en proprietær serverkjerne. De offentlige API-ene gjør det mulig å videreutvikle transport, postboks og forretningslogikk separat.

James er mindre egnet for organisasjoner som forventer en nøkkelferdig appliance med komplett GUI, forhåndskonfigurert spam- og malwarebeskyttelse, produsent-SLA-er og ett enkelt backup-objekt. Den modulære friheten skaper integrasjonsarbeid. Særlig den distribuerte profilen krever driftserfaring med flere datasystemer og en klar definisjon av kilde, projeksjon, gjenoppbygging og Recovery Point.

Det avgjørende arkitekturspørsmålet er derfor: Skal e-post driftes som et konfigurerbart protokollsystem eller som et ferdig produkt? I det første tilfellet tilbyr James et uvanlig dypt, åpent byggesett. I det andre tilfellet er et mer forhåndskonfigurert produkt ofte mer økonomisk.

Kilder

Nye artikler på e-post

En kort melding når en ny praktisk artikkel om meldinger, sikkerhet eller Microsoft 365 publiseres.

Adressen brukes bare til nyhetsbrevet. Avslutt med ett klikk. Personvern

Forstørret infografikk