| 1 | set -uo pipefail |
| 2 | OID="${1:?outbox id}"; OUT="${2:?outbox path}" |
| 3 | [ "${PM_APPROVED:-0}" = "1" ] || { echo "refuse: not an approved flush"; exit 2; } |
| 4 | |
| 5 | PAYLOAD=$(jq -r --arg id "$OID" '.history[] | select(.id==$id) | .preview' "$OUT") |
| 6 | field(){ printf '%s\n' "$PAYLOAD" | sed -n "s/^$1:[[:space:]]*//p" | head -1; } |
| 7 | |
| 8 | FROM=$(field FROM); PWVAR=$(field PWVAR); TO=$(field TO); SUBJECT=$(field SUBJECT) |
| 9 | BODY=$(printf '%s\n' "$PAYLOAD" | sed -n '/^BODY:/,$p' | tail -n +2) |
| 10 | |
| 11 | [ -z "$FROM" ] || [ -z "$PWVAR" ] || [ -z "$TO" ] && { |
| 12 | echo "execute-email: missing FROM/PWVAR/TO in draft $OID. Left for manual."; exit 3; } |
| 13 | |
| 14 | source <(tr -d '\r' < /shared/projects/.env.secrets) 2>/dev/null |
| 15 | APP_PW="${!PWVAR:-}" |
| 16 | [ -z "$APP_PW" ] && { echo "execute-email: $PWVAR not set in .env.secrets (generate Gmail app password). Left for manual."; exit 3; } |
| 17 | |
| 18 | echo "[pm] sending as $FROM -> $TO (subj: $SUBJECT)" |
| 19 | printf 'From: %s\r\nTo: %s\r\nSubject: %s\r\nMIME-Version: 1.0\r\nContent-Type: text/plain; charset=UTF-8\r\n\r\n%s\r\n' \ |
| 20 | "$FROM" "$TO" "$SUBJECT" "$BODY" \ |
| 21 | | curl -s --ssl-reqd --url "smtps://smtp.gmail.com:465" \ |
| 22 | --user "$FROM:$APP_PW" --mail-from "$FROM" --mail-rcpt "$TO" --upload-file - \ |
| 23 | && { echo "[pm] sent ok"; exit 0; } \ |
| 24 | || { echo "[pm] send FAILED (check app password / Gmail security)"; exit 1; } |