Go to file
Cyril Pletinckx 9afde790c6 email: Open a single SMTP connection to send email batches.
Previously the outgoing emails were sent over several SMTP
connections through the EmailSendingWorker; establishing a new
connection each time adds notable overhead.

Redefine EmailSendingWorker worker to be a LoopQueueProcessingWorker,
which allows it to handle batches of events. At the same time, persist
the connection across email sending, if possible.

The connection is initialized in the constructor of the worker
in order to keep the same connection throughout the whole process.
The concrete implementation of the consume_batch function is simply
processing each email one at a time until they have all been sent.

In order to reuse the previously implemented decorator to retry
sending failures a new method that meets the decorator's required
arguments is declared inside the EmailSendingWorker class. This
allows to retry the sending process of a particular email inside
the batch if the caught exception leaves this process retriable.

A second retry mechanism is used inside the initialize_connection
function to redo the opening of the connection until it works or
until three attempts failed. For this purpose the backoff module
has been added to the dependencies and a test has been added to
ensure that this retry mechanism works well.

The connection is closed when the stop method is called.

Fixes: #17672.
2021-04-26 17:27:22 -07:00
.github tools: Have `optimize-svg` do the optimization automatiically. 2021-04-19 10:16:54 -07:00
.tx cleanup: Delete trailing newlines. 2019-08-06 23:29:11 -07:00
analytics templates: Mark all void tags as self-closing. 2021-04-21 09:49:34 -07:00
confirmation python: Normalize quotes with Black. 2021-02-12 13:11:19 -08:00
corporate python: Convert deprecated Django ugettext alias to gettext. 2021-04-15 18:01:34 -07:00
docs docs: Fix double-period typo in settings.md. 2021-04-26 17:07:41 -07:00
frontend_tests tests: Fix comments in node tests of settings_org.js. 2021-04-26 17:07:58 -07:00
locale i18n: Update translation data from Transifex. 2021-04-15 15:37:33 -07:00
pgroonga python: Normalize quotes with Black. 2021-02-12 13:11:19 -08:00
puppet puppet: Add override for queue_workers_multiprocess. 2021-04-20 14:37:15 -07:00
requirements email: Open a single SMTP connection to send email batches. 2021-04-26 17:27:22 -07:00
scripts clean-unused-caches: Add script to remove redundant yarn cache. 2021-04-26 16:28:08 -07:00
static settings: Remove extra space from options of invite_to_realm_policy. 2021-04-26 17:07:58 -07:00
stubs requirements: Upgrade mypy to 0.790. 2020-11-12 15:44:30 -08:00
templates dev_login: Show 'shiva' in a separate Moderators section. 2021-04-26 17:14:06 -07:00
tools docs: Add missing space to compound verbs “log in”, “set up”, etc. 2021-04-26 09:31:08 -07:00
var/puppeteer puppeteer_tests: Port to TypeScript. 2021-02-22 16:03:10 -08:00
zerver email: Open a single SMTP connection to send email batches. 2021-04-26 17:27:22 -07:00
zilencer python: Convert deprecated Django ugettext alias to gettext. 2021-04-15 18:01:34 -07:00
zproject docs: Add missing space to compound verbs “log in”, “set up”, etc. 2021-04-26 09:31:08 -07:00
zthumbor python: Normalize quotes with Black. 2021-02-12 13:11:19 -08:00
.browserslistrc browserslist: Drop 0.2% usage threshold to 0.15%. 2020-09-28 10:57:49 -07:00
.codecov.yml codecov: Change threshold to use percentage syntax. 2019-07-20 14:37:04 -07:00
.editorconfig lint: Add shfmt as a linter. 2020-10-15 15:16:00 -07:00
.eslintignore gitignore: Ignore zulip-thumbor-venv. 2021-03-04 18:06:21 -08:00
.eslintrc.json js: Extract password_quality module; remove zxcvbn from globals. 2021-04-24 13:08:52 -07:00
.gitattributes Revert "gitattributes: Mark yarn.lock as "binary", i.e. suppress diffs." 2019-05-20 19:31:14 -07:00
.gitignore ci: Use general terms for CircleCI. 2021-03-16 14:56:43 -07:00
.gitlint lint: Re-enable imperative-mood checking. 2021-02-23 14:54:07 -08:00
.mailmap mailmap: Document Alya's old email address. 2021-04-01 11:24:03 -07:00
.npmignore
.prettierignore lint: Use Prettier for JSON files. 2020-07-24 09:42:56 -07:00
.pyre_configuration pysa: Update .pyre_configuration to point to typeshed. 2020-09-22 15:44:47 -07:00
.sonarcloud.properties tools: Configure Zulip to be scannable by SonarCloud. 2020-06-24 12:41:17 -07:00
.yarnrc .yarnrc: Set ignore-scripts true. 2019-08-28 16:15:54 -07:00
CODE_OF_CONDUCT.md docs: Remove dead link to citizencodeofconduct.org. 2021-04-09 12:10:42 -07:00
CONTRIBUTING.md docs: Mention GitHub sponsors in contributing guide. 2021-03-23 15:57:25 -07:00
Dockerfile-postgresql docs: Standardize on PostgreSQL, not Postgres. 2020-10-28 11:55:16 -07:00
LICENSE license: Move copyright notice from LICENSE to NOTICE. 2021-02-05 09:28:12 -08:00
NOTICE docs: Bump copyright year. 2021-02-05 09:28:15 -08:00
README.md readme: Add GitHub sponsors badge in README. 2021-03-23 15:56:46 -07:00
SECURITY.md docs: Fix more capitalization issues. 2020-10-23 11:46:55 -07:00
Vagrantfile vagrant: Add hyperV support to vagrant config. 2021-04-13 21:04:44 -07:00
babel.config.js i18n: Initialize FormatJS. 2021-04-13 17:41:10 -07:00
manage.py python: Normalize quotes with Black. 2021-02-12 13:11:19 -08:00
mypy.ini mypy: Enable strict_equality. 2021-04-13 11:18:52 -07:00
package.json i18n: Remove i18next. 2021-04-13 17:41:10 -07:00
postcss.config.js styles: Use range context queries to eliminate *_max variables. 2021-02-05 09:23:59 -08:00
prettier.config.js casper: Remove few traces of casper. 2020-08-30 17:16:02 -07:00
pyproject.toml isort: Move configuration into pyproject.toml. 2021-03-04 18:03:30 -08:00
setup.cfg pycodestyle: Improve comments documenting excludes. 2021-02-12 13:11:25 -08:00
stylelint.config.js styles: Consistently use generic fallback font families. 2021-04-05 15:18:41 -07:00
tsconfig.json dependencies: Add ts-node. 2021-02-22 16:03:10 -08:00
version.py email: Open a single SMTP connection to send email batches. 2021-04-26 17:27:22 -07:00
webpack.config.ts js: Extract password_quality module; remove zxcvbn from globals. 2021-04-24 13:08:52 -07:00
yarn.lock i18n: Remove i18next. 2021-04-13 17:41:10 -07:00

README.md

Zulip overview

Zulip is a powerful, open source group chat application that combines the immediacy of real-time chat with the productivity benefits of threaded conversations. Zulip is used by open source projects, Fortune 500 companies, large standards bodies, and others who need a real-time chat system that allows users to easily process hundreds or thousands of messages a day. With over 700 contributors merging over 500 commits a month, Zulip is also the largest and fastest growing open source group chat project.

GitHub Actions build status coverage status Mypy coverage code style: black code style: prettier GitHub release docs Zulip chat Twitter GitHub Sponsors

Getting started

Click on the appropriate link below. If nothing seems to apply, join us on the Zulip community server and tell us what's up!

You might be interested in:

You may also be interested in reading our blog or following us on Twitter. Zulip is distributed under the Apache 2.0 license.