A small guide to send mails using doctrine for queue in Mautic 5

Hi, thanks … sorry, only saw it today. Will have a look into it and probably create a new version soon. I also plan to improve it further.

1 Like

This version I shared in this thread days ago is far better, it let you control hours of send

#!/bin/bash
set -euo pipefail

########################################

USER CONFIG – EDIT THIS SECTION

########################################

Paths

PHP_BIN=“/usr/bin/php”
MAUTIC_BIN=“/mautic_installation_dir/marketautomation/bin/console”
LOCKFILE=“/mautic_installation_dir/var/lock/consume_mautic.lock”

Lock timeout (seconds)

LOCKFILE_TIMEOUT=50

Working days (ISO: 1=Mon … 7=Sun)

Default: Monday–Friday

WORKING_DAYS=(“1” “2” “3” “4” “5”)

Time window (24h format, server time)

START_HOUR inclusive, END_HOUR exclusive.

Example: 8–18 = from 08:00 up to 17:59

START_HOUR=8
END_HOUR=18

Burst & run limits

INTERVAL=2       # seconds between bursts
PER_BURST=6      # messages per burst
HARD_LIMIT=50    # max seconds this worker is allowed to run per execution

Messenger limits

TIME_LIMIT=1     # seconds for messenger:consume
MEMORY_LIMIT=“1096M”

########################################

DO NOT EDIT BELOW THIS LINE

########################################

Day & time restriction

DOW=$(date +%u)   # 1=Mon … 7=Sun
HOUR=$(date +%H)  # 00..23

Check working day

IS_WORKING_DAY=false
for d in “${WORKING_DAYS[@]}”; do
if [ “$d” = “$DOW” ]; then
IS_WORKING_DAY=true
break
fi
done

if [ “$IS_WORKING_DAY” = false ]; then
echo “Not a working day. Allowed days: ${WORKING_DAYS[*]}. Exiting…”
exit 0
fi

Check time window

if [ “$HOUR” -lt “$START_HOUR” ] || [ “$HOUR” -ge “$END_HOUR” ]; then
echo “Outside allowed time window (${START_HOUR}:00–${END_HOUR}:00). Exiting…”
exit 0
fi

Lock handling

if [ -e “$LOCKFILE” ]; then
LOCKFILE_AGE=$(( $(date +%s) - $(stat -c %Y “$LOCKFILE”) ))
if [ “$LOCKFILE_AGE” -ge “$LOCKFILE_TIMEOUT” ]; then
echo “Lock older than ${LOCKFILE_TIMEOUT}s. Removing stale lock…”
rm -f “$LOCKFILE”
else
echo “Process already running (lock younger than ${LOCKFILE_TIMEOUT}s). Exiting…”
exit 1
fi
fi

touch “$LOCKFILE”
trap ‘rm -f “$LOCKFILE”’ EXIT INT TERM

Burst sending loop

SENT=0
START_TS=$(date +%s)

while (( $(date +%s) - START_TS < HARD_LIMIT )); do
“$PHP_BIN” “$MAUTIC_BIN” messenger:consume email 
–limit=“$PER_BURST” 
–time-limit=“$TIME_LIMIT” 
–memory-limit=“$MEMORY_LIMIT”

SENT=$((SENT + PER_BURST))

NOW=$(date +%s)

If sleeping would push us past HARD_LIMIT, break without sleeping

if (( NOW - START_TS + INTERVAL >= HARD_LIMIT )); then
break
fi

sleep “$INTERVAL”
done

echo “Total planned in ~${HARD_LIMIT}s (bursts of $PER_BURST every ${INTERVAL}s): $SENT”
exit 0