How to set email configuration? --> Error


Dear community,
I tried setting the email preferences and got this info banner:

Upon clicking on “Mail” I go this error:

Is this supposed to happen?
If I did it wrong, what is the recommended way to set emial configuration?
I even tried setting it through ZMI after I got this error, but still without luck. I cannot make an entry for the “From” address there.

I want to be able to receive emails from senaite when devices are due for calibration. Is this possible?
Please enlighten me.



hi @der.einstein,
I followed the steps on the following page and it worked:
Try it, hope it works for you too.



Thx for your input @hsgkp, but the problem is, that I cannot access the page where I can entry my email details. It just leeves me with the error message above.

However, meanwhile I tried firing up the official Plone 5.x and 4.3 docker images.
In both cases everything seems to work there.
So I wonder what makes the difference there, as almost all is the same regarding Plone installation.

Is anybody else using the docker images?



This is a bug introduced recently that can only be reproduced in fresh-installations of v1.3.2. Has been fixed already: #1469 Fix Site Properties Generic Setup Export Step.

Please, update to latest source code and run the upgrade step 1.3.3 for senaite.core:

1.- Update to latest source code of senaite.core
2.- Login as admin user
3.- Go to “Site setup > Add-ons”
4.- In the “List of activated add-ons”, locate “Senaite Core 1.3.2” and press the button to upgrade your instance.


Thanks for this tip. I searched through this community site as well as github but could not find anything related to the email settings.
However, I struggled already with your first point:

I tried using “mr.developer” inside my docker container according to point “Installing development version of add-on packages” on However, it didn’t work. I modified the top rows of my buildout and ran “python” again. The lines are as follows:

extends =

extensions = mr.developer

auto-checkout = senaite.core

index =


effective-user = senaite
buildout-user = senaite


parts +=

eggs +=


On the tail I added:

senaite.core = git

It failed directly with this error message:

root@185b24f1b101:/home/senaite/senaitelims# python is deprecated and when using it setuptools will be pinned to 33.1.1 since it’s the last version that supports setuptools self upgrade/installation, check for more info; use pip to install setuptools
Extracting in /tmp/tmpzO27m_
Now working in /tmp/tmpzO27m_/setuptools-33.1.1
Building a Setuptools egg in /tmp/bootstrap-hDjouB
warning: no files found matching ‘*’ under directory ‘setuptools/_vendor’
no previously-included directories found matching ‘doc’
no previously-included directories found matching ‘old-tutorial’
Creating directory ‘/home/senaite/senaitelims/develop-eggs’.

What is the intended way to exchange a released package version with the current source from github?
What did I miss?
Is there another information source how to add github source packages to an already up and running instance?

Thank you very much!


Ok. I just tried the next step in the Dockerfile and ran “bin/buildout”. This is the output:

root@185b24f1b101:/home/senaite/senaitelims# bin/buildout
mr.developer: Queued ‘senaite.core’ for checkout.
mr.developer: Cloned ‘senaite.core’ with git from ‘’.
Develop: ‘/home/senaite/senaitelims/src/senaite.core’
warning: no previously-included files matching ‘’ found under directory ‘docs’
warning: no previously-included files matching '
.pyc’ found under directory ‘bika’
Uninstalling releaser.
Uninstalling checkdocs.
Uninstalling mrbob.
Uninstalling diazotools.
Uninstalling test.
Uninstalling precompiler.
Uninstalling zopepy.
Uninstalling instance.
Updating _mr.developer.
Installing instance.
Generated script ‘/home/senaite/senaitelims/bin/instance’.
Generated interpreter ‘/home/senaite/senaitelims/parts/instance/bin/interpreter’.
Updating zeoserver.
Updating repozo.
Updating backup.
Installing zopepy.
Generated interpreter ‘/home/senaite/senaitelims/bin/zopepy’.
Updating unifiedinstaller.
Installing precompiler.
Compiling Python files.
Compiling locale files.
Updating setpermissions.
setpermissions: Running # Dummy references to force this to execute after referenced parts
echo /data/backups yes > /dev/null
chmod 600 .installed.cfg

Make sure anything we’ve created in var is r/w by our group

find /data -type d -exec chmod 770 {} ; 2> /dev/null
find /data -type f -exec chmod 660 {} ; 2> /dev/null

but not the egg cache

