Files
smtp-client/README.md
2025-03-05 12:49:33 +01:00

133 lines
7.0 KiB
Markdown

# docker-postfixrelay
[![CI/CD](https://github.com/loganmarchione/docker-postfixrelay/actions/workflows/main.yml/badge.svg)](https://github.com/loganmarchione/docker-postfixrelay/actions/workflows/main.yml)
[![Docker Image Size (latest semver)](https://img.shields.io/docker/image-size/loganmarchione/docker-postfixrelay)](https://hub.docker.com/r/loganmarchione/docker-postfixrelay)
Runs Postfix (as a relay) in Docker
- Source code: [GitHub](https://github.com/loganmarchione/docker-postfixrelay)
- Docker container: [Docker Hub](https://hub.docker.com/r/loganmarchione/docker-postfixrelay)
- Image base: [Alpine Linux](https://hub.docker.com/_/alpine/)
- Init system: [dumb-init](https://github.com/Yelp/dumb-init)
- Application: [Postfix](http://www.postfix.org/)
- Architecture: `linux/amd64,linux/arm64,linux/arm/v7`
## Explanation
- This runs Postfix (as a relay) in Docker.
- Most home ISPs block port 25, so outbound emails must be relayed through an external SMTP server (e.g., Gmail).
- This container acts as a single collections point for devices needing to send email.
- ⚠️ Postfix acts as an open relay. As such, this is not meant to be run on the internet, only on a trusted internal network! ⚠️
```
Internal (LAN) network Public internet
------------------
| |
| Device sending | | |
| email alert | ------------- | |
| | | | |
------------------ | | |
| | F |
------------------ v | i |
| | ------------------ | r | ----------------------------- -------------------
| Device sending | | | | e | | | | |
| email alert | ----> | This container | --| w |--> | SMTP server (e.g., Gmail) | ----> | Recipient email |
| | | | | a | | | | |
------------------ ------------------ | l | ----------------------------- -------------------
^ | l |
------------------ | | |
| | | | |
| Device sending | | | |
| email alert | ------------- | |
| |
------------------
```
## Requirements
- You must already have an account on an external SMTP server (e.g., Gmail, AWS SES, etc...).
- Your external SMTP server must be using encryption (i.e., plaintext is not allowed)
## Docker image information
### Docker image tags
- `latest`: Latest version
- `X.X.X`: [Semantic version](https://semver.org/) (use if you want to stick on a specific version)
### Environment variables
| Variable | Required? | Definition | Example | Comments |
|-------------|---------------------------|---------------------------------------------|----------------------------|--------------------------------------------------------------|
| TZ | Yes | Timezone | America/New_York | https://en.wikipedia.org/wiki/List_of_tz_database_time_zones |
| RELAY_HOST | Yes | Public SMTP server to use | smtp.gmail.com | |
| RELAY_PORT | Yes | Public SMTP port to use | 587 | |
| RELAY_USER | No | Address to login to $RELAY_HOST | SMTP username | |
| RELAY_PASS | No | Password to login to $RELAY_HOST | SMTP password | If using Gmail 2FA, you will need to setup an app password |
| TEST_EMAIL | No | Address to receive test email | receive_address@domain.com | If not set, test email will **not** be sent |
| MYORIGIN | No | Domain of the "from" address | domain.com | Needed for things like AWS SES where the domain must be set |
| FROMADDRESS | No | Changes the "from" address | my_email@domain.com | Needed for some SMTP services where the FROM address needs to be set, [fixes issue 19](https://github.com/loganmarchione/docker-postfixrelay/issues/19) |
| MYNETWORKS | No (default: 0.0.0.0/0) | Networks that Postfix will forward mail for | 1.2.3.4/24, 5.6.7.8/24 | Single or multiple trusted networks separated with a comma |
| MSG_SIZE | No (default: 10240000) | Postfix `message_size_limit` in bytes | 30720000 | |
| LOG_DISABLE | No (default: false) | Setting to `true` disables logging | true | |
### Ports
| Port on host | Port in container | Comments |
|---------------------------|-------------------|---------------------|
| Choose at your discretion | 25 | Postfix SMTP server |
### Volumes
| Volume on host | Volume in container | Comments |
|---------------------------|---------------------|------------------------------------|
| Choose at your discretion | /var/spool/postfix | Used to store Postfix's mail spool |
### Example usage
Below is an example docker-compose.yml file.
```
version: '3'
services:
postfixrelay:
container_name: docker-postfixrelay
restart: unless-stopped
environment:
- TZ=America/New_York
- RELAY_HOST=smtp.gmail.com
- RELAY_PORT=587
- RELAY_USER=your_email_here@gmail.com
- RELAY_PASS=your_password_here
- TEST_EMAIL=test_email@domain.com
- MYORIGIN=domain.com
- FROMADDRESS=my_email@domain.com
- MYNETWORKS=1.2.3.4/24
- MSG_SIZE=30720000
- LOG_DISABLE=true
networks:
- postfixrelay
ports:
- '25:25'
volumes:
- 'postfixrelay_data:/var/spool/postfix'
image: loganmarchione/docker-postfixrelay:latest
networks:
postfixrelay:
volumes:
postfixrelay_data:
driver: local
```
Below is an example of running locally (used to edit/test/debug).
```
# Build the Dockerfile
docker compose -f docker-compose-dev.yml up -d
# View logs
docker compose -f docker-compose-dev.yml logs -f
# Destroy when done
docker compose -f docker-compose-dev.yml down
```
## TODO
- [x] ~~Add a [healthcheck](https://docs.docker.com/engine/reference/builder/#healthcheck)~~
- [ ] Add TLS support for SMTPD and listen on 587