如何为Python Wazuh告警邮件脚本注入HTML生成HTML格式邮件?
Wazuh告警邮件转HTML格式解决方案
核心问题分析
直接在字符串嵌入HTML无效,本质是未正确设置邮件的MIME内容类型,Outlook默认将未指定类型的邮件解析为纯文本。需明确构建支持HTML格式的邮件结构,同时保留纯文本版本作为兼容 fallback。
具体实现步骤
1. 用Python标准库email重构generate_msg函数
放弃直接拼接字符串的方式,使用email.mime模块构建多类型邮件容器:
from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText def generate_msg(subject, html_content, plain_text_content, sender, receiver): # 创建多部分邮件容器,指定支持纯文本和HTML双格式 msg = MIMEMultipart("alternative") msg["Subject"] = subject msg["From"] = sender msg["To"] = receiver # 添加纯文本版本(兼容不支持HTML的邮件客户端) plain_part = MIMEText(plain_text_content, "plain", "utf-8") # 添加HTML版本(Outlook会优先渲染此部分) html_part = MIMEText(html_content, "html", "utf-8") msg.attach(plain_part) msg.attach(html_part) return msg.as_string()
2. 函数调用示例
# 构建兼容Outlook的HTML告警内容(尽量用内联样式、简洁结构) html_content = """ <html> <body style="font-family: Arial, sans-serif;"> <h2 style="color: #dc3545;">⚠️ Wazuh安全告警触发</h2> <table style="border-collapse: collapse; width: 80%;"> <tr> <td style="border: 1px solid #ddd; padding: 8px;"><strong>告警ID</strong></td> <td style="border: 1px solid #ddd; padding: 8px;">ALERT-2024-001</td> </tr> <tr> <td style="border: 1px solid #ddd; padding: 8px;"><strong>触发规则</strong></td> <td style="border: 1px solid #ddd; padding: 8px;">异常SSH暴力破解</td> </tr> <tr> <td style="border: 1px solid #ddd; padding: 8px;"><strong>受影响主机</strong></td> <td style="border: 1px solid #ddd; padding: 8px;">192.168.3.12</td> </tr> </table> <p style="margin-top: 15px;">详细日志:</p> <pre style="background-color: #f8f9fa; padding: 10px; border-radius: 4px;">{}</pre> </body> </html> """.format("Jan 15 10:23:45 sshd[1234]: Failed password for root from 203.0.113.45 port 22") # 对应纯文本版本 plain_content = f""" ⚠️ Wazuh安全告警触发 告警ID: ALERT-2024-001 触发规则: 异常SSH暴力破解 受影响主机: 192.168.3.12 详细日志: Jan 15 10:23:45 sshd[1234]: Failed password for root from 203.0.113.45 port 22 """ # 生成邮件内容 email_msg = generate_msg( subject="Wazuh安全告警通知", html_content=html_content, plain_text_content=plain_content, sender="wazuh-alert@your-domain.com", receiver="admin@your-domain.com" )
3. Outlook兼容性优化要点
- 所有样式用内联写法(如
<p style="color: red;">),不要用外部CSS或<style>标签 - 复杂布局用表格替代
<div>嵌套,兼容旧版Outlook - 图片使用绝对URL,避免嵌入附件(Outlook对嵌入式图片支持有限)
配套发送代码(基于smtplib)
如果之前用smtplib发送邮件,直接传入生成的邮件字符串即可:
import smtplib def send_alert_email(msg): with smtplib.SMTP("smtp.your-domain.com", 587) as server: server.starttls() server.login("wazuh-alert@your-domain.com", "your-smtp-password") server.sendmail("wazuh-alert@your-domain.com", "admin@your-domain.com", msg) send_alert_email(email_msg)
内容的提问来源于stack exchange,提问作者BetonFormulanet
相关产品推荐
相关产品推荐

