Files
hermes-recovery/scripts/apex-mail-watchdog.py
T

91 lines
2.9 KiB
Python

#!/usr/bin/env python3
"""apex-mail-watchdog.py — Check Apex WPForms email delivery every 5 min.
Connects to the Apex SMTP, sends a test, and checks debug events for
recent failures. If mail is down, sends an alert via Hermes cron.
"""
import smtplib, ssl, json, sys, os
from datetime import datetime, timezone, timedelta
from pathlib import Path
import mysql.connector
LOG = "/var/log/apex-mail-watchdog.log"
SMTP_HOST = "c1113726.sgvps.net"
SMTP_PORT = 2525
SMTP_USER = "contact@apextrackexperience.com"
SMTP_PASS = "apex.track!!"
ALERT_TO = "g@germainebrown.com"
FROM = "contact@apextrackexperience.com"
def log(msg):
ts = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
line = f"[{ts}] {msg}"
print(line)
with open(LOG, "a") as f:
f.write(line + "\n")
def check_smtp():
"""Try sending a test email to the admin address."""
try:
ctx = ssl.create_default_context()
with smtplib.SMTP(SMTP_HOST, SMTP_PORT, timeout=15) as s:
s.starttls(context=ctx)
s.login(SMTP_USER, SMTP_PASS)
msg = (
f"From: {FROM}\n"
f"To: {ALERT_TO}\n"
f"Subject: Apex Mail Watchdog Test\n\n"
f"Test email from apex-mail-watchdog.py — {datetime.now().isoformat()}"
)
s.sendmail(FROM, [ALERT_TO], msg)
return True, None
except Exception as e:
return False, str(e)
def check_debug_events():
"""Check WP Mail SMTP debug table for recent failures (> 0 in last 10 min)."""
try:
conn = mysql.connector.connect(
host="localhost",
user="apextrackexperience_1781549652",
password="K3E1ZZWvHDu0q8ZmoBCAhzKUZawEapdGBlbaPME1sOTKgGk9FCuYS",
database="apextrackexperience_1781549652",
)
cursor = conn.cursor()
# Count errors (event_type=0) in last 10 minutes
cursor.execute(
"SELECT COUNT(*) FROM wp_wpmailsmtp_debug_events "
"WHERE event_type = 0 AND created_at >= NOW() - INTERVAL 10 MINUTE"
)
count = cursor.fetchone()[0]
conn.close()
return count, None
except Exception as e:
return None, str(e)
def main():
log("Apex mail watchdog check starting...")
smtp_ok, smtp_err = check_smtp()
errors, debug_err = check_debug_events()
if not smtp_ok:
log(f"SMTP FAILED: {smtp_err}")
print(f"RESULT:FAIL|{smtp_err}")
sys.exit(1)
if errors and errors > 0:
log(f"DEBUG EVENTS: {errors} failures in last 10 min")
print(f"RESULT:WARN|{errors} email failures detected")
sys.exit(2)
if debug_err:
log(f"DB ERROR: {debug_err}")
# Don't fail on DB errors — SMTP test passed
log("SMTP OK — all clear")
print("RESULT:OK|Mail delivery healthy")
if __name__ == "__main__":
main()