
本文介绍如何使用python的email.message模块读取本地日志文件,并将其内容直接嵌入邮件正文发送,避免作为附件处理,适用于linux系统重启通知等运维场景。
本文介绍如何使用python的email.message模块读取本地日志文件,并将其内容直接嵌入邮件正文发送,避免作为附件处理,适用于linux系统重启通知等运维场景。
在使用 email.message.EmailMessage 发送邮件时,若需将日志文件内容作为纯文本正文(而非附件)嵌入邮件,关键在于先读取文件内容,再拼接至邮件正文字符串中。原始代码中 body 是硬编码的静态字符串,只需扩展为动态读取并注入日志内容即可。
以下是修改后的完整可运行示例(已整合日志读取、错误处理与编码健壮性):
import os
from email.message import EmailMessage
import ssl
import smtplib
logpath = '/home/john/logs/neplog'
email_sender = 'sender@example.com' # 请替换为真实邮箱
email_passw = 'secretpassword' # 建议使用应用专用密码或环境变量
email_receiv = 'receiver@example.com'
subject = 'NEPTUN restart'
# ✅ 安全读取日志文件:处理可能的异常(文件不存在、权限不足、编码错误)
try:
with open(logpath, 'r', encoding='utf-8') as f:
log_content = f.read().strip() # 去除首尾空白,避免空行干扰格式
except FileNotFoundError:
log_content = '[ERROR] Log file not found.'
except UnicodeDecodeError:
# 若UTF-8失败,尝试系统默认编码(如latin-1,可容忍乱码但不崩溃)
with open(logpath, 'r', encoding='latin-1') as f:
log_content = f.read().strip()
except PermissionError:
log_content = '[ERROR] Permission denied reading log file.'
# ✅ 构建带日志内容的多行正文(使用f-string保持可读性)
body = f"""Neptun has restarted less than 1 minute ago.
=== System Log (last update) ===
{log_content}
-- Automated notification from NEPTUN host
"""
# ✅ 创建邮件对象并设置内容
em = EmailMessage()
em['From'] = email_sender
em['To'] = email_receiv
em['Subject'] = subject
em.set_content(body) # 自动设为 text/plain;如需HTML,请用 em.add_alternative(html_body, subtype='html')
# ✅ 发送邮件(使用SMTP_SSL,端口465)
context = ssl.create_default_context()
try:
with smtplib.SMTP_SSL('smtp-mail.outlook.com', 465, context=context) as smtp: # 注意:hotmail.com 已迁至 smtp-mail.outlook.com
smtp.login(email_sender, email_passw)
smtp.send_message(em) # 推荐用 send_message() 替代 sendmail(),更安全地处理EmailMessage对象
print("✅ Email sent successfully.")
except smtplib.SMTPAuthenticationError:
print("❌ SMTP login failed: check email and password.")
except Exception as e:
print(f"❌ Failed to send email: {e}")注意事项与最佳实践:
- ? 密码安全:切勿在代码中硬编码密码。生产环境应使用
os.getenv('EMAIL_PASS')从环境变量读取,或借助keyring库管理凭据。 - ? SMTP服务器更新:Hotmail/Outlook 的官方 SMTP 地址现为
smtp-mail.outlook.com(端口 465 或 587),旧域名smtp.hotmail.com可能失效。 - ? 日志编码兼容性:Linux 日志常用 UTF-8,但某些系统日志含二进制或特殊字符,建议优先
utf-8,失败后降级为latin-1并记录警告。 - ? 内容长度控制:若日志过大(如 >10MB),应截取末尾若干行(例如
subprocess.run(['tail', '-n', '200', logpath], ...)),避免邮件被拒收或客户端渲染卡顿。 - ✉️ 多格式支持(进阶):如需同时提供纯文本和 HTML 版本,可用
em.add_alternative()添加 HTML 内容,并保留set_content()设置纯文本备用。
通过以上方式,你即可实现轻量、可靠、可维护的日志内联邮件通知机制,真正让运维信息“一目了然”。
立即学习“Python免费学习笔记(深入)”;


















