134 lines
No EOL
7 KiB
Cheetah
134 lines
No EOL
7 KiB
Cheetah
{{- if or (and (stat (joinPath .host.home ".config" "age" "chezmoi.txt")) (stat (joinPath .chezmoi.sourceDir ".chezmoitemplates" "secrets" "SENDGRID_API_KEY"))) (env "SENDGRID_API_KEY") -}}
|
|
#!/usr/bin/env bash
|
|
# @file SendGrid Postfix Configuration
|
|
# @brief Configures Postfix to use SendGrid as a relay host so you can use the `mail` program to send e-mail from the command-line
|
|
# @description
|
|
# This script follows the instructions from [SendGrid's documentation on integrating Postfix](https://docs.sendgrid.com/for-developers/sending-email/postfix).
|
|
# After this script runs, you should be able to send outgoing e-mails using SendGrid as an SMTP handler. In other words, you will
|
|
# be able to use the `mail` CLI command to send e-mails. The following is an example mailing the contents of `~/.bashrc` to `name@email.com`:
|
|
#
|
|
# ```shell
|
|
# cat ~/.bashrc | mail -s "My subject" name@email.com
|
|
# ```
|
|
|
|
{{ includeTemplate "universal/profile" }}
|
|
{{ includeTemplate "universal/logg" }}
|
|
|
|
if command -v postfix > /dev/null; then
|
|
### Ensure dependencies are installed
|
|
if command -v apt-get > /dev/null; then
|
|
logg info 'Installing libsasl2-modules'
|
|
sudo apt-get update
|
|
sudo apt-get install -y libsasl2-modules || EXIT_CODE=$?
|
|
elif command -v dnf > /dev/null; then
|
|
sudo dnf install -y cyrus-sasl-plain || EXIT_CODE=$?
|
|
elif command -v yum > /dev/null; then
|
|
sudo yum install -y cyrus-sasl-plain || EXIT_CODE=$?
|
|
fi
|
|
if [ -n "$EXIT_CODE" ]; then
|
|
logg warn 'There was an error ensuring the Postfix-SendGrid dependencies were installed'
|
|
fi
|
|
|
|
if [ -d /etc/postfix ]; then
|
|
### Add the SendGrid Postfix settings to the Postfix configuration
|
|
if [ -f "${XDG_CONFIG_HOME:-$HOME/.config}/postfix/main.cf" ]; then
|
|
CONFIG_FILE=/etc/postfix/main.cf
|
|
if cat "$CONFIG_FILE" | grep '### INSTALL DOCTOR MANAGED' > /dev/null; then
|
|
logg info 'Removing Install Doctor-managed block of code in /etc/postfix/main.cf block'
|
|
START_LINE="$(echo `grep -n -m 1 "### INSTALL DOCTOR MANAGED ### START" "$CONFIG_FILE" | cut -f1 -d ":"`)"
|
|
END_LINE="$(echo `grep -n -m 1 "### INSTALL DOCTOR MANAGED ### END" "$CONFIG_FILE" | cut -f1 -d ":"`)"
|
|
if [ -n "$START_LINE" ] && [ -n "$END_LINE" ]; then
|
|
if command -v gsed > /dev/null; then
|
|
sudo gsed -i "${START_LINE},${END_LINE}d" "$CONFIG_FILE"
|
|
else
|
|
sudo sed -i "${START_LINE},${END_LINE}d" "$CONFIG_FILE"
|
|
fi
|
|
else
|
|
logg info 'No start-line or end-line detected - configuration appears to already be clean'
|
|
fi
|
|
fi
|
|
|
|
### Add Postfix main configuration
|
|
logg "Adding the following configuration from ${XDG_CONFIG_HOME:-$HOME/.config}/postfix/main.cf to /etc/postfix/main.cf"
|
|
cat "${XDG_CONFIG_HOME:-$HOME/.config}/postfix/main.cf" | sudo tee -a "$CONFIG_FILE"
|
|
echo "" | sudo tee -a "$CONFIG_FILE"
|
|
fi
|
|
|
|
### Ensure proper permissions on `sasl_passwd` and update Postfix hashmaps
|
|
if [ -f "${XDG_CONFIG_HOME:-$HOME/.config}/postfix/sasl_passwd" ]; then
|
|
logg info "Copying file from ${XDG_CONFIG_HOME:-$HOME/.config}/postfix/sasl_passwd to /etc/postfix/sasl_passwd"
|
|
sudo cp -f "${XDG_CONFIG_HOME:-$HOME/.config}/postfix/sasl_passwd" /etc/postfix/sasl_passwd
|
|
logg info 'Assigning proper permissions to /etc/postfix/sasl_passwd'
|
|
sudo chmod 600 /etc/postfix/sasl_passwd
|
|
logg info 'Updating Postfix hashmaps for /etc/postfix/sasl_passwd'
|
|
sudo postmap /etc/postfix/sasl_passwd
|
|
else
|
|
logg warn '~/.config/postfix/sasl_passwd file is missing'
|
|
fi
|
|
|
|
### Forward root e-mails
|
|
if [ -d /root ]; then
|
|
logg info 'Forwarding root e-mails to {{ .user.email }}'
|
|
echo '{{ .user.email }}' | sudo tee /root/.forward > /dev/null || logg error 'Failed to set root user .forward file'
|
|
elif [ -d /var/root ]; then
|
|
logg info 'Forwarding root e-mails to {{ .user.email }}'
|
|
echo '{{ .user.email }}' | sudo tee /var/root/.forward > /dev/null || logg error 'Failed to set root user .forward file'
|
|
else
|
|
logg warn 'Unable to identify root user home directory'
|
|
fi
|
|
|
|
### Ensure /etc/postfix/header_checks exists
|
|
if [ ! -d /etc/postfix/header_checks ]; then
|
|
logg info 'Creating /etc/postfix/header_checks since it does not exist'
|
|
sudo touch /etc/postfix/header_checks
|
|
fi
|
|
|
|
### Re-write header From for SendGrid
|
|
if ! cat /etc/postfix/header_checks | grep 'no-reply@{{ .host.domain }}' > /dev/null; then
|
|
logg info 'Added From REPLACE to /etc/postfix/header_checks'
|
|
echo '/^From:.*@{{ .host.domain }}/ REPLACE From: no-reply@{{ .host.domain }}' | sudo tee -a /etc/postfix/header_checks > /dev/null
|
|
fi
|
|
|
|
### Update aliases
|
|
if [ -f /etc/aliases ]; then
|
|
logg info 'Forward root e-mails to {{ .user.email }}'
|
|
sudo sed s/#root.*/root:\ {{ .user.email }}/ -i /etc/aliases
|
|
if ! cat /etc/aliases | grep '{{ .user.username }}: root' > /dev/null; then
|
|
logg info 'Forward user e-mail to root@localhost'
|
|
echo '{{ .user.username }}: root' | sudo tee -a /etc/aliases > /dev/null
|
|
fi
|
|
logg info 'Running `newaliases` to regenerate the alias database'
|
|
sudo newaliases
|
|
else
|
|
logg warn '/etc/aliases does not appear to exist'
|
|
fi
|
|
|
|
if [ -d /Applications ] && [ -d /System ]; then
|
|
### macOS
|
|
# Source: https://budiirawan.com/install-mail-server-mac-osx/
|
|
if [ -f "${XDG_CONFIG_HOME:-$HOME/.config}/postfix/com.apple.postfix.master.plist" ] && ! sudo launchctl list | grep 'postfix.master' > /dev/null; then
|
|
logg info 'Copying com.apple.postfix.master.plist'
|
|
sudo cp -f "${XDG_CONFIG_HOME:-$HOME/.config}/postfix/com.apple.postfix.master.plist" /System/Library/LaunchDaemons/com.apple.postfix.master.plist
|
|
sudo launchctl load /System/Library/LaunchDaemons/com.apple.postfix.master.plist && logg success 'launchctl load of com.apple.postfix.master successful'
|
|
fi
|
|
if ! sudo postfix status > /dev/null; then
|
|
logg info 'Starting postfix'
|
|
sudo postfix start
|
|
else
|
|
logg info 'Reloading postfix'
|
|
sudo postfix reload
|
|
fi
|
|
else
|
|
### Enable / restart postfix on Linux
|
|
logg info 'Enabling / restarting postfix'
|
|
sudo systemctl enable postfix
|
|
sudo systemctl restart postfix
|
|
fi
|
|
else
|
|
logg warn '/etc/postfix is not a directory! Skipping SendGrid Postfix setup.'
|
|
fi
|
|
else
|
|
logg info 'Skipping Postfix configuration because Postfix is not installed'
|
|
fi
|
|
|
|
{{ end -}} |