솔직히 smtplib과 datetime만 사용하지는 않았다.
pandas, string, random도 씀.
아무튼,
내가 해야하는 일을 생각해서 정리해 적어보자면,
- 내가 아는 사람들의 생일들과 메일을 csv를 통해 정리해놓는다.
- csv를 통해 정리해놓은 생일과 오늘의 날짜를 비교하여 오늘이 생일인지 확인한다.
- 만약 생일인 사람들이 있다면 생일 축하 템플릿 txt 파일 중에서 하나를 골라 그 템플릿에 맞춰서 생일인 사람들의 이름과 함께 생일 축하 메시지를 보낸다.
코드를 하나하나 분리해서 설명하기가 힘들어서 주석으로 설명을 해놓았다.
import pandas as pd
import datetime as dt
import smtplib
import string
import random
bday_df = pd.read_csv("birthdays.csv")
"""csv의 내용은 이렇다.
name,email,year,month,day
Test,test@email.com,1961,12,21
.
.
.
"""
my_id = "youremail"
my_pwd = "youremailpassword"
template_list = [
'letter_templates\letter_3.txt',
'letter_templates\letter_2.txt',
'letter_templates\letter_3.txt']
#랜덤으로 셋 중에 하나를 고르기 위해, random.choice()를 사용하기 위해 템플릿의 상대경로를 넣은 list를 만들어놨다.
t_month = dt.datetime.now().month
t_day = dt.datetime.now().day
"""오늘의 날짜를 이렇게 알아냈다. now()를 사용하면 datetime class를 돌려주는데,
그 class의 생성자 변수가 month, day .. 이렇게 있는 것 같다."""
for b_month, b_day in zip(bday_df['month'], bday_df['day']):
"""pandas dataframe을 이용해서 한 행에 있는 data row를 가져왔다. 그런데 굳이 이렇게 안 하고도
bday_df.itemrows() 이거 써도 되었을 것 같다. """
if t_month == b_month and t_day == b_day:
today_bdays = bday_df[(bday_df['month'] == b_month) & (bday_df['day'] == b_day)]
"""
이렇게 짠 이유는 만약 오늘 생일이 같은 사람들이 여러 명 있을 것 같아서
그 사람들을 한꺼번에 모은 dataframe을 만들었다.
"""
for name, email in zip(today_bdays['name'], today_bdays['email']):
bday_template = random.choice(template_list)
log_value = {'NAME' : name}
with open(bday_template, 'r') as bday_text:
text = string.Template(bday_text.read())
bday_text = text.substitute(log_value)
"""
string 모듈을 이용해서 template 내용 안에 있는 ${name}으로 바꿔주었다.
단순하게 replace를 사용해도 되었지만, 옛날에 배웠던 거 복습하는 기분으로
한 번 string 모듈 사용해봤다. 그런데 string을 쓰면 log tag 관리가 잘 될 것 같다.
미연시? 같은 거 만들 때 쓰면 좋을 듯.
"""
"""
전 포스트와 썼던 것과 동일한 형식으로 코드를 짰다.
솔직히 smtp의 기본 골격이 되는 코드인 듯.
"""
with smtplib.SMTP("smtp.gmail.com") as connection:
connection.starttls()
connection.login(user=my_id, password=my_pwd)
connection.sendmail(
from_addr = my_id,
to_addrs="someone's@gmail.com",
msg=f"Subject:Happy BirthDay!\n\n{bday_text}"
)
break
"""
if문에서 break을 끝냈다. 왜냐하면 if문 안에서 오늘의 생일 같은 사람들을 이미 다 모아놨기 때문에
굳이 다른 사람들의 데이터를 읽을 필요가 없기 때문이다.
"""
'조열심 카테고리 > Python 이것저것' 카테고리의 다른 글
| [Python] Python에서 html 언어 이스케이핑 하기 (0) | 2022.05.27 |
|---|---|
| [Python] Otaku-qutoes program (0) | 2022.05.23 |
| [Python] SMTP (0) | 2022.05.23 |
| [Python] 자신만의 Error 만들기 (0) | 2022.05.11 |
| [Python] 제너레이터 내포 표기 (0) | 2022.05.11 |