chmod -R g-w /home/senaite/senaitelims/var/.python-eggs
find /data -type d -exec chmod 770 {} ; 2> /dev/null
find /data -type f -exec chmod 660 {} ; 2> /dev/null
chmod 754 /home/senaite/senaitelims/bin/*
chmod: cannot access ‘/home/senaite/senaitelims/var/.python-eggs’: No such file or directory
Updating zeo.
Versions had to be automatically picked.
The following part definition lists the versions picked:
[versions] = 1.0.0

From what is the output, this would suggest a “success”. However, in senaite it looks like this in the list of activated addons:

I cannot do anything there to upgrade to a newer version.

What has gone wrong?
Can you suggest something?

Thank you so much!


Hi @der.einstein I think that the easiest way to use the latest code in GitHub is using the development environment.

You have to at least add "senaite.core " under the eggs section but I suggest that you also add all other packages: senaite.core.listing, senaite.impress, etc

Now, you "git clone " in the “src/” folder.

Then, you have to define the “develop” section that points where to find the source code. Note that the code have to be in a local directory in your computer or server.

# Provide the *paths* to the eggs you are developing here:
develop =
#    src/my.package

If you are considering to use Senaite in a productive environment, I suggest that you hire professional services for guidance, help and training. It is the easiest way to deploy and customize Senaite having professional backup to face any inconvenience.


Thanks for your support. I really appreciate this.

I was successful with the following approach:

  1. from my server I ran

git clone
cd senaite.docker
cp -R 1.3.2 1.3.3
cd 1.3.3
mkdir src
cd src

Then I git cloned all senaite packages into the “src” folder.
Back in the “1.3.3” folder I modified the “Dockerfile” to read:

# Use an official Python runtime as a parent image
FROM python:2.7-stretch

# Set one or more individual labels
LABEL senaite.core.version="1.3.3-git"

# Set environment variables
    PLONE_VERSION=4.3.19 \
    PLONE_MD5=04ed5beac7fb8504f06a36d44e407b06 \
    SENAITE_HOME=/home/senaite \
    SENAITE_USER=senaite \
    SENAITE_INSTANCE_HOME=/home/senaite/senaitelims \
    SENAITE_DATA=/data \
    SENAITE_FILESTORAGE=/data/filestorage \
    SENAITE_BLOBSTORAGE=/data/blobstorage \
    ADDONS='senaite.lims senaite.core senaite.core.supermodel senaite.core.listing senaite.impress' \
    DEVELOP='src/senaite.lims src/senaite.core src/senaite.core.supermodel src/senaite.core.listing src/senaite.impress src/'

# Create the senaite user
RUN useradd --system -m -d $SENAITE_HOME -U -u 500 $SENAITE_USER

# Create direcotries

RUN echo "deb stretch-backports main contrib non-free" >> /etc/apt/sources.list

# Copy the package config
COPY packages.txt /

# Install package dependencies
RUN apt-get update && apt-get install -y --no-install-recommends $(grep -vE "^\s*#" /packages.txt  | tr "\n" " ") && apt-get -t stretch-backports install -y --no-install-recommends python-lxml && pip install lxml

# Fetch unified installer
RUN wget -O Plone.tgz$PLONE_MAJOR/$PLONE_VERSION/+download/Plone-$PLONE_VERSION-UnifiedInstaller.tgz \
    && echo "$PLONE_MD5 Plone.tgz" | md5sum -c - \
    && tar -xzf Plone.tgz \
    && cp -rv /Plone-$PLONE_VERSION-UnifiedInstaller/base_skeleton/* $SENAITE_INSTANCE_HOME \
    && cp -v /Plone-$PLONE_VERSION-UnifiedInstaller/buildout_templates/buildout.cfg $SENAITE_INSTANCE_HOME/buildout-base.cfg \
    && cd $SENAITE_HOME \
    && tar -xjf /Plone-$PLONE_VERSION-UnifiedInstaller/packages/buildout-cache.tar.bz2 \
    && rm -rf /Plone-$PLONE_VERSION-UnifiedInstaller /Plone.tgz

# Change working directory

# Copy Buildout
COPY buildout.cfg ./

COPY src ./src

# Bootstrap and buildout
RUN python \
    && bin/buildout \
    && ln -s $SENAITE_FILESTORAGE/ var/filestorage \
    && ln -s $SENAITE_BLOBSTORAGE/ var/blobstorage \
    && chown -R senaite:senaite $SENAITE_HOME $SENAITE_DATA \
    && rm -rf $SENAITE_HOME/buildout-cache/downloads/dist

# Mount external volume
VOLUME /data

# Copy startup scripts

# Expose instance port

# Add instance healthcheck
HEALTHCHECK --interval=1m --timeout=5s --start-period=1m \
  CMD nc -z -w5 8080 || exit 1

CMD ["start"]

The “docker-compose” file was modified to read:

version: "2"
    image: senaite-1.3.3-git:arm64
    - data:/data
    - $PWD/src:/home/senaite/senaitelims/src
    - "8080:8080"
            #- ADDONS=senaite.kanban
            - DEVELOP=src/senaite.core src/ src/senaite.core.listing src/senaite.core.supermodel src/senaite.impress src/senaite.lims
            - ADDONS=senaite.core senaite.core.listing senaite.core.supermodel senaite.impress senaite.lims
            - VERSIONS=senaite.core=1.3.3 senaite.lims=


In “buildout.cfg” I uncommented the lines which defined distinct versions for the senaite packages.

Now I built the docker image with

docker build -t senaite-1.3.3-git:arm64 .

I started the container with

docker-compose up

Now I have the current Seanite packages listed under “Addons” in the Plone configuration panel.
The email configuration works now!

Hope that this may help someone else!

BTW: You may have recognized that the platform “arm64”. I had to modify the “Dockerfile” to let it build on arm64.



Thanks for sharing this. Please share step-by-step terminal commands for your instructions. I am new to docker and unable to navigate properly to find the different files mentioned.


At which step do you struggle?

The steps on my last post just miss out the following:
cd src && git clone
… analogous all other senaite packages …
cd … & vi buildout.cfg
… to comment out the senaite packages lines under “[versions]”

Hope that helps!