A logo showing the text blog.marcnuri.com
Español
Home»Pet projects»Isotope Mail Client: Introduction and features

Recent Posts

  • Fabric8 Kubernetes Client 7.2 is now available!
  • Connecting to an MCP Server from JavaScript using AI SDK
  • Connecting to an MCP Server from JavaScript using LangChain.js
  • The Future of Developer Tools: Adapting to Machine-Based Developers
  • Connecting to a Model Context Protocol (MCP) Server from Java using LangChain4j

Categories

  • Artificial Intelligence
  • Front-end
  • Go
  • Industry and business
  • Java
  • JavaScript
  • Legacy
  • Operations
  • Personal
  • Pet projects
  • Tools

Archives

  • May 2025
  • April 2025
  • March 2025
  • February 2025
  • January 2025
  • December 2024
  • November 2024
  • August 2024
  • June 2024
  • May 2024
  • April 2024
  • March 2024
  • February 2024
  • January 2024
  • December 2023
  • November 2023
  • October 2023
  • September 2023
  • August 2023
  • July 2023
  • June 2023
  • May 2023
  • April 2023
  • March 2023
  • February 2023
  • January 2023
  • December 2022
  • November 2022
  • October 2022
  • September 2022
  • August 2022
  • July 2022
  • June 2022
  • May 2022
  • March 2022
  • February 2022
  • January 2022
  • December 2021
  • November 2021
  • October 2021
  • September 2021
  • August 2021
  • July 2021
  • January 2021
  • December 2020
  • November 2020
  • October 2020
  • September 2020
  • August 2020
  • July 2020
  • June 2020
  • May 2020
  • February 2020
  • January 2020
  • December 2019
  • October 2019
  • September 2019
  • July 2019
  • March 2019
  • November 2018
  • July 2018
  • June 2018
  • May 2018
  • April 2018
  • March 2018
  • February 2018
  • December 2017
  • July 2017
  • January 2017
  • December 2015
  • November 2015
  • December 2014
  • March 2014
  • February 2011
  • November 2008
  • June 2008
  • May 2008
  • April 2008
  • January 2008
  • November 2007
  • September 2007
  • August 2007
  • July 2007
  • June 2007
  • May 2007
  • April 2007
  • March 2007

Isotope Mail Client: Introduction and features

2018-11-15 in Pet projects tagged Application / E-Mail / Isotope Mail / Webmail by Marc Nuri | Last updated: 2021-04-11
Versión en Español

Introduction

Isotope mail client is a free open source webmail application built with a microservice architecture vision in mind.

As of now, the application is just an MVP offering the basic functionalities of any standard webmail client.

The main purpose of this application is to personally expose, explore and learn new technologies, and development and design patterns.

However, the application should be fully functional and solve many of the problems that other mail clients face.

Isotope Mail Client
Isotope Mail Client

Features

  • No database required
  • Quick and easy deployment (docker images and deployment examples available)
  • Rich text message editing
  • Support for embedded images (paste into editor)
  • Recipient addresses autocomplete
  • Drag & drop messages
  • Drag & drop file attachments
  • Drag & drop folders
  • Folder create, delete and rename
  • Multi language support (English, Spanish & Deutsch)
  • Browser notifications

Architecture

Currently, Isotope consists of only two components, a front-end React application with the user interface and a back-end Spring application that servers as an API to the IMAP and SMTP protocols.

In order to deploy the application, a reverse-proxy / load balancer is required to enable communication between front-end and back-end. This component will also be required to orchestrate the requests and provide the means to elastically scale any of the other components.

Following is a list of some of the technologies and patterns used throughout the application. There will be future dedicated posts about the integration of these technologies with Isotope mail client.

Front-end

The FE is based in ReactJS and is built using Babel 7 and Webpack 4 (Following the technique described in the this post).

One of the main features of Isotope mail is that along with the state of the application, the user’s mailbox is partially cached and stored (encrypted) in the browser’s IndexedDB.

These are some of the technologies in use:

  • Redux: The Redux pattern is used throughout the application to manage the application state. On top of this, the state of the application is persisted/recovered in/from the browser’s IndexedDB.
  • i18next: The i18next framework is used for internationalization. Translation are loaded from static JSON application resources.
  • Web workers: web workers are used to perform resource consuming background tasks. Currently there is a web worker for encryption and decryption. Worker-loader module is used to integrate the web worker in the Babel+Webpack build.
  • Drag and drop: Html5 drag and drop is used natively.
  • whatwg-fetch: GitHub’s fetch polyfill is used. Most back-end requests are performed using fetch.
  • SJCL (Stanford Javascript Crypto Library): This library is used for hashing and encrypting user’s sensitive information before persisting it in the browser’s IndexedDB.
  • IndexedDB + IDB: The browser’s IndexedDB is intensively used to cache folder’s messages, application state, etc. The access to the DB is performed using the idb library which replaces some of the native IndexedDB objects with promises.
  • TinyMCE: Version 4 of this rich text editor is used and integrated as a ReactJS component and Redux.
  • DOMpurify: This library is used to sanitize HTML e-mail content before rendering it in a ReacJS component (dangerouslySetInnerHTML)
  • Jest + Enzyme: FE unit tests are written with Jest and the help of Enzyme.
  • Notifications: Html5 notifications are used natively to notify the user about new mail.

Back-end

The BE is a Spring application built with Gradle.

It simply acts as a web API to expose IMAP and SMTP capabilities to the FE. The application has no state neither database support.

These are some of the technologies in use:

  • Spring Boot: for application bootstrapping.
  • Spring HATEOAS: for resource link building.
  • Spring Webflux (Project Reactor): to create reactive endpoints. Currently folder messages resource is using a Flux endpoint to stream Server-sent events to the browser in order to stream batches of messages as soon as they are retrieved from the IMAP server.
  • JavaMail API: for SMTP and IMAP protocol access.
  • JUnit 4 + Mockito 2 + Powermock: BE unit tests are implemented with JUnit and Mockito 2. Powermock is used to mock static methods and final classes from the JavaMail API.

Reverse-proxy / load balancer

For development purposes, Webpack-dev-server is used to proxy requests from the front-end to the API back-end. This same procedure could be used for some specific deployments although it’s not the recommended approach.

There is an example docker-compose deployment showing how easy it is to deploy the application using Traefik and the official Isotope docker images.

1git clone https://github.com/manusa/isotope-mail.git
2cd isotope-mail/deployment-examples
3docker-compose pull && docker-compose up --force-recreate

Running the previous commands will deploy the application in your localhost.

Continuous Integration

Travis-ci is used as the CI service.

As of now, it listens for changes in GitHub’s master branch, tests and compiles back-end and front-end, builds and deploys the official docker images and runs the Sonar scanner for static code analysis.

There will be future posts about Isotope’s CI pipeline and how to publish docker images with Travis-ci.

Isotope demo

You can check out the latest snapshot version in action at: isotope.marcnuri.com (Password: demo).

Isotope Mail Client
Isotope Mail Client
Twitter iconFacebook iconLinkedIn iconPinterest iconEmail icon

Comments in "Isotope Mail Client: Introduction and features"

  • Avatar for Isotope Mail: How to deploy Isotope+Traefik into Kubernetes - Marc Nuri
    Isotope Mail: How to deploy Isotope+Traefik into Kubernetes - Marc Nuri
    2019-10-10 18:22
    […] Isotope Mail Client: Introduction and features […]
  • Avatar for Isotope Mail: Cómo desplegar Isotope+Traefik en Kubernetes - Marc Nuri
    Isotope Mail: Cómo desplegar Isotope+Traefik en Kubernetes - Marc Nuri
    2019-11-14 04:43
    […] que he invertido más tiempo durante el pasado año. Puedes leer más información acerca de las funcionalidades de Isotope en una publicación […]
  • Avatar for Nicola
    Nicola
    2020-02-04 13:53
    If I have a SMTP server without authentication, how could I configure that?

    ...and I think your CAPTCHA is made to discourage questions! :-(
    • Avatar for Marc Nuri
      Marc Nuri
      2020-03-07 05:54
      …and I think your CAPTCHA is made to discourage questions!

      Hi Nicola, I'm sorry you feel this way.

      Regarding the blog, it's using Wordpress because it was what was easier and quicker to move to when I migrated from Blojsom several years ago. The plan is to move it to something else (probably GatsbyJS) but I don't have much spare time and this task is long overdue. I can tell you the Captcha is very necessary and even though it's there, I'm actually getting many spam comments.

      If you want to get in touch or ask questions about Isotope, there's a Gitter IM channel for that: https://gitter.im/isotope-mail/community (unfortunately it's not very active). So questions are not at all discouraged.

      SMTP server without authentication

      Having an SMTP without authentication is something very inadvisable and I really never considered it as a valid use case. So I'm not 100% sure, but I think that as of now, there is no way to login to an SMTP server without credentials. If you feel that this is something necessary or that you have a valid use case for that, please open an issue https://github.com/manusa/isotope-mail/issues/new


Post navigation
React: Babel 7 support in boilerplate applicationReact : Babel + Webpack + Sass boilerplate application
© 2007 - 2025 Marc Nuri