개발 세션 - 중추 파트, 추가기능 코딩

goldenGlow_21·2024년 12월 20일
0

작업 목록

  • 알림 시스템
    • 디스코드 : (브랜치명: discord_alarm)
    • 이메일 : (브랜치명: email_alarm)
  • main 담당 .py
    • DB 관리
    • 크롤러 실행 및 통합
  • 프론트 마무리

이메일 알림 코드

import os
import smtplib
from email.mime.text import MIMEText
from pymongo import MongoClient
from pymongo.errors import ServerSelectionTimeoutError
from pymongo.change_stream import ChangeStream

# MongoDB 연결 설정
MONGO_URI = os.environ.get("MONGO_URI", "mongodb://localhost:27017/")  # MongoDB URI (환경변수 기본값 사용)
DB_NAME = os.environ.get("DB_NAME", "darkweb_db")  # DB 이름
COLLECTION_NAME = os.environ.get("COLLECTION_NAME", "example_collection")  # Collection 이름

# 환경변수로 이메일 정보 가져오기
EMAIL_SENDER = os.environ.get("EMAIL_SENDER")  # 보내는 이메일
EMAIL_PASSWORD = os.environ.get("EMAIL_PASSWORD")  # 이메일 비밀번호 (앱 비밀번호 사용 권장)
EMAIL_RECIPIENT = os.environ.get("EMAIL_RECIPIENT")  # 받는 이메일

# MongoDB 연결
try:
    client = MongoClient(MONGO_URI, serverSelectionTimeoutMS=5000)
    db = client[DB_NAME]
    collection = db[COLLECTION_NAME]
    print(f"MongoDB 연결 성공: {MONGO_URI}")
except ServerSelectionTimeoutError as e:
    print(f"MongoDB 연결 실패: {e}")
    exit(1)

# 이메일 보내기 함수
def send_email(subject, body):
    try:
        msg = MIMEText(body, "plain")
        msg["Subject"] = subject
        msg["From"] = EMAIL_SENDER
        msg["To"] = EMAIL_RECIPIENT

        with smtplib.SMTP_SSL("smtp.gmail.com", 465) as server:
            server.login(EMAIL_SENDER, EMAIL_PASSWORD)
            server.sendmail(EMAIL_SENDER, EMAIL_RECIPIENT, msg.as_string())
        print("이메일 전송 성공!")
    except Exception as e:
        print(f"이메일 전송 실패: {e}")

# Change Streams로 업데이트 확인
def watch_collection():
    try:
        with collection.watch() as stream:  # Change Streams 활성화
            print("컬렉션 변경 사항 모니터링 시작...")
            for change in stream:
                print("변경 사항 발생:", change)
                operation_type = change["operationType"]

                # 업데이트가 발생한 경우 이메일 알림
                if operation_type in ["insert", "update", "replace"]:
                    document_key = change["documentKey"]["_id"]
                    updated_fields = change.get("updateDescription", {}).get("updatedFields", {})
                    subject = f"MongoDB 업데이트 알림: {operation_type}"
                    body = f"문서 ID: {document_key}\n변경된 필드: {updated_fields}"
                    send_email(subject, body)
    except Exception as e:
        print(f"Change Stream 모니터링 중 오류 발생: {e}")

if __name__ == "__main__":
    watch_collection()

MongoDB 사용

  • MongoDB 서비스 시작(파워쉘 / cmd 관리자 권한)
net start MongoDB
  • 서비스가 정상적으로 시작되었는지 확인
net start
  • MongoDB를 중지
net stop MongoDB
profile
안드로이드는 리눅스의 꿈을 꾸는가

0개의 댓글