zioinfo-web/deploy/send_test_email.py
DESKTOP-TKLFCPRython 1e98f0d04a refactor: 101.79.17.164 → zioinfo.co.kr 전체 도메인 변환 + Manager UI 배포
- 37개 파일 IP → zioinfo.co.kr 치환 (소스/매뉴얼/설정/하네스)
- Manager DrConsole/NetworkConsole/CsapConsole 빌드 + /var/www/manager/ 배포
- 테스트: Manager HTTP 200, ITSM 신규 API 7개 전체 200

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 10:09:17 +09:00

147 lines
6.0 KiB
Python

#!/usr/bin/env python3
"""
zio 서버 SMTP(localhost:25/587)를 통해 이메일 발송 테스트
서버에서 직접 실행
"""
import smtplib, ssl, socket
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from datetime import datetime
TO = 'ythong86@gmail.com'
FROM = 'guardia@zioinfo.co.kr'
HOST = 'localhost'
def make_message(to, frm, subject, body_text, body_html=None):
msg = MIMEMultipart('alternative')
msg['Subject'] = subject
msg['From'] = f'GUARDiA ITSM <{frm}>'
msg['To'] = to
msg['X-Mailer']= 'GUARDiA ITSM v2.0'
msg.attach(MIMEText(body_text, 'plain', 'utf-8'))
if body_html:
msg.attach(MIMEText(body_html, 'html', 'utf-8'))
return msg
html_body = f"""
<!DOCTYPE html>
<html lang="ko">
<head><meta charset="UTF-8"></head>
<body style="font-family: -apple-system, sans-serif; background:#f0f2f5; padding:40px 20px;">
<div style="max-width:560px; margin:0 auto; background:#fff; border-radius:12px;
box-shadow:0 4px 20px rgba(0,0,0,.1); overflow:hidden;">
<!-- 헤더 -->
<div style="background:#1a3a6b; padding:28px 32px;">
<div style="display:flex; align-items:center; gap:12px;">
<span style="font-size:32px;">🛡️</span>
<div>
<h1 style="color:#fff; margin:0; font-size:20px;">GUARDiA ITSM</h1>
<p style="color:#aac4e8; margin:0; font-size:12px;">(주)지오정보기술 AI 인프라 자율 운영 플랫폼</p>
</div>
</div>
</div>
<!-- 본문 -->
<div style="padding:32px;">
<h2 style="color:#1a3a6b; margin:0 0 16px;">📧 이메일 발송 테스트</h2>
<div style="background:#f0fdf4; border:1px solid #bbf7d0; border-radius:8px;
padding:16px 20px; margin-bottom:20px;">
<p style="color:#166534; font-weight:700; margin:0 0 4px;">✅ 발송 성공</p>
<p style="color:#475569; font-size:13px; margin:0;">
zio 서버의 Postfix SMTP 서버를 통해 이메일이 정상 발송되었습니다.
</p>
</div>
<table style="width:100%; border-collapse:collapse; font-size:13px;">
<tr style="background:#f8fafc;">
<td style="padding:10px 14px; font-weight:600; color:#64748b; border:1px solid #e2e8f0; width:30%;">발신 서버</td>
<td style="padding:10px 14px; color:#1e293b; border:1px solid #e2e8f0;">mail.zioinfo.co.kr (101.79.17.164)</td>
</tr>
<tr>
<td style="padding:10px 14px; font-weight:600; color:#64748b; border:1px solid #e2e8f0;">발신자</td>
<td style="padding:10px 14px; color:#1e293b; border:1px solid #e2e8f0;">guardia@zioinfo.co.kr</td>
</tr>
<tr style="background:#f8fafc;">
<td style="padding:10px 14px; font-weight:600; color:#64748b; border:1px solid #e2e8f0;">발송 시각</td>
<td style="padding:10px 14px; color:#1e293b; border:1px solid #e2e8f0;">{datetime.now().strftime('%Y-%m-%d %H:%M:%S')} KST</td>
</tr>
<tr>
<td style="padding:10px 14px; font-weight:600; color:#64748b; border:1px solid #e2e8f0;">SMTP 포트</td>
<td style="padding:10px 14px; color:#1e293b; border:1px solid #e2e8f0;">25 (Postfix)</td>
</tr>
<tr style="background:#f8fafc;">
<td style="padding:10px 14px; font-weight:600; color:#64748b; border:1px solid #e2e8f0;">서버 OS</td>
<td style="padding:10px 14px; color:#1e293b; border:1px solid #e2e8f0;">Ubuntu 24.04 LTS (NCloud)</td>
</tr>
</table>
<div style="margin-top:24px; padding:16px 20px; background:#eff2ff; border-radius:8px;
border:1px solid #c7d2fe;">
<p style="color:#1a3a6b; font-weight:700; margin:0 0 8px;">🤖 GUARDiA ITSM 기능 안내</p>
<ul style="color:#475569; font-size:12px; margin:0; padding-left:18px; line-height:2;">
<li>SR(서비스 요청) 접수 알림</li>
<li>인시던트 발생 및 긴급 알림</li>
<li>SLA 위반 경고</li>
<li>배포 완료/실패 알림</li>
<li>라이선스 만료 알림</li>
</ul>
</div>
</div>
<!-- 푸터 -->
<div style="background:#f8fafc; padding:16px 32px; border-top:1px solid #e2e8f0;
text-align:center; font-size:11px; color:#94a3b8;">
이 메일은 GUARDiA ITSM 자동 발송 시스템에서 발송되었습니다.<br>
(주)지오정보기술 | guardia@zioinfo.co.kr | http://101.79.17.164:8001
</div>
</div>
</body>
</html>
"""
text_body = f"""GUARDiA ITSM 이메일 발송 테스트
✅ 발송 성공
zio 서버의 Postfix SMTP 서버를 통해 이메일이 정상 발송되었습니다.
발신 서버: mail.zioinfo.co.kr (101.79.17.164)
발신자: guardia@zioinfo.co.kr
발송 시각: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} KST
SMTP 포트: 25 (Postfix)
GUARDiA ITSM 기능:
- SR(서비스 요청) 접수 알림
- 인시던트 발생 및 긴급 알림
- SLA 위반 경고
- 배포 완료/실패 알림
(주)지오정보기술 | guardia@zioinfo.co.kr
"""
print(f'수신자: {TO}')
print(f'발신자: {FROM}')
print(f'SMTP: {HOST}:25')
print()
RESULTS = []
# 방법 1: localhost:25 직접 연결
print('--- 방법 1: Postfix localhost:25 ---')
try:
msg = make_message(TO, FROM, f'[GUARDiA] 이메일 발송 테스트 - {datetime.now().strftime("%H:%M")}',
text_body, html_body)
with smtplib.SMTP(HOST, 25, timeout=15) as smtp:
smtp.ehlo('mail.zioinfo.co.kr')
refused = smtp.sendmail(FROM, [TO], msg.as_string())
if refused:
print(f'FAIL 거부된 수신자: {refused}')
RESULTS.append(('localhost:25', False, str(refused)))
else:
print('OK 발송 완료 (큐에 추가됨)')
RESULTS.append(('localhost:25', True, '큐 등록 성공'))
except Exception as ex:
print(f'FAIL {ex}')
RESULTS.append(('localhost:25', False, str(ex)[:80]))
print()
print('--- 결과 ---')
for method, ok, detail in RESULTS:
icon = 'OK ' if ok else 'FAIL'
print(f'{icon} {method}: {detail}')