21 Commits
0.0.4 ... 0.2.3

Author SHA1 Message Date
267a4954ab enable starttls and generate self-signed certificate
All checks were successful
ci/woodpecker/tag/woodpecker Pipeline was successful
ci/woodpecker/push/woodpecker Pipeline was successful
2024-12-21 14:22:39 +01:00
81f57a53ce fixes
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2024-12-21 13:43:41 +01:00
ee5ec605c6 disable starttls
All checks were successful
ci/woodpecker/tag/woodpecker Pipeline was successful
ci/woodpecker/push/woodpecker Pipeline was successful
2024-12-21 13:37:17 +01:00
3c855b055d disable starttls
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/tag/woodpecker Pipeline was successful
2024-12-21 13:35:41 +01:00
d7ed6afe41 k8s snippets
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2024-12-21 13:32:23 +01:00
b57cc949d3 ignore
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2024-12-21 13:31:11 +01:00
013c0c0859 fixed
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/tag/woodpecker Pipeline was successful
2024-12-21 13:00:15 +01:00
8464bf1f41 use m4 for config generation
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2024-12-21 12:46:39 +01:00
0bf33c582f auth added
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2024-12-20 23:56:43 +01:00
04ad6017e6 image name in dockerfile
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2024-12-20 23:02:46 +01:00
f205858c30 alpine approach completed
All checks were successful
ci/woodpecker/tag/woodpecker Pipeline was successful
ci/woodpecker/push/woodpecker Pipeline was successful
2024-12-11 11:32:47 +01:00
9f65b7690e alpine approach
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2024-12-11 10:55:34 +01:00
724e94afb6 reduce debug output
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/tag/woodpecker Pipeline was successful
2024-12-10 16:46:07 +01:00
fd5d006c33 documentation
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2024-12-10 16:43:49 +01:00
e8f66cd354 documentation
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2024-12-10 16:42:35 +01:00
93801d7577 documentation
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2024-12-10 16:40:17 +01:00
62a301cc58 two destinations
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/tag/woodpecker Pipeline was successful
2024-12-10 14:32:50 +01:00
ae2a789c3c quay fix
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/tag/woodpecker Pipeline was successful
2024-12-10 14:30:58 +01:00
1b6adce9dc quay fix
Some checks failed
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/tag/woodpecker Pipeline failed
2024-12-10 14:29:54 +01:00
4db1560da2 quay fix
Some checks failed
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/tag/woodpecker Pipeline failed
2024-12-10 14:27:03 +01:00
2d71d0d42c quay fix
Some checks failed
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/tag/woodpecker Pipeline failed
2024-12-10 14:13:55 +01:00
12 changed files with 229 additions and 65 deletions

3
.gitignore vendored
View File

@ -1,2 +1,5 @@
*~
.*~
ENV
ENV.test
tmp/

View File

@ -13,15 +13,14 @@ steps:
dockerfile: Dockerfile
when:
- event: [push, tag]
public_build:
build:
image: plugins/kaniko
settings:
repo: wollud1969/exim-docker
repo: quay.io/wollud1969/exim-docker
registry: quay.io
tags:
- quay.io/wollud1969/exim-docker/latest
- quay.io/wollud1969/exim-docker/${CI_COMMIT_SHA}
- quay.io/wollud1969/exim-docker/${CI_COMMIT_TAG}
- latest
- ${CI_COMMIT_TAG}
username:
from_secret: quay_username
password:

View File

