[MailReminder] 0 - 프로젝트의 시작 및 구현

MailReminder 프로젝트 개발기


목차


개발 시작 이유

  • MailReminder라는 이름부터 즉흥적으로 지었는데… 일을 시작하고 살다보니까 도장비 입금이나 병원 신청같은 부분을 매달 알려줬으면 좋겠는데 단순한 일이라서 캘린더에는 추가하기 싫고 메일로 알림을 받으면 좋을거 같아서 개발을 시작하게 되었다.


목표

  • 최종적으로는 어떤 모습이 될지는 모르겠으나… 내가 원하는 날짜에 알림을 신청하면 메일로 알려주는 서비스를 나를 위해 만들고 싶다.
  • 추후 모습이 바뀔수도 있고 현재 내 요구사항은 등록한 사항을 원하는 날짜에 알려주자!
  • 스스로 애자일과 린 소프트웨어 개발론을 통해 개발할 예정! 물론, 나중에 개발 방법이 어떻게 바뀔지는 모르겠지만.. 우선 만들고 싶은 한 가지의 목표를 정하고 구현하고 불편한거 개선해서 추가하고 하는 방식으로 가보자


환경 및 구조

방법 설명

  • 메일을 보내주는 부분은 python을 이용해서 작성한다.
  • 리눅스에 있는 crontab을 이용해서 원하는 날짜에 메일을 보내도록 한다.
  • 메일을 보내주는 부분은 직접 smtp 서버를 만들고 도메인에 붙일수도 있지만… 빠른 개발을 위해서 우선 Google에 계정을 만들고 해당 계정으로 메일을 보내도록 했다.(최소한으로 필요한 부분을 제외하고 다른 부분들은 다 쓸 수 있는걸 가져다가 쓰자!)
  • 잘 보내졌는지 확인하기 위해 로그를 남겼습니다.(stdout으로 나오게 하고 파일로 redirection함)


코드 구현

공통

  • 계정 정보를 저장하는 account.json의 경우에는 개인 정보이니 .gitignore에 추가했다.


메인 구현 부분

reminder.py

import smtplib
from email.mime.text import MIMEText
import json
import datetime

def sendMail(sender_email, receiver_email, app_password ,msg):
    smtp = smtplib.SMTP_SSL('smtp.gmail.com', 465)
    print(str(datetime.datetime.now()) + ": " + "Access Success")
    smtp.login(sender_email, app_password)
    print(str(datetime.datetime.now()) + ": " + "Login Success")
    msg = MIMEText(msg)
    msg['Subject'] = '리마인더'
    smtp.sendmail(sender_email, receiver_email, msg.as_string())
    print(str(datetime.datetime.now()) + ": " + "Sending Success")
    smtp.quit()

email=""
app_password=""
with open('/home/twpower/MailReminder/account.json') as account_json_file:
    account = json.load(account_json_file)
    email = account['email']
    app_password = account['app_password']
    print(str(datetime.datetime.now()) + ": " + "Parsing Success")

# 나한테 보내는 메일 정보는 없음... 개인정보라서
sendMail(email, '', app_password, "입금 or 예약")

crontab

# 쉘은 bash를 사용했고 환경 변수들을 다 가져왔습니다.(PATH를 포함!)
# 환경 변수를 가져와야 일반적인 쉘과 환경이 같아지며 python 경우에는 사용하는 인터프리터 path 정보가 거기에 담겨 있기 때문에 가져오는게 좋습니다.(처음에 안해줘서 자꾸 오류떴던...)
...
* 10 17 * * python /home/twpower/MailReminder/reminder.py >> /home/twpower/test.txt
...


다음 목표

  • 우선 사용이 잘 되면 api를 통해서 on/off를 할 수 있는 기능을 만들어보고 싶다. 필요없을 때 서버에 들어가서 끄기는 귀찮으니…


참고자료