health-send-mail.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #!/usr/bin/env python3
  2. """
  3. health-send-mail.py — 通过 QQ 邮箱 SMTP 465 SSL 发邮件
  4. Usage:
  5. QQ_USER=f1f3@qq.com QQ_AUTH_CODE=xxx SMTP_HOST=smtp.qq.com SMTP_PORT=465 \
  6. python3 health-send-mail.py <subject> <<< "body"
  7. Env required:
  8. QQ_USER 发件邮箱 (= 收件邮箱)
  9. QQ_AUTH_CODE QQ 邮箱授权码 (不是登录密码)
  10. SMTP_HOST 默认 smtp.qq.com
  11. SMTP_PORT 默认 465
  12. """
  13. import os
  14. import sys
  15. import smtplib
  16. import ssl
  17. import datetime
  18. from email.mime.text import MIMEText
  19. from email.mime.multipart import MIMEMultipart
  20. from email.utils import formataddr
  21. def main():
  22. if len(sys.argv) < 2:
  23. print("Usage: health-send-mail.py <subject>", file=sys.stderr)
  24. sys.exit(2)
  25. subject = sys.argv[1]
  26. body = sys.stdin.read() if not sys.stdin.isatty() else "(empty)"
  27. user = os.environ.get('QQ_USER', '').strip()
  28. pwd = os.environ.get('QQ_AUTH_CODE', '').strip()
  29. host = os.environ.get('SMTP_HOST', 'smtp.qq.com').strip()
  30. port = int(os.environ.get('SMTP_PORT', '465'))
  31. sender_name = os.environ.get('SENDER_NAME', 'book 监控')
  32. if not user or not pwd:
  33. print("MISSING: QQ_USER / QQ_AUTH_CODE env not set", file=sys.stderr)
  34. sys.exit(3)
  35. msg = MIMEMultipart()
  36. msg['From'] = formataddr((sender_name, user))
  37. msg['To'] = user
  38. msg['Subject'] = subject
  39. msg['Date'] = datetime.datetime.now().strftime('%a, %d %b %Y %H:%M:%S %z')
  40. msg.attach(MIMEText(body, 'plain', 'utf-8'))
  41. ctx = ssl.create_default_context()
  42. try:
  43. with smtplib.SMTP_SSL(host, port, timeout=15, context=ctx) as s:
  44. s.login(user, pwd)
  45. s.sendmail(user, [user], msg.as_string())
  46. print(f"OK: sent '{subject}' to {user}")
  47. sys.exit(0)
  48. except smtplib.SMTPAuthenticationError as e:
  49. print(f"AUTH FAIL: {e} (check QQ_AUTH_CODE, may need reissue at mail.qq.com)", file=sys.stderr)
  50. sys.exit(4)
  51. except Exception as e:
  52. print(f"SMTP FAIL [{type(e).__name__}]: {e}", file=sys.stderr)
  53. sys.exit(5)
  54. if __name__ == '__main__':
  55. main()