[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를 할 수 있는 기능을 만들어보고 싶다. 필요없을 때 서버에 들어가서 끄기는 귀찮으니…