@ -1,33 +1,28 @@
FROM debian:bookworm
FROM alpine:3.21.0
LABEL Maintainer="Wolfgang Hottgenroth <woho@hottis.de>"
LABEL ImageName=""
LABEL ImageName="quay.io/wollud1969/exim-docker"
# domain to be used in sender address of sent mails
ENV LOCALMAILNAME=""
# smarthost to send mail to
ENV SMARTHOST=""
# recipient addresses for root aliases, separate multiple addresses by space
ENV ROOT=""
ENV SMARTHOST_USER=""
ENV SMARTHOST_PASS=""
# ip addresses or networks to allow for relaying, separate multiple ones by semicolon
ENV RELAYNETS=""
ENV RELAYNETS="127.0.0.1/32"
RUN \
apt update && \
apt upgrade -y --autoremove && \
apt install -y exim4-daemon-light ca-certificates curl && \
rm -rf /var/lib/apt/lists/*
RUN apk add --no-cache exim m4 openssl
COPY update-exim4.conf.tmpl /etc/exim4/
COPY aliases.tmpl /etc/exim4/
COPY adjust-config.sh /etc/exim4/
COPY start.sh /etc/exim4/
COPY exim.conf.m4 /etc/exim
COPY start.sh /etc/exim
WORKDIR /etc/exim4
WORKDIR /etc/exim
EXPOSE 25
CMD [ "./start.sh" ]
#CMD [ "/usr/bin/m4 exim.conf.m4 > exim.conf && /usr/sbin/exim -bd -q15m -v" ]

View File

@ -1,15 +0,0 @@
#!/bin/bash
cat update-exim4.conf.tmpl \
| sed -e 's/%HOSTNAME%/'$HOSTNAME'/' \
-e 's#%RELAYNETS%#'$RELAYNETS'#' \
-e 's/%LOCALMAILNAME%/'$LOCALMAILNAME'/' \
-e 's/%SMARTHOST%/'$SMARTHOST'/' \
> update-exim4.conf.conf
cat aliases.tmpl \
| sed -e 's/%ROOT%/'"$ROOT"'/' \
> ../aliases && \
newaliases
/usr/sbin/update-exim4.conf -v

View File

@ -1,14 +0,0 @@
mailer-daemon: postmaster
postmaster: root
nobody: root
hostmaster: root
usenet: root
news: root
webmaster: root
www: root
ftp: root
abuse: root
noc: root
security: root
root: %ROOT%

16
examples/deploy.sh Executable file
View File

@ -0,0 +1,16 @@
#!/bin/bash
kubectl create secret generic smtp-secrets \
--dry-run=client \
-o yaml \
--save-config \
--from-literal=SMARTHOST="smtprelaypool.ispgateway.de" \
--from-literal=SMARTHOST_USER="pseudosmarthostuser@hottis.de" \
--from-literal=SMARTHOST_PASS="$SMARTHOST_PASSWORD" \
--from-literal=RELAYNETS=":10.0.0.0/8" | \
kubectl apply -n system -f -
kubectl apply -n system -f deploy.yml

42
examples/deploy.yml Normal file
View File

@ -0,0 +1,42 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: smtp
labels:
app: smtp
annotations:
secret.reloader.stakater.com/reload: smtp-secrets
spec:
replicas: 1
selector:
matchLabels:
app: smtp
template:
metadata:
labels:
app: smtp
spec:
containers:
- name: smtp
image: quay.io/wollud1969/exim-docker:0.2.2
envFrom:
- secretRef:
name: smtp-secrets
ports:
- containerPort: 25
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: smtp
spec:
type: ClusterIP
selector:
app: smtp
ports:
- name: smtp
protocol: TCP
port: 25
targetPort: 25

25
examples/start-mailer.sh Normal file
View File

@ -0,0 +1,25 @@
#!/bin/bash
IMAGE=quay.io/wollud1969/exim-docker:0.0.9
MAILER_NETWORK=mailer-network
docker network inspect $MAILER_NETWORK > /dev/null || docker network create $MAILER_NETWORK
if [ "$RELAYNETS" = "" ]; then
RELAYNETS=`docker network inspect $MAILER_NETWORK --format '{{ (index .IPAM.Config 0).Subnet }}'`
fi
docker run \
-d \
-e SMARTHOST=smarthost.example.com \
-e LOCALMAILNAME=example.com \
-e RELAYNETS=$RELAYNETS \
--network $MAILER_NETWORK \
--name mailer \
--restart always \
$IMAGE

67
exim.conf.m4 Normal file
View File

@ -0,0 +1,67 @@
dnl values
define(`HOSTNAME', esyscmd(`echo -n $HOSTNAME'))dnl
define(`LOCALMAILNAME', esyscmd(`echo -n $LOCALMAILNAME'))dnl
define(`SMARTHOST', esyscmd(`echo -n $SMARTHOST'))dnl
define(`SMARTHOST_USER', esyscmd(`echo -n $SMARTHOST_USER'))dnl
define(`SMARTHOST_PASS', esyscmd(`echo -n $SMARTHOST_PASS'))dnl
define(`RELAYNETS', esyscmd(`echo -n $RELAYNETS'))dnl
ifelse(SMARTHOST, `', `
errprint(`Error: SMARTHOST not set')
m4exit(1)
')
ifelse(HOSTNAME, `', `
errprint(`Error: HOSTNAME not set')
m4exit(1)
')
dnl template for exim.conf
primary_hostname = HOSTNAME
acl_smtp_rcpt = acl_check_rcpt
tls_certificate = /etc/exim/tls.crt
tls_privatekey = /etc/exim/tls.key
begin routers
smarthost_route:
driver = manualroute
domains = *
transport = smarthost_smtp
route_list = * SMARTHOST
begin transports
smarthost_smtp:
driver = smtp
port = 25
multi_domain
ifelse(SMARTHOST_USER, `', `', `dnl
hosts_require_auth = *
')
ifelse(SMARTHOST_USER, `', `', `
begin authenticators
plain:
driver = plaintext
public_name = PLAIN
client_send = ^SMARTHOST_USER^SMARTHOST_PASS
login:
driver = plaintext
public_name = LOGIN
client_send = : SMARTHOST_USER : SMARTHOST_PASS
')
begin acl
acl_check_rcpt:
accept
hosts = RELAYNETS
deny
message = "Relaying denied"
ifelse(LOCALMAILNAME, `', `', `
begin rewrite
*@* ${1}@LOCALMAILNAME Ffrs
')

56
readme.md Normal file
View File

@ -0,0 +1,56 @@
# EXIM4 from Debian in a container
This image can be used to deploy an MTA in a container and connect it to a smarthost to provide the
option to send mail from other containers without the need to configure the smarthost in each of them.
## Configuration
Four environment variables are used to configure the container:
* `SMARTHOST`: The is the name of the smarthost. exim within this container will send all mail to this smarthost for further delivery. Make sure the smarthost accepts mail from this container without authentication.
* `SMARTHOST_USER`: Login for smarthost. If no authentication is required, skip it.
* `SMARTHOST_PASS`: Password for smarthost.
* `LOCALMAILNAME`: The domain name which shall be used as the domain part of the sender address in every outgoing mail. If not required, skip it.
* `RELAYNETS`: Networks exim in this container accepts for relaying. Separate multiple networks by semicolon.
## Deployment
Typically, don't expose the smtp port of this container to the default network of your Docker installation, otherwise it conflicts with a local MTA on the machine and it would be visible outside of the machine. Create a dedicated docker network, use that one as the default network for this container and connect other containers to that network. Afterwards, you can use the name of this container as smarthost address in the other containers.
## Example start script
```
#!/bin/bash
IMAGE=quay.io/wollud1969/exim-docker:0.2.2
MAILER_NETWORK=mailer-network
docker network create $MAILER_NETWORK || echo "mailer-network already exists"
if [ "$RELAYNETS" = "" ]; then
RELAYNETS=`docker network inspect $MAILER_NETWORK --format '{{ (index .IPAM.Config 0).Subnet }}'`
fi
docker run \
-d \
-e SMARTHOST=smarthost.example.com \
-e LOCALMAILNAME=krohne.com \
-e RELAYNETS=$RELAYNETS \
--network $MAILER_NETWORK \
--name mailer \
--restart always \
$IMAGE
```
## Usage in other containers
Connect other containers to the mailer network:
```
docker network connect mailer-network name_of_other_container
```
Now you can use the name of the mailer container, here `mailer` as smarthost name in that other container.

View File

@ -1,5 +1,9 @@
#!/bin/bash
#!/bin/sh
./adjust-config.sh
openssl genpkey -algorithm RSA -out tls.key && \
openssl req -new -key tls.key -out tls.csr -subj "/C=DE/CN=$HOSTNAME" && \
openssl x509 -req -in tls.csr -signkey tls.key -out tls.crt -days 3650 && \
chown exim tls.key tls.crt && \
m4 exim.conf.m4 > exim.conf && \
exim -bd -q15m -v

View File

@ -1,14 +0,0 @@
dc_eximconfig_configtype='satellite'
dc_other_hostnames='%HOSTNAME%'
dc_local_interfaces='0.0.0.0'
dc_readhost='%LOCALMAILNAME%'
dc_relay_domains=''
dc_minimaldns='false'
dc_relay_nets='%RELAYNETS%'
dc_smarthost='%SMARTHOST%'
CFILEMODE='644'
dc_use_split_config='false'
dc_hide_mailname='true'
dc_mailname_in_oh='true'
dc_localdelivery='mail_spool'