91 lines
2.9 KiB
Python
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()
|