봄수의 연구실

학교 공지 사항 자동화를 해보자 - 4 본문

프로젝트/사이드 프로젝트

학교 공지 사항 자동화를 해보자 - 4

berom 2023. 3. 22. 21:26

학교 공지 사항 자동화를 해보자 - 4

Intro. 이제 메일로 전송해보자!

이메일에 담을 내용은 이제 모두 준비가 되었다!
smtp와 email 라이브러리를 사용하면 파이썬으로 구글 이메일을 전송 할 수 있다.
주의 해야 할 점은 구글 기준으로 앱 비밀번호를 생성해서 넣어야 한다. 일반 비밀번호를 입력하면 에러가 발생한다

또 신경 썼던게 있다면, 환경 변수로 내 개인 정보를 감춘 것이다.
나중에 github action을 쓸 때도 마찬가지고, 개인 정보를 추상화하는 것은 기본이기에 os.environ을 사용해서 개인 정보를 숨겼다

아래 코드를 보면 알 수 있지만, 보내는 사람,받는 사람, 제목 등을 입력 할 수 있다.
앞서 말한 앱 비밀번호만 유의하자

예외 처리는 메일 발송 과정에서 전송 실패 등의 이슈가 발생 할 수가 있다.
아직 미흡한 부분이 몇가지 있는데 고쳐지지 않아 준비를 하였다.

코드


SOJOONG = "소프트웨어 중심 사업단"
JNUSW = "소프트웨어 공학과"

def sendEmail(message,subTitle ,category):
    try:
        EMAIL_ADDRESS, EMAIL_PASSWORD =os.environ.get('EMAIL_ADDRESS'),os.environ.get('EMAIL_PASSWORD')
        print(f"{datetime.now()} Email sending... " )
        msg = MIMEMultipart()
        msg["Subject"] = f"[{category}] " + subTitle 
        msg["To"] = EMAIL_ADDRESS
        msg["From"] = EMAIL_ADDRESS
        msg.attach(MIMEText(message))

        # 메일송신처리
        server = smtplib.SMTP("smtp.gmail.com", 587)
        server.starttls()
        server.login(EMAIL_ADDRESS, EMAIL_PASSWORD)
        server.send_message(msg)
        server.quit()
        
        print("Success: Email sent!")
    except Exception as e:
        print("Email failed to send.")
        print(f"An error occured: {e}")

def start():
    category = [SOJOONG,JNUSW]
    posts = [getTodayJnuSW(), getTodaySojoong()]
    for c,post in zip(category,posts):
        if post ==None:
            continue
        for p in post:
            subTitle,message =p[0],p[1]
            try:
                sendEmail(message,subTitle,c)
            except Exception as e:
                print(f"An error occured while sending email: {e}")
                sendEmail(f"An error occured while sending email: {e}","Error Occured in sending Message",c)
start()
  • 포스트가 없다면 그대로 넘어가고, 있다면 메일을 전송하는 프로세스이다.
  • 위의 코드는 main.py의 일부로 깃허브 액션에서는 해당 스크립트만 실행 시킬 것이다

다음 시간에는 깃허브 액션을 사용해서 crontab을 구동하는 것을 할 것이다.

레퍼런스

728x90