[Solved] ModuleNotFoundError: No module named 'collective.volto.acumbamail'

Hello everyone,

I currently have an error that I cannot resolve:

backend-1  | Using Relstorage configuration
backend-1  | 2026-02-27 08:45:12 INFO [chameleon.config:39][MainThread] directory cache: /app/var/cache.
backend-1  | 2026-02-27 08:45:16 INFO [relstorage.blobhelper.cached:176][MainThread] Spawning cache checker for /app/var/blobstorage (creating storage)
backend-1  | 2026-02-27 08:45:16 INFO [relstorage.blobhelper.cached:693][Thread-1 (Blob Cache Checker: /app/var/blobstorage)-spawn-Blob Cache Checker: /app/var/blobstorage] Checking blob cache size for /app/var/blobstorage. (target: 90.00 MB)
backend-1  | 2026-02-27 08:45:16 INFO [relstorage.blobhelper.cached:716][Thread-1 (Blob Cache Checker: /app/var/blobstorage)-spawn-Blob Cache Checker: /app/var/blobstorage] Traversed /app/var/blobstorage to compute size 84.95 MB (<= 90.00 MB); quitting.
backend-1  | 2026-02-27 08:45:16 INFO [relstorage.blobhelper.cached:219][Thread-1 (Blob Cache Checker: /app/var/blobstorage)-spawn-Blob Cache Checker: /app/var/blobstorage] Finished checking /app/var/blobstorage (in 0.000s) with size of 84.95 MB (max: 100.00 MB; target 90.00 MB)
backend-1  | Traceback (most recent call last):
backend-1  |   File "/app/lib/python3.12/site-packages/zope/configuration/xmlconfig.py", line 448, in endElementNS
backend-1  |     self.context.end()
backend-1  |   File "/app/lib/python3.12/site-packages/zope/configuration/config.py", line 748, in end
backend-1  |     self.stack.pop().finish()
backend-1  |   File "/app/lib/python3.12/site-packages/zope/configuration/config.py", line 918, in finish
backend-1  |     actions = self.handler(context, **args)
backend-1  |               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1  |   File "/app/lib/python3.12/site-packages/plone/autoinclude/zcml.py", line 37, in includePluginsDirective
backend-1  |     dists = loader.load_packages(target)
backend-1  |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1  |   File "/app/lib/python3.12/site-packages/plone/autoinclude/loader.py", line 192, in load_packages
backend-1  |     dists = load_own_packages(target=target)
backend-1  |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1  |   File "/app/lib/python3.12/site-packages/plone/autoinclude/loader.py", line 178, in load_own_packages
backend-1  |     module = importlib.import_module(module_name)
backend-1  |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1  |   File "/usr/local/lib/python3.12/importlib/__init__.py", line 90, in import_module
backend-1  |     return _bootstrap._gcd_import(name[level:], package, level)
backend-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1  |   File "<frozen importlib._bootstrap>", line 1387, in _gcd_import
backend-1  |   File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
backend-1  |   File "<frozen importlib._bootstrap>", line 1324, in _find_and_load_unlocked
backend-1  | ModuleNotFoundError: No module named 'collective.volto.acumbamail'
backend-1  |
backend-1  | During handling of the above exception, another exception occurred:
backend-1  |
backend-1  | Traceback (most recent call last):
backend-1  |   File "/app/bin/runwsgi", line 8, in <module>
backend-1  |     sys.exit(main())
backend-1  |              ^^^^^^
backend-1  |   File "/app/lib/python3.12/site-packages/Zope2/Startup/serve.py", line 251, in main
backend-1  |     return command.run()
backend-1  |            ^^^^^^^^^^^^^
backend-1  |   File "/app/lib/python3.12/site-packages/Zope2/Startup/serve.py", line 189, in run
backend-1  |     app = self.loadapp(app_spec, name=app_name, relative_to=base,
backend-1  |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1  |   File "/app/lib/python3.12/site-packages/Zope2/Startup/serve.py", line 220, in loadapp
backend-1  |     return loadapp(app_spec, name=name, relative_to=relative_to, **kw)
backend-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1  |   File "/app/lib/python3.12/site-packages/paste/deploy/loadwsgi.py", line 246, in loadapp
backend-1  |     return loadobj(APP, uri, name=name, **kw)
backend-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1  |   File "/app/lib/python3.12/site-packages/paste/deploy/loadwsgi.py", line 271, in loadobj
backend-1  |     return context.create()
backend-1  |            ^^^^^^^^^^^^^^^^
backend-1  |   File "/app/lib/python3.12/site-packages/paste/deploy/loadwsgi.py", line 738, in create
backend-1  |     return self.object_type.invoke(self)
backend-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1  |   File "/app/lib/python3.12/site-packages/paste/deploy/loadwsgi.py", line 198, in invoke
backend-1  |     app = context.app_context.create()
backend-1  |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1  |   File "/app/lib/python3.12/site-packages/paste/deploy/loadwsgi.py", line 738, in create
backend-1  |     return self.object_type.invoke(self)
backend-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1  |   File "/app/lib/python3.12/site-packages/paste/deploy/loadwsgi.py", line 136, in invoke
backend-1  |     return fix_call(context.object, context.global_conf, **context.local_conf)
backend-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1  |   File "/app/lib/python3.12/site-packages/paste/deploy/util.py", line 61, in fix_call
backend-1  |     val = callable(*args, **kw)
backend-1  |           ^^^^^^^^^^^^^^^^^^^^^
backend-1  |   File "/app/lib/python3.12/site-packages/Zope2/Startup/run.py", line 61, in make_wsgi_app
backend-1  |     starter.prepare()
backend-1  |   File "/app/lib/python3.12/site-packages/Zope2/Startup/starter.py", line 38, in prepare
backend-1  |     self.startZope()
backend-1  |   File "/app/lib/python3.12/site-packages/Zope2/Startup/starter.py", line 94, in startZope
backend-1  |     Zope2.startup_wsgi()
backend-1  |   File "/app/lib/python3.12/site-packages/Zope2/__init__.py", line 36, in startup_wsgi
backend-1  |     _startup()
backend-1  |   File "/app/lib/python3.12/site-packages/Zope2/App/startup.py", line 126, in startup
backend-1  |     load_zcml()
backend-1  |   File "/app/lib/python3.12/site-packages/Zope2/App/startup.py", line 41, in load_zcml
backend-1  |     load_site()
backend-1  |   File "/app/lib/python3.12/site-packages/Zope2/App/zcml.py", line 45, in load_site
backend-1  |     _context = xmlconfig.file(site_zcml)
backend-1  |                ^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1  |   File "/app/lib/python3.12/site-packages/zope/configuration/xmlconfig.py", line 717, in file
backend-1  |     include(context, name, package)
backend-1  |   File "/app/lib/python3.12/site-packages/zope/configuration/xmlconfig.py", line 614, in include
backend-1  |     processxmlfile(f, context)
backend-1  |   File "/app/lib/python3.12/site-packages/zope/configuration/xmlconfig.py", line 464, in processxmlfile
backend-1  |     parser.parse(src)
backend-1  |   File "/usr/local/lib/python3.12/xml/sax/expatreader.py", line 105, in parse
backend-1  |     xmlreader.IncrementalParser.parse(self, source)
backend-1  |   File "/usr/local/lib/python3.12/xml/sax/xmlreader.py", line 124, in parse
backend-1  |     self.feed(buffer)
backend-1  |   File "/usr/local/lib/python3.12/xml/sax/expatreader.py", line 211, in feed
backend-1  |     self._parser.Parse(data, isFinal)
backend-1  |   File "./Modules/pyexpat.c", line 475, in EndElement
backend-1  |   File "/usr/local/lib/python3.12/xml/sax/expatreader.py", line 389, in end_element_ns
backend-1  |     self._cont_handler.endElementNS(pair, None)
backend-1  |   File "/app/lib/python3.12/site-packages/zope/configuration/xmlconfig.py", line 450, in endElementNS
backend-1  |     self._handle_exception(ex, info)
backend-1  |   File "/app/lib/python3.12/site-packages/zope/configuration/xmlconfig.py", line 448, in endElementNS
backend-1  |     self.context.end()
backend-1  |   File "/app/lib/python3.12/site-packages/zope/configuration/config.py", line 748, in end
backend-1  |     self.stack.pop().finish()
backend-1  |   File "/app/lib/python3.12/site-packages/zope/configuration/config.py", line 918, in finish
backend-1  |     actions = self.handler(context, **args)
backend-1  |               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
backend-1  |   File "/app/lib/python3.12/site-packages/OFS/metaconfigure.py", line 47, in loadProducts
backend-1  |     xmlconfig.include(_context, zcml, package=product)
backend-1  |   File "/app/lib/python3.12/site-packages/zope/configuration/xmlconfig.py", line 614, in include
backend-1  |     processxmlfile(f, context)
backend-1  |   File "/app/lib/python3.12/site-packages/zope/configuration/xmlconfig.py", line 464, in processxmlfile
backend-1  |     parser.parse(src)
backend-1  |   File "/usr/local/lib/python3.12/xml/sax/expatreader.py", line 105, in parse
backend-1  |     xmlreader.IncrementalParser.parse(self, source)
backend-1  |   File "/usr/local/lib/python3.12/xml/sax/xmlreader.py", line 124, in parse
backend-1  |     self.feed(buffer)
backend-1  |   File "/usr/local/lib/python3.12/xml/sax/expatreader.py", line 211, in feed
backend-1  |     self._parser.Parse(data, isFinal)
backend-1  |   File "./Modules/pyexpat.c", line 475, in EndElement
backend-1  |   File "/usr/local/lib/python3.12/xml/sax/expatreader.py", line 389, in end_element_ns
backend-1  |     self._cont_handler.endElementNS(pair, None)
backend-1  |   File "/app/lib/python3.12/site-packages/zope/configuration/xmlconfig.py", line 450, in endElementNS
backend-1  |     self._handle_exception(ex, info)
backend-1  |   File "/app/lib/python3.12/site-packages/zope/configuration/xmlconfig.py", line 237, in _handle_exception
backend-1  |     raise ZopeXMLConfigurationError(info, ex)
backend-1  | zope.configuration.xmlconfig.ZopeXMLConfigurationError: File "/app/lib/python3.12/site-packages/Products/CMFPlone/meta.zcml", line 67.2-71.8
backend-1  |     File "/app/etc/site.zcml", line 10.2-10.39
backend-1  |     ModuleNotFoundError: No module named 'collective.volto.acumbamail'

I have a monorepo project; these are the versions I use:

  • Python v3.12.11
  • Plone v6.1.2
  • Volto v18.29.1

The add-on collective.volto.acumbamail (GitHub - macagua/collective.volto.acumbamail: An integration for the Acumbamail service with Plone 6 · GitHub) is an extra add-on, it was created using the command pipx run cookieplone backend_addon

Below, I describe my settings for the collective.volto.acumbamail add-on:

backend/pyproject.toml

...
dependencies = [
    "Products.CMFPlone==6.1.2",
    "plone.api",
    "plone.restapi",
    "plone.volto",
    "collective.volto.acumbamail",
    "collective.honeypot",
    "kitconcept.voltolighttheme==7.6.0",
    "Products.PrintingMailHost==1.1.8",
]
...

backend/mx.ini

...
[collective.volto.acumbamail]
url = ${settings:github}/macagua/collective.volto.acumbamail.git
pushurl = ${settings:github-pushurl}:macagua/collective.volto.acumbamail.git
branch = main

backend/instance.yaml

default_context:
    initial_user_password: 'admin'
    zcml_package_includes: project.title, collective.volto.acumbamail

backend/src/project/title/dependencies.zcml

<?xml version="1.0" encoding="utf-8"?>
<configure xmlns="http://namespaces.zope.org/zope">
  <include package="plone.restapi" />
  <include package="plone.volto" />
  <include package="plone.app.caching" />
  <include package="plone.app.dexterity" />
  <include package="plone.app.iterate" />
  <include package="collective.volto.acumbamail" />
  <include package="collective.volto.formsupport" />
  <include package="collective.honeypot" />
  <include package="collective.volto.gdprcookie" />
  <include package="collective.geolocationbehavior" />
  <include package="plone.formwidget.geolocation" />
  <include package="kitconcept.voltolighttheme" />
</configure>

backend/src/project/title/profiles/default/metadata.xml

<?xml version="1.0" encoding="utf-8"?>
<metadata>
  <version>1000</version>
  <dependencies>
    <dependency>profile-plone.volto:default</dependency>
    <dependency>profile-plone.app.caching:default</dependency>
    <dependency>profile-plone.app.caching:with-caching-proxy</dependency>
    <dependency>profile-plone.app.dexterity:default</dependency>
    <dependency>profile-plone.app.iterate:default</dependency>
    <dependency>profile-collective.volto.acumbamail:default</dependency>
    <dependency>profile-collective.volto.formsupport:default</dependency>
    <dependency>profile-collective.volto.gdprcookie:default</dependency>
    <dependency>profile-collective.geolocationbehavior:default</dependency>
    <dependency>profile-plone.formwidget.geolocation:default</dependency>
    <dependency>profile-kitconcept.voltolighttheme:default</dependency>
  </dependencies>
</metadata>

If I verify that the collective.volto.acumbamail add-on is installed in the virtual environment:

uv pip list | grep "collective"

Using Python 3.12.11 environment at: /home/macagua/projects/.venv
collective-address                 1.7.dev0    /home/macagua/projects/backend/sources/collective.address
collective-geolocationbehavior     1.7.3.dev0  /home/macagua/projects/backend/sources/collective.geolocationbehavior
collective-honeypot                4.0.0
collective-mockmailhost            3.0.0
collective-monkeypatcher           2.0.0
collective-venue                   4.2.dev0    /home/macagua/projects/backend/sources/collective.venue
collective-volto-acumbamail        1.0.0a0     /home/macagua/projects/backend/sources/collective.volto.acumbamail
collective-volto-formsupport       3.3.3.dev0  /home/macagua/projects/backend/sources/collective.volto.formsupport
collective-volto-gdprcookie        1.0.5.dev0  /home/macagua/projects/backend/sources/collective.volto.gdprcookie
collective-volto-otp               1.0.1

If I validate that the collective.volto.acumbamail module is located in the backend/sources/collective.volto.acumbamail directory:

ls backend/sources/

collective.address  collective.geolocationbehavior  collective.venue  collective.volto.acumbamail  collective.volto.formsupport  collective.volto.gdprcookie  plone.formwidget.geolocation

So, the collective.volto.acumbamail add-on is installed in the virtual environment, but I still get the error ModuleNotFoundError: No module named 'collective.volto.acumbamail'
when I start the backend Docker container.

If I change to the backend/sources/collective.volto.acumbamail directory to check if the collective.volto.acumbamail add-on is installed correctly via Makefile:

make install
make create-site
make start

And the Zope instance starts without any error.

If I remove the collective.volto.acumbamail add-on from the backend/mx.ini file, the Zope instance starts without any error.

Also if I remove the collective.volto.acumbamail add-on from the backend/instance.yaml file, the Zope instance starts without any error.

Please, can you help me to resolve this error? I have been trying to solve it for a while, but I cannot find the solution.

Thank you in advance for your help!

This sort of thing can happen if you have a mix of packages that are still using pkg_resources namespaces along with packages that are not (especially when some of them are installed as editable packages).

The first thing to try is install horse-with-no-namespace into the virtualenv. It changes how pkg_resources namespace packages work so that they are compatible with the new kind.

1 Like

@davisagli You mean I should install the collective.volto.acumbamail add-on inside a virtualenv, right?

No, I meant what I said: install horse-with-no-namespace in the virtualenv you are using for this project.

1 Like

You are literally referring to the Python package called horse-with-no-namespace hehehe, let's me try with this

You can resolve this error as follows:

  1. Upgrade the Plone instance from the Plone version 6.1.2 to 6.1.4

  2. Install the horse-with-no-namespace add-on via the command: uv pip install "horse-with-no-namespace"

  3. Add the following code into every __init__.py file:

    src/collective/__init__.py file:

    # See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages
    try:
        __import__("pkg_resources").declare_namespace(__name__)
    except ImportError:
        from pkgutil import extend_path
    
        import sys
    
        __path__[:] = extend_path(__path__, __name__)
    
        def __getattr__(name):
            fullname = f"{__name__}.{name}"
            if fullname in sys.modules:
                return sys.modules[fullname]
            raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
    

    src/collective/volto/__init__.py file:

    # See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages
    try:
        __import__("pkg_resources").declare_namespace(__name__)
    except ImportError:
        from pkgutil import extend_path
    
        import sys
    
        __path__[:] = extend_path(__path__, __name__)
    
        def __getattr__(name):
            fullname = f"{__name__}.{name}"
            if fullname in sys.modules:
                return sys.modules[fullname]
            raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
    
  4. Uninstall the collective.volto.acumbamail add-on via the following commands:

    • uv pip install "collective.volto.acumbamail"
    • rm -rf backend/sources/collective.volto.acumbamail/
  5. Install again the backend via the command: make backend-install

  6. Start the backend via the command: make backend-start

This will resolve the issue when starting the instance and installing the collective.volto.acumbamail add-on