email 전송 기능 추가
This commit is contained in:
13
.env.example
13
.env.example
@@ -1,7 +1,12 @@
|
||||
# Grafana 설정
|
||||
GRAFANA_URL=http://localhost:3000
|
||||
# .env.example
|
||||
GRAFANA_URL=
|
||||
GRAFANA_API_KEY=
|
||||
MATTERMOST_WEBHOOK=
|
||||
GRAFANA_DASHBOARD_UID=
|
||||
|
||||
# Mattermost 설정 (리포트 전송용)
|
||||
MATTERMOST_WEBHOOK=
|
||||
# Email settings
|
||||
SMTP_HOST=
|
||||
SMTP_PORT=587
|
||||
SMTP_USER=
|
||||
SMTP_PASSWORD=
|
||||
EMAIL_RECIPIENTS=b24053@hanmaceng.co.kr
|
||||
@@ -35,7 +35,7 @@ jobs:
|
||||
GRAFANA_DASHBOARD_UID: ${{ vars.GRAFANA_DASHBOARD_UID }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
if [ "$(date -u +%u)" -eq 1 ]; then
|
||||
if [ "$(TZ=Asia/Seoul date +%u)" -eq 1 ]; then
|
||||
bash ./run_table.sh 7d
|
||||
else
|
||||
bash ./run_table.sh 24h
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
requests
|
||||
python-dotenv
|
||||
markdown
|
||||
@@ -11,7 +11,7 @@ from services.dashboard import (
|
||||
flatten_panels,
|
||||
panel_datasource_resolver,
|
||||
)
|
||||
from services.reporter import post_mattermost
|
||||
from services.reporter import post_mattermost, send_email
|
||||
from services.summarizer import compute_total_for_target
|
||||
from setting.config import AppConfig
|
||||
from utils.timeutils import now_kst, step_for_range, to_epoch
|
||||
@@ -162,6 +162,21 @@ def main():
|
||||
)
|
||||
|
||||
post_mattermost(cfg.mattermost_webhook, lines)
|
||||
|
||||
# ✅ Email 전송
|
||||
if cfg.email_recipients:
|
||||
subject = f"Grafana 요약 리포트 ({range_label})"
|
||||
body_md = "\n".join(lines)
|
||||
send_email(
|
||||
host=cfg.smtp_host,
|
||||
port=cfg.smtp_port,
|
||||
user=cfg.smtp_user,
|
||||
password=cfg.smtp_password,
|
||||
recipients=cfg.email_recipients,
|
||||
subject=subject,
|
||||
body_md=body_md,
|
||||
)
|
||||
|
||||
logger.info(f"[OK] Sent grouped tables for {len(grouped)} panels.")
|
||||
|
||||
|
||||
|
||||
@@ -1,11 +1,52 @@
|
||||
import logging
|
||||
import smtplib
|
||||
from email.mime.multipart import MIMEMultipart
|
||||
from email.mime.text import MIMEText
|
||||
from typing import List
|
||||
|
||||
import markdown
|
||||
import requests
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def send_email(
|
||||
host: str,
|
||||
port: int,
|
||||
user: str | None,
|
||||
password: str | None,
|
||||
recipients: list[str],
|
||||
subject: str,
|
||||
body_md: str,
|
||||
) -> None:
|
||||
"""
|
||||
SMTP를 통해 이메일 전송.
|
||||
"""
|
||||
if not all([host, recipients]):
|
||||
logger.warning("[EMAIL SKIP] SMTP_HOST or EMAIL_RECIPIENTS is not configured.")
|
||||
return
|
||||
|
||||
msg = MIMEMultipart("alternative")
|
||||
msg["Subject"] = subject
|
||||
msg["From"] = user or "noreply@localhost"
|
||||
msg["To"] = ", ".join(recipients)
|
||||
|
||||
# HTML 본문 생성
|
||||
html_body = markdown.markdown(body_md, extensions=["tables"])
|
||||
msg.attach(MIMEText(html_body, "html"))
|
||||
|
||||
try:
|
||||
with smtplib.SMTP(host, port) as server:
|
||||
if user and password:
|
||||
server.starttls()
|
||||
server.login(user, password)
|
||||
server.sendmail(msg["From"], recipients, msg.as_string())
|
||||
logger.info(f"[EMAIL OK] Sent to {', '.join(recipients)}")
|
||||
except Exception as e:
|
||||
logger.exception(f"[EMAIL ERROR] {e}")
|
||||
raise
|
||||
|
||||
|
||||
def post_mattermost(webhook: str, lines: List[str]) -> None:
|
||||
"""
|
||||
Mattermost Webhook으로 메시지 전송.
|
||||
|
||||
@@ -18,12 +18,26 @@ class AppConfig:
|
||||
grafana_dashboard_uid: str
|
||||
mattermost_webhook: str
|
||||
|
||||
# Email settings
|
||||
smtp_host: str | None
|
||||
smtp_port: int
|
||||
smtp_user: str | None
|
||||
smtp_password: str | None
|
||||
email_recipients: list[str]
|
||||
|
||||
@staticmethod
|
||||
def load() -> "AppConfig":
|
||||
url = env("GRAFANA_URL").rstrip("/")
|
||||
recipients = os.getenv("EMAIL_RECIPIENTS")
|
||||
return AppConfig(
|
||||
grafana_url=url,
|
||||
grafana_api_key=env("GRAFANA_API_KEY"),
|
||||
grafana_dashboard_uid=env("GRAFANA_DASHBOARD_UID"),
|
||||
mattermost_webhook=env("MATTERMOST_WEBHOOK"),
|
||||
# Email settings
|
||||
smtp_host=os.getenv("SMTP_HOST"),
|
||||
smtp_port=int(os.getenv("SMTP_PORT") or 587),
|
||||
smtp_user=os.getenv("SMTP_USER"),
|
||||
smtp_password=os.getenv("SMTP_PASSWORD"),
|
||||
email_recipients=[r.strip() for r in (recipients or "").split(",") if r],
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user