Commit b7db818e authored by Andrey Filippov's avatar Andrey Filippov

Switching email script for codex to use hosted server SMTP to resolve

deliverability issues
parent c8ce4160
......@@ -9,7 +9,7 @@
{
"name": "email_send.py",
"path": "scripts/email_send.py",
"purpose": "Send SMTP email via mail.elphel.com using env vars for credentials."
"purpose": "Send email via SSH+sendmail on community.elphel.com by default (set ELPHEL_SEND_MODE=smtp to force SMTP)."
},
{
"name": "email_fetch.py",
......
#!/usr/bin/env python3
import os
import smtplib
import subprocess
import email.utils
from email.message import EmailMessage
from pathlib import Path
......@@ -9,6 +10,13 @@ SMTP_HOST = os.environ.get("ELPHEL_SMTP_HOST", "mail.elphel.com")
SMTP_PORT = int(os.environ.get("ELPHEL_SMTP_PORT", "465"))
SMTP_USER = os.environ.get("ELPHEL_SMTP_USER", "codex@elphel.com")
SMTP_PASS = os.environ.get("ELPHEL_SMTP_PASS")
# ELPHEL_SEND_MODE=ssh_sendmail (default) or smtp.
# Defaulting to ssh_sendmail avoids sending from the local LAN IP, which can trigger
# recipient-side policy/reputation blocks.
SEND_MODE = os.environ.get("ELPHEL_SEND_MODE", "ssh_sendmail").lower()
SEND_SSH_HOST = os.environ.get("ELPHEL_SEND_SSH_HOST", "community.elphel.com")
SEND_SSH_USER = os.environ.get("ELPHEL_SEND_SSH_USER", "elphel5")
SEND_SSH_PORT = os.environ.get("ELPHEL_SEND_SSH_PORT", "")
OUT_DIR = os.environ.get("EMAIL_OUT_DIR", "attic/email_outbox")
......@@ -23,9 +31,27 @@ def _write_index(index_path, values):
f.write(line + "\n")
def send_email(subject, body, to_addrs, cc_addrs=None):
def _send_via_smtp(msg, recipients):
if not SMTP_PASS:
raise SystemExit("Set ELPHEL_SMTP_PASS")
with smtplib.SMTP_SSL(SMTP_HOST, SMTP_PORT) as s:
s.login(SMTP_USER, SMTP_PASS)
s.send_message(msg, to_addrs=recipients)
def _send_via_ssh_sendmail(msg):
ssh_target = f"{SEND_SSH_USER}@{SEND_SSH_HOST}"
ssh_cmd = ["ssh"]
if SEND_SSH_PORT:
ssh_cmd += ["-p", SEND_SSH_PORT]
ssh_cmd += [ssh_target, "/usr/sbin/sendmail", "-t", "-f", SMTP_USER]
try:
subprocess.run(ssh_cmd, input=msg.as_bytes(), check=True)
except FileNotFoundError:
raise SystemExit("ssh not found; install openssh-client or use SMTP mode")
def send_email(subject, body, to_addrs, cc_addrs=None):
msg = EmailMessage()
msg["Subject"] = subject
msg["From"] = SMTP_USER
......@@ -48,9 +74,10 @@ def send_email(subject, body, to_addrs, cc_addrs=None):
encoding="utf-8",
)
_write_index(out_dir / "index.csv", [email.utils.formatdate(localtime=True), SMTP_USER, ",".join(to_addrs), ",".join(cc_addrs or []), subject, str(out_path)])
with smtplib.SMTP_SSL(SMTP_HOST, SMTP_PORT) as s:
s.login(SMTP_USER, SMTP_PASS)
s.send_message(msg, to_addrs=recipients)
if SEND_MODE == "ssh_sendmail":
_send_via_ssh_sendmail(msg)
else:
_send_via_smtp(msg, recipients)
def main():
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment