Messages

PRs Welcome GitHub commit activity GitHub closed issues MIT License

Chat on Matrix - Documentation - Roadmap - Getting started - Reach out

# Messages : Collaborative Inbox Messages is the all-in-one collaborative inbox for [La Suite territoriale](https://suiteterritoriale.anct.gouv.fr/). Messages screenshot ## Why use Messages โ“ Messages is a full communication platform enabling teams to collaborate on emails through shared or personal mailboxes. It features a [MTA](https://en.wikipedia.org/wiki/Message_transfer_agent) based on [Postfix](https://www.postfix.org/), a custom [MDA](https://en.wikipedia.org/wiki/Message_delivery_agent) built on top of [Django Rest Framework](https://www.django-rest-framework.org/) and a frontend using [Next.js](https://nextjs.org/) and [BlockNote.js](https://www.blocknotejs.org/). ### Familiar messaging features * ๐Ÿ“ Receive, draft and send emails. * ๐Ÿงต Smart threading * ๐Ÿ“Ž Upload and download attachments. Also works with [Drive](https://github.com/suitenumerique/drive)! * ๐Ÿ“ฉ Import emails from MBOX or IMAP * ๐Ÿ”Ž Full-text search with advanced filters * โณ๏ธ Asynchronous, pluggable email processing (antispam, antivirus, ...) * ๐Ÿค– AI Summaries, AI message composer, AI auto-labelling * ๐ŸŽจ Embeddable widgets for feedback ### Collaboration at the core * ๐Ÿ‘ฅ Share any inbox with multiple users * ๐Ÿงถ Share threads with other users * (soon) ๐Ÿ•ถ Private messages between users * (soon) ๐Ÿ’Ž Realtime text editing * (soon) ๐Ÿ‘‰ Assign threads to specific users ### Based on standards * ๐Ÿ”‘ OpenID Connect for all user accounts. Plug any identity provider, including Keycloak. * ๐Ÿ“ฌ SMTP in and out. * โŒ No POP3 or IMAP client support, by design. We're building for the future, not the (unsecure) past! * โœ… JMAP-inspired data model. Full support could be added. ### Self-host * ๐Ÿš€ Messages is designed to be installed on the cloud or on your own servers. * ๐Ÿ› ๏ธ Configuration through environment variables for most settings Messages architecture ## Getting started ๐Ÿ”ง ### Prerequisite To test Messages on your own machine, you only need a recent version of Docker and [Docker Compose](https://docs.docker.com/compose/install): ```shellscript $ docker -v Docker version 27.5.1, build 9f9e405 $ docker compose version Docker Compose version v2.32.4 ``` > โš ๏ธ You may need to run the following commands with `sudo` but this can be > avoided by assigning your user to the `docker` group. ### Project bootstrap The easiest way to start working on the project is to use [GNU Make](https://www.gnu.org/software/make/): ```shellscript $ make bootstrap ``` This command builds all required containers, installs dependencies, performs database migrations and compiles translations. Later it's a good idea to run `make update` each time you are pulling code from the project repository to avoid dependency-related or migration-related issues. Your Docker services should now be up and running ๐ŸŽ‰ You can access the project by going to . You will be prompted to log in. The default credentials are: ``` email: user{1,2,3}@example.local password: user{1,2,3} ``` This means you can use `user1@example.local / user1` for instance and switch users later to test collaboration. In your development workflow, the main commands you should use are: ``` # Stop all containers $ make stop # Start all containers, without full bootstrap $ make start # View all available commands $ make help ``` ### Development Services When running the project, the following services are available: | Service | URL / Port | Description | Credentials | |---------|------------|-------------|------------| | **Frontend** | [http://localhost:8900](http://localhost:8900) | Main Messages frontend | `user1@example.local` / `user1` | | **Backend API** | [http://localhost:8901](http://localhost:8901) | Django [REST API](http://localhost:8901/api/v1.0/) and [Admin](http://localhost:8901/admin/) | `admin@admin.local` / `admin` | | **Keycloak** | [http://localhost:8902](http://localhost:8902) | Identity provider admin | `admin` / `admin` | | **Celery UI** | [http://localhost:8903](http://localhost:8903) | Task queue monitoring | No auth required | | **Mailcatcher** | [http://localhost:8904](http://localhost:8904) | Email testing interface | No auth required | | **MTA-in (SMTP)** | 8910 | Incoming email server | No auth required | | **MTA-out (SMTP)** | 8911 | Outgoing email server | `user` / `pass` | | **PostgreSQL** | 8912 | Database server | `user` / `pass` | | **Redis** | 8913 | Cache and message broker | No auth required | | **OpenSearch** | 8914 | Search engine | No auth required | | **OpenSearch PA** | 8915 | Performance analyzer | No auth required | | **SOCKS Proxy** | 8916 | SOCKS5 proxy | `user1` / `pwd1` | | **Mailcatcher (SMTP)** | 8917 | SMTP server | No auth required | | **MPA (Rspamd)** | 8918 | Spam filtering service | `password` | ### OpenAPI client The frontend API client is generated with [Orval](https://orval.dev/). It consumes the OpenAPI schema generated from the backend through [drf-spectacular](https://drf-spectacular.readthedocs.io/en/latest/). The JSON OpenAPI schema is located in `src/backend/core/api/openapi.json`. To update the schema then the frontend API client, run: ```bash $ make api-update ``` You can also generate the schema only with: ```bash $ make api-update-back ``` And the frontend API client only with: ```bash $ make api-update-front ``` ### Sending test emails ๐Ÿ“จ There are a couple ways of testing the email infrastructure locally. These examples use [swaks](https://www.jetmore.org/john/code/swaks/), a simple command-line SMTP client. ``` # First, make sure services are running make start # Send a test message to the MTA-in, which will relay it to the Django MDA. # The domain must be MESSAGES_TESTDOMAIN (default is example.local) if you want the mailbox created automatically. # You can then read it on the frontend at http://localhost:8900/ (login as user1/user1) and reply to it there. # The replies will then be sent to the mailcatcher on http://localhost:8904/ swaks --to=user1@example.local --server localhost:8910 # Send a test message to the mailcatcher, then read it on http://localhost:8904/ swaks --to=user1@example.local --server localhost:8917 # Send a test message to the MTA-out, which will then relay it to mailcatcher on http://localhost:8904/ swaks -tls --to=test@example.external --server localhost:8911 --auth-user user --auth-password=pass # You can also send emails using Messages itself instead of the frontend make shell-back MTA_OUT_MODE=relay MTA_OUT_RELAY_HOST=mailcatcher:1025 python manage.py send_mail --to=user1@example.local --subject="Test" --body="Hello World" ``` > โš ๏ธ Most residential ISPs block the outgoing port 25, so you might not be able to send emails to outside > servers from your localhost. This is why the mailcatcher is so useful locally. ## Feedback ๐Ÿ™‹โ€โ™‚๏ธ๐Ÿ™‹โ€โ™€๏ธ We'd love to hear your thoughts, and hear about your experiments, so come and say hi on [Matrix](https://matrix.to/#/#messages-official:matrix.org). ## License ๐Ÿ“ This work is released under the MIT License (see [LICENSE](https://github.com/suitenumerique/messages/blob/main/LICENSE)). While Messages is a public-driven initiative, our license choice is an invitation for private sector actors to use, sell and contribute to the project. ## Contributing ๐Ÿ™Œ This project is intended to be community-driven, so please, do not hesitate to [get in touch](https://matrix.to/#/#messages-official:matrix.org) if you have any question related to our implementation or design decisions. We also have a [public roadmap](https://github.com/orgs/suitenumerique/projects/4). You can help us with translations on [Crowdin](https://crowdin.com/project/lasuite-messages). If you intend to make pull requests, see [CONTRIBUTING](https://github.com/suitenumerique/messages/blob/main/CONTRIBUTING.md) for guidelines. ## Gov โค๏ธ open source Messages is currently led by the French [ANCT](https://anct.gouv.fr/) for use in [La Suite territoriale](https://suiteterritoriale.anct.gouv.fr/). We are welcoming new partners and contributors to join us in this effort! So please [get in touch](mailto:contact@suite.anct.gouv.fr) if you want to help!