220 lines
7.4 KiB
Bash
Executable File
220 lines
7.4 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
set -e
|
|
|
|
# Redirect all output to stderr for docker logs
|
|
exec 1>&2
|
|
|
|
echo "========================================"
|
|
echo "Postfix SMTP Relay Configuration"
|
|
echo "========================================"
|
|
|
|
[ "${DEBUG}" == "yes" ] && set -x
|
|
|
|
# Set timezone
|
|
if [ -n "${TIMEZONE}" ]; then
|
|
echo "Setting timezone to: ${TIMEZONE}"
|
|
cp /usr/share/zoneinfo/${TIMEZONE} /etc/localtime
|
|
echo "${TIMEZONE}" > /etc/timezone
|
|
fi
|
|
|
|
# Initialize postfix directories (Alpine-specific)
|
|
# Postfix on Alpine doesn't use post-install in the same way
|
|
# The directories are already created during package installation
|
|
|
|
function add_config_value() {
|
|
local key=${1}
|
|
local value=${2}
|
|
local config_file=${3:-/etc/postfix/main.cf}
|
|
[ "${key}" == "" ] && echo "ERROR: No key set !!" && exit 1
|
|
[ "${value}" == "" ] && echo "ERROR: No value set !!" && exit 1
|
|
|
|
echo " Setting: ${key} = ${value}"
|
|
postconf -e "${key} = ${value}"
|
|
}
|
|
|
|
# Validate required environment variables
|
|
[ -z "${SMTP_SERVER}" ] && echo "ERROR: SMTP_SERVER is not set" && exit 1
|
|
[ -z "${SMTP_PORT}" ] && echo "ERROR: SMTP_PORT is not set" && exit 1
|
|
[ -z "${SMTP_USERNAME}" ] && echo "ERROR: SMTP_USERNAME is not set" && exit 1
|
|
[ -z "${SMTP_PASSWORD}" ] && echo "ERROR: SMTP_PASSWORD is not set" && exit 1
|
|
|
|
# Detect SMTP provider and set defaults
|
|
SMTP_PROVIDER="generic"
|
|
if [[ "${SMTP_SERVER}" == *"mailtrap.io"* ]]; then
|
|
SMTP_PROVIDER="mailtrap"
|
|
echo "Detected provider: Mailtrap"
|
|
elif [[ "${SMTP_SERVER}" == *"sendgrid"* ]]; then
|
|
SMTP_PROVIDER="sendgrid"
|
|
echo "Detected provider: SendGrid"
|
|
elif [[ "${SMTP_SERVER}" == *"maileroo"* ]]; then
|
|
SMTP_PROVIDER="maileroo"
|
|
echo "Detected provider: Maileroo"
|
|
else
|
|
echo "Using generic SMTP provider: ${SMTP_SERVER}"
|
|
fi
|
|
|
|
# Get local network subnet - allow override via environment variable
|
|
if [ -z "${LOCAL_NETWORK}" ]; then
|
|
# Auto-detect and use /16 by default
|
|
LOCAL_NETWORK=$(ip route | grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/[0-9]+' | head -1 | awk '{print $1}')
|
|
if [ -z "$LOCAL_NETWORK" ]; then
|
|
LOCAL_IP=$(hostname -i | grep -E -o '([0-9]{1,3}\.){3}[0-9]{1,3}' | head -1)
|
|
if [ -n "$LOCAL_IP" ]; then
|
|
# Extract first two octets for /16 network
|
|
NETWORK_PREFIX=$(echo $LOCAL_IP | cut -d. -f1-2)
|
|
LOCAL_NETWORK="${NETWORK_PREFIX}.0.0/16"
|
|
else
|
|
LOCAL_NETWORK="172.16.0.0/16"
|
|
fi
|
|
fi
|
|
echo "Auto-detected local network: ${LOCAL_NETWORK}"
|
|
else
|
|
echo "Using provided LOCAL_NETWORK: ${LOCAL_NETWORK}"
|
|
fi
|
|
|
|
# Build mynetworks - always include localhost and detected local network
|
|
nets="127.0.0.0/8, [::1]/128, ${LOCAL_NETWORK}"
|
|
|
|
# Add custom networks if specified
|
|
if [ ! -z "${SMTP_NETWORKS}" ]; then
|
|
echo "Adding custom networks..."
|
|
for i in $(sed 's/,/ /g' <<<$SMTP_NETWORKS); do
|
|
if grep -Eq "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/[0-9]{1,2}" <<<$i ; then
|
|
nets="${nets}, $i"
|
|
echo " Added network: $i"
|
|
else
|
|
echo " WARNING: $i is not in proper IPv4 subnet format. Ignoring."
|
|
fi
|
|
done
|
|
fi
|
|
|
|
echo ""
|
|
echo "Allowed networks: ${nets}"
|
|
echo ""
|
|
|
|
# Set hostname and domain defaults
|
|
SERVER_HOSTNAME_DEFAULT=$(hostname -f)
|
|
DOMAIN_DEFAULT=$(hostname -d)
|
|
|
|
# Use provided values or defaults
|
|
SERVER_HOSTNAME=${SERVER_HOSTNAME:-${SERVER_HOSTNAME_DEFAULT}}
|
|
DOMAIN=${DOMAIN:-${DOMAIN_DEFAULT}}
|
|
|
|
echo "Configuring Postfix..."
|
|
echo "----------------------------------------"
|
|
|
|
# Basic configuration
|
|
add_config_value "myhostname" "${SERVER_HOSTNAME}"
|
|
add_config_value "mydomain" "${DOMAIN}"
|
|
add_config_value "mydestination" '$myhostname'
|
|
add_config_value "myorigin" '$mydomain'
|
|
add_config_value "mynetworks" "${nets}"
|
|
add_config_value "inet_interfaces" "all"
|
|
add_config_value "inet_protocols" "ipv4"
|
|
|
|
# Relay configuration
|
|
add_config_value "relayhost" "[${SMTP_SERVER}]:${SMTP_PORT}"
|
|
add_config_value "relay_domains" "*"
|
|
|
|
# SASL Authentication
|
|
add_config_value "smtp_sasl_auth_enable" "yes"
|
|
add_config_value "smtp_sasl_password_maps" "lmdb:/etc/postfix/sasl_passwd"
|
|
add_config_value "smtp_sasl_security_options" "noanonymous"
|
|
add_config_value "smtp_sasl_tls_security_options" "noanonymous"
|
|
add_config_value "smtp_sasl_mechanism_filter" "plain, login"
|
|
|
|
# TLS configuration
|
|
if [ "${SMTP_PROVIDER}" == "sendgrid" ] || [ "${SMTP_PROVIDER}" == "mailtrap" ] || [ "${SMTP_PROVIDER}" == "maileroo" ]; then
|
|
add_config_value "smtp_use_tls" "yes"
|
|
add_config_value "smtp_tls_security_level" "encrypt"
|
|
add_config_value "smtp_tls_CAfile" "/etc/ssl/certs/ca-certificates.crt"
|
|
add_config_value "smtp_tls_session_cache_database" "btree:\${data_directory}/smtp_scache"
|
|
add_config_value "smtp_tls_loglevel" "1"
|
|
else
|
|
add_config_value "smtp_tls_security_level" "may"
|
|
fi
|
|
|
|
# Size limits
|
|
add_config_value "header_size_limit" "4096000"
|
|
add_config_value "mailbox_size_limit" "0"
|
|
add_config_value "message_size_limit" "52428800"
|
|
add_config_value "recipient_delimiter" "+"
|
|
|
|
# Relay restrictions
|
|
add_config_value "smtpd_relay_restrictions" "permit_mynetworks, reject_unauth_destination"
|
|
add_config_value "smtpd_recipient_restrictions" "permit_mynetworks, reject_unauth_destination"
|
|
add_config_value "smtpd_sasl_local_domain" "${DOMAIN}"
|
|
|
|
# Logging configuration - send logs to stdout/stderr
|
|
add_config_value "maillog_file" "/dev/stdout"
|
|
add_config_value "maillog_file_prefixes" "/var, /dev"
|
|
|
|
# Queue settings
|
|
add_config_value "maximal_queue_lifetime" "1d"
|
|
add_config_value "bounce_queue_lifetime" "1d"
|
|
add_config_value "queue_run_delay" "300s"
|
|
add_config_value "minimal_backoff_time" "300s"
|
|
add_config_value "maximal_backoff_time" "4000s"
|
|
|
|
# Debug settings (enable if DEBUG=yes)
|
|
if [ "${DEBUG}" == "yes" ]; then
|
|
add_config_value "debug_peer_level" "2"
|
|
fi
|
|
|
|
echo "----------------------------------------"
|
|
echo ""
|
|
|
|
# Create SASL password file
|
|
echo "Configuring SASL authentication..."
|
|
echo "[${SMTP_SERVER}]:${SMTP_PORT} ${SMTP_USERNAME}:${SMTP_PASSWORD}" > /etc/postfix/sasl_passwd
|
|
chmod 600 /etc/postfix/sasl_passwd
|
|
postmap /etc/postfix/sasl_passwd
|
|
# Set permissions on the generated database file (may have different extensions)
|
|
chmod 600 /etc/postfix/sasl_passwd.* 2>/dev/null || true
|
|
echo " SASL credentials configured for ${SMTP_SERVER}:${SMTP_PORT}"
|
|
echo ""
|
|
|
|
# Set header tag if specified
|
|
if [ ! -z "${SMTP_HEADER_TAG}" ]; then
|
|
echo "Setting SMTP header tag: ${SMTP_HEADER_TAG}"
|
|
postconf -e "header_checks = regexp:/etc/postfix/header_tag"
|
|
echo -e "/^MIME-Version:/i PREPEND RelayTag: $SMTP_HEADER_TAG\n/^Content-Transfer-Encoding:/i PREPEND RelayTag: $SMTP_HEADER_TAG" > /etc/postfix/header_tag
|
|
echo ""
|
|
fi
|
|
|
|
# Clean up old PID file if mounting /var/spool/postfix
|
|
echo "Cleaning up old PID files..."
|
|
rm -f /var/spool/postfix/pid/master.pid
|
|
|
|
# Validate postfix configuration
|
|
echo "Validating Postfix configuration..."
|
|
postconf -c /etc/postfix/
|
|
|
|
if [[ $? != 0 ]]; then
|
|
echo ""
|
|
echo "========================================"
|
|
echo "ERROR: Postfix configuration error!"
|
|
echo "========================================"
|
|
exit 1
|
|
fi
|
|
|
|
echo ""
|
|
echo "========================================"
|
|
echo "Postfix configuration completed successfully"
|
|
echo "========================================"
|
|
echo "Provider: ${SMTP_PROVIDER}"
|
|
echo "Relay host: ${SMTP_SERVER}:${SMTP_PORT}"
|
|
echo "Hostname: ${SERVER_HOSTNAME}"
|
|
echo "Domain: ${DOMAIN}"
|
|
echo "Networks: ${nets}"
|
|
echo "========================================"
|
|
echo ""
|
|
|
|
# Start postfix in foreground mode
|
|
echo "Starting Postfix in foreground mode..."
|
|
echo ""
|
|
|
|
# Run postfix in foreground - this will handle all logging to stdout/stderr
|
|
exec postfix start-fg
|