{"id":13448792,"url":"https://github.com/pmclanahan/django-celery-email","last_synced_at":"2025-10-06T02:31:51.931Z","repository":{"id":45789894,"uuid":"3256774","full_name":"pmclanahan/django-celery-email","owner":"pmclanahan","description":"A Django email backend that uses a celery task for sending the email.","archived":true,"fork":false,"pushed_at":"2024-03-05T03:03:33.000Z","size":121,"stargazers_count":475,"open_issues_count":34,"forks_count":105,"subscribers_count":18,"default_branch":"master","last_synced_at":"2025-09-22T10:08:25.771Z","etag":null,"topics":["celery","django","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pmclanahan.png","metadata":{"files":{"readme":"README.rst","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2012-01-24T15:14:33.000Z","updated_at":"2025-09-05T10:13:04.000Z","dependencies_parsed_at":"2022-07-17T00:16:28.000Z","dependency_job_id":"5b0c28bb-1705-436f-a9e7-c88e9dd398e6","html_url":"https://github.com/pmclanahan/django-celery-email","commit_stats":{"total_commits":128,"total_committers":31,"mean_commits":4.129032258064516,"dds":0.8359375,"last_synced_commit":"d47da19c09e29eea90684692e8dfa059e026c046"},"previous_names":[],"tags_count":19,"template":false,"template_full_name":null,"purl":"pkg:github/pmclanahan/django-celery-email","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pmclanahan%2Fdjango-celery-email","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pmclanahan%2Fdjango-celery-email/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pmclanahan%2Fdjango-celery-email/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pmclanahan%2Fdjango-celery-email/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pmclanahan","download_url":"https://codeload.github.com/pmclanahan/django-celery-email/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pmclanahan%2Fdjango-celery-email/sbom","scorecard":{"id":738715,"data":{"date":"2025-08-11","repo":{"name":"github.com/pmclanahan/django-celery-email","commit":"d47da19c09e29eea90684692e8dfa059e026c046"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.8,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":0,"reason":"project is archived","details":["Warn: Repository is archived."],"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":8,"reason":"Found 6/7 approved changesets -- score normalized to 8","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: BSD 3-Clause \"New\" or \"Revised\" License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 29 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"34 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2021-858 / GHSA-q4xr-rc97-m4xx","Warn: Project is vulnerable to: PYSEC-2022-190 / GHSA-2gwj-7jmv-h26r","Warn: Project is vulnerable to: PYSEC-2020-32 / GHSA-2m34-jcjv-45xf","Warn: Project is vulnerable to: PYSEC-2020-36 / GHSA-3gh2-xw74-jmcw","Warn: Project is vulnerable to: PYSEC-2022-1 / GHSA-53qw-q765-4fww","Warn: Project is vulnerable to: PYSEC-2021-98 / GHSA-68w8-qjq3-2gfm","Warn: Project is vulnerable to: GHSA-6c3j-c64m-qhgq","Warn: Project is vulnerable to: PYSEC-2019-10 / GHSA-6c7v-2f49-8h26","Warn: Project is vulnerable to: PYSEC-2022-20 / GHSA-6cw3-g6wv-c2xv","Warn: Project is vulnerable to: PYSEC-2019-13 / GHSA-6r97-cj55-9hrq","Warn: Project is vulnerable to: PYSEC-2019-79 / GHSA-7rp2-fm2h-wchj","Warn: Project is vulnerable to: GHSA-7xr5-9hcq-chf9","Warn: Project is vulnerable to: PYSEC-2022-2 / GHSA-8c5j-9r9f-c6w8","Warn: Project is vulnerable to: GHSA-8x94-hmjh-97hq","Warn: Project is vulnerable to: PYSEC-2022-19 / GHSA-95rw-fx8r-36v6","Warn: Project is vulnerable to: PYSEC-2019-11 / GHSA-c4qh-4vgv-qc6g","Warn: Project is vulnerable to: PYSEC-2020-34 / GHSA-fr28-569j-53c4","Warn: Project is vulnerable to: PYSEC-2021-9 / GHSA-fvgf-6h6h-3322","Warn: Project is vulnerable to: PYSEC-2019-12 / GHSA-h5jv-4p7w-64jg","Warn: Project is vulnerable to: PYSEC-2020-35 / GHSA-hmr4-m2h5-33qx","Warn: Project is vulnerable to: PYSEC-2019-15 / GHSA-hvmf-r92r-27hr","Warn: Project is vulnerable to: PYSEC-2022-3 / GHSA-jrh2-hc4r-7jwx","Warn: Project is vulnerable to: PYSEC-2020-33 / GHSA-m6gj-h9gm-gw44","Warn: Project is vulnerable to: PYSEC-2021-99 / GHSA-p99v-5w3c-jqq9","Warn: Project is vulnerable to: PYSEC-2021-8 / GHSA-qm57-vhq3-3fwf","Warn: Project is vulnerable to: GHSA-rrqc-c2jx-6jgv","Warn: Project is vulnerable to: PYSEC-2021-7 / GHSA-rxjp-mfm9-w4wr","Warn: Project is vulnerable to: PYSEC-2021-439 / GHSA-v6rh-hp5x-86rv","Warn: Project is vulnerable to: PYSEC-2019-14 / GHSA-v9qg-3j8p-r63v","Warn: Project is vulnerable to: PYSEC-2019-16 / GHSA-vfq6-hq5r-27r6","Warn: Project is vulnerable to: PYSEC-2022-191 / GHSA-w24h-v9qh-8gxj","Warn: Project is vulnerable to: PYSEC-2020-31 / GHSA-wpjr-j57x-wxfw","Warn: Project is vulnerable to: PYSEC-2021-6 / GHSA-xgxc-v2qg-chmh","Warn: Project is vulnerable to: PYSEC-2022-43017 / GHSA-qwmp-2cf2-g9g6"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-22T16:42:10.710Z","repository_id":45789894,"created_at":"2025-08-22T16:42:10.711Z","updated_at":"2025-08-22T16:42:10.711Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278549380,"owners_count":26005092,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-06T02:00:05.630Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["celery","django","python"],"created_at":"2024-07-31T06:00:21.235Z","updated_at":"2025-10-06T02:31:51.639Z","avatar_url":"https://github.com/pmclanahan.png","language":"Python","funding_links":[],"categories":["Email","Python"],"sub_categories":[],"readme":"==========================================================\ndjango-celery-email - A Celery-backed Django Email Backend\n==========================================================\n\n.. image:: https://img.shields.io/travis/pmclanahan/django-celery-email/master.svg\n    :target: https://travis-ci.org/pmclanahan/django-celery-email\n.. image:: https://img.shields.io/pypi/v/django-celery-email.svg\n    :target: https://pypi.python.org/pypi/django-celery-email\n\nA `Django`_ email backend that uses a `Celery`_ queue for out-of-band sending\nof the messages.\n\n.. _`Celery`: http://celeryproject.org/\n.. _`Django`: http://www.djangoproject.org/\n\n.. warning::\n\n\tThis version requires the following versions:\n\n\t* Python \u003e= 3.7\n\t* Django 2.2, 3.0, 3.1, 3.2\n\t* Celery \u003e= 4.0\n\nUsing django-celery-email\n=========================\n\nTo enable ``django-celery-email`` for your project you need to add ``djcelery_email`` to\n``INSTALLED_APPS``::\n\n    INSTALLED_APPS += (\"djcelery_email\",)\n\nYou must then set ``django-celery-email`` as your ``EMAIL_BACKEND``::\n\n    EMAIL_BACKEND = 'djcelery_email.backends.CeleryEmailBackend'\n\nBy default ``django-celery-email`` will use Django's builtin ``SMTP`` email backend\nfor the actual sending of the mail. If you'd like to use another backend, you\nmay set it in ``CELERY_EMAIL_BACKEND`` just like you would normally have set\n``EMAIL_BACKEND`` before you were using Celery. In fact, the normal installation\nprocedure will most likely be to get your email working using only Django, then\nchange ``EMAIL_BACKEND`` to ``CELERY_EMAIL_BACKEND``, and then add the new\n``EMAIL_BACKEND`` setting from above.\n\nMass email are sent in chunks of size ``CELERY_EMAIL_CHUNK_SIZE`` (defaults to 10).\n\nIf you need to set any of the settings (attributes) you'd normally be able to set on a\n`Celery Task`_ class had you written it yourself, you may specify them in a ``dict``\nin the ``CELERY_EMAIL_TASK_CONFIG`` setting::\n\n    CELERY_EMAIL_TASK_CONFIG = {\n        'queue' : 'email',\n        'rate_limit' : '50/m',  # * CELERY_EMAIL_CHUNK_SIZE (default: 10)\n        ...\n    }\n\nThere are some default settings. Unless you specify otherwise, the equivalent of the\nfollowing settings will apply::\n\n    CELERY_EMAIL_TASK_CONFIG = {\n        'name': 'djcelery_email_send',\n        'ignore_result': True,\n    }\n\nAfter this setup is complete, and you have a working Celery install, sending\nemail will work exactly like it did before, except that the sending will be\nhandled by your Celery workers::\n\n    from django.core import mail\n\n    emails = (\n        ('Hey Man', \"I'm The Dude! So that's what you call me.\", 'dude@aol.com', ['mr@lebowski.com']),\n        ('Dammit Walter', \"Let's go bowlin'.\", 'dude@aol.com', ['wsobchak@vfw.org']),\n    )\n    results = mail.send_mass_mail(emails)\n\n``results`` will be a list of celery `AsyncResult`_ objects that you may ignore, or use to check the\nstatus of the email delivery task, or even wait for it to complete if want. You have to enable a result\nbackend and set ``ignore_result`` to ``False`` in ``CELERY_EMAIL_TASK_CONFIG`` if you want to use these.\nYou should also set ``CELERY_EMAIL_CHUNK_SIZE = 1`` in settings if you are concerned about task status\nand results.\n\nSee the `Celery docs`_ for more info.\n\n\n``len(results)`` will be the number of emails you attempted to send divided by CELERY_EMAIL_CHUNK_SIZE, and is in no way a reflection on the success or failure\nof their delivery.\n\n.. _`Celery Task`: http://celery.readthedocs.org/en/latest/userguide/tasks.html#basics\n.. _`Celery docs`: http://celery.readthedocs.org/en/latest/userguide/tasks.html#task-states\n.. _`AsyncResult`: http://celery.readthedocs.org/en/latest/reference/celery.result.html#celery.result.AsyncResult\n\nChangelog\n=========\n\n3.1.0 - Unreleased\n------------------\n\n* Support for Django 3.1\n* Support for Celery 5\n\n3.0.0 - 2019.12.10\n------------------\n\n* Support for Django 3.0\n* Support for Python 3.8\n* Droppped support for Django 1.x, Django 2.0 and Django 2.1\n* Droppped support for Python 2.7\n\n2.0.2 - 2019.05.29\n------------------\n\n* Reduce memory usage by running email_to_dict on chunks. Thanks `Paul Brown`_.\n* Simplify dict_to_email for readability and efficiency. Thanks `Paul Brown`_.\n* Update test matrix for supported versions of Django, Celery and Python. Thanks `James`_.\n\n.. _Paul Brown: https://github.com/pawl\n.. _James: https://github.com/jmsmkn\n\n2.0.1 - 2018.18.27\n------------------\n* Fix bug preventing sending text/* encoded mime attachments. Thanks `Cesar Canassa`_.\n\n.. _Cesar Canassa: https://github.com/canassa\n\n2.0 - 2017.07.10\n----------------\n* Support for Django 1.11 and Celery 4.0\n* Dropped support for Celery 2.x and 3.x\n* Dropped support for Python 3.3\n\n1.1.5 - 2016.07.20\n------------------\n* Support extra email attributes via CELERY_EMAIL_MESSAGE_EXTRA_ATTRIBUTES setting\n* Updated version requirements in README\n\n\n1.1.4 - 2016.01.19\n------------------\n\n* Support sending email with embedded images. Thanks `Georg Zimmer`_.\n* Document CELERY_EMAIL_CHUNK_SIZE. Thanks `Jonas Haag`_.\n* Add exception handling to email backend connection. Thanks `Tom`_.\n\n.. _Georg Zimmer: https://github.com/georgmzimmer\n.. _Tom: https://github.com/tomleo\n\n1.1.3 - 2015.11.06\n------------------\n\n* Support setting celery.base from string. Thanks `Matthew Jacobi`_.\n* Use six for py2/3 string compatibility. Thanks `Matthew Jacobi`_.\n* Pass content_subtype back in for retries. Thanks `Mark Joshua Tan`_.\n* Rework how tests work, add tox, rework travis-ci matrix.\n* Use six from django.utils.\n* Release a universal wheel.\n\n.. _Matthew Jacobi: https://github.com/oppianmatt\n.. _Mark Joshua Tan: https://github.com/mark-tan\n\n1.1.2 - 2015.07.06\n------------------\n\n* Fix for HTML-only emails. Thanks `gnarvaja`_.\n\n.. _gnarvaja: https://github.com/gnarvaja\n\n1.1.1 - 2015.03.20\n------------------\n\n* Fix for backward compatibility of task kwarg handling - Thanks `Jeremy Thurgood`_.\n\n.. _Jeremy Thurgood: https://github.com/jerith\n\n1.1.0 - 2015.03.06\n------------------\n\n* New PyPI release rolling up 1.0.5 changes and some cleanup.\n* More backward compatability in task. Will still accept message objects and lists of message objects.\n* Thanks again to everyone who contributed to 1.0.5.\n\n1.0.5 - 2014.08.24\n------------------\n\n* Django 1.6 support, Travis CI testing, chunked sending \u0026 more - thanks `Jonas Haag`_.\n* HTML email support - thanks `Andres Riancho`_.\n* Support for JSON transit for Celery, sponsored by `DigiACTive`_.\n* Drop support for Django 1.2.\n\n.. _`Jonas Haag`: https://github.com/jonashaag\n.. _`Andres Riancho`: https://github.com/andresriancho\n.. _`DigiACTive`: https://github.com/digiactive\n\n1.0.4 - 2013.10.12\n------------------\n\n* Add Django 1.5.2 and Python 3 support.\n* Thanks to `Stefan Wehrmeyer`_ for the contribution.\n\n.. _`Stefan Wehrmeyer`: https://github.com/stefanw\n\n1.0.3 - 2012.03.06\n------------------\n\n* Backend will now pass any kwargs with which it is initialized to the\n  email sending backend.\n* Thanks to `Fedor Tyurin`_ for the contribution.\n\n.. _`Fedor Tyurin`: https://bitbucket.org/ftyurin\n\n\n1.0.2 - 2012.02.21\n------------------\n\n* Task and backend now accept kwargs that can be used in signal handlers.\n* Task now returns the result from the email sending backend.\n* Thanks to `Yehonatan Daniv`_ for these changes.\n\n.. _`Yehonatan Daniv`: https://bitbucket.org/ydaniv\n\n1.0.1 - 2011.10.06\n------------------\n\n* Fixed a bug that resulted in tasks that were throwing errors reporting success.\n* If there is an exception thrown by the sending email backend, the result of the task will\n  now be this exception.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpmclanahan%2Fdjango-celery-email","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpmclanahan%2Fdjango-celery-email","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpmclanahan%2Fdjango-celery-email/lists"}