#!/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"""
🛡️

GUARDiA ITSM

(주)지오정보기술 AI 인프라 자율 운영 플랫폼

📧 이메일 발송 테스트

✅ 발송 성공

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)
서버 OS Ubuntu 24.04 LTS (NCloud)

🤖 GUARDiA ITSM 기능 안내

  • SR(서비스 요청) 접수 알림
  • 인시던트 발생 및 긴급 알림
  • SLA 위반 경고
  • 배포 완료/실패 알림
  • 라이선스 만료 알림
이 메일은 GUARDiA ITSM 자동 발송 시스템에서 발송되었습니다.
(주)지오정보기술 | guardia@zioinfo.co.kr | http://101.79.17.164:8001
""" 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}')