데이터 분석가

파이썬(Python) 생일 축하 이메일 보내기(Smtp) 본문

파이썬(python) 프로젝트 모음

파이썬(Python) 생일 축하 이메일 보내기(Smtp)

PlintAn 2023. 4. 4. 11:00

안녕하세요!

birthday_Email.zip
0.00MB

이번 시간에는 SMTP를 이용한 자동 메일링 프로그램을 만들어 보겠습니다 !

 

SMTPSimple Mail Transfer Protocol 의 약자인데요 간단하게 메일을 전송하기 위한 프로토콜입니다

 

이메일 클라이언트, 서버는 SMTP 프로토콜을 이용하여 메일을 전송하고 받습니다.

 

1. 클라이언트, SMTP 서버에 접속

2. 보내는 사람 이메일 주소, 받는 사람 이메일 주소 입력

3. 이메일 제목 내용 작성

4. 위 내용을 SMTP 서버에 전송

5. SMTP 서버는 받는 사람의 이메일 서버로 메일을 전송.

 

위 절차대로 진행이 됩니다 ! 

 

 

해당 프로토콜을 이용해서 생일인 사람에게 이메일을 보내는 프로그램을 만들어 보겠습니다 !

 

생일축하

 

# datetime 모듈로부터 datetime 클래스를 import하여 현재 시간을 가져온다
# today_tuple 변수에는 현재 날짜와 월이 저장된다

from datetime import datetime
import pandas
import random
import smtplib

datetime 모듈로부터 datetime 클래스를 가져오는데 헷갈리시는 분들은 

 

from datetime import datetime as dt

로 변경해서 진행 해주세요 !

 

일단 모듈과 클래스 들을 불러왔으니

 

MY_EMAIL = "이메일 주소"
MY_PASSWORD = "앰 비밀번호" 

today = datetime.now() # 현재 날짜와 시간을 가져온다
today_tuple = (today.month, today.day) # 현재 날짜의 월과 일을 튜플로 저장한다

# birthdays.csv 파일을 pandas 모듈을 사용해 읽는다
# birthdays_dict는 key-value 쌍의 사전(Dictionary) 객체로
# key는 생일(월, 일)이고 value는 해당 생일의 정보가 저장된 row이다
data = pandas.read_csv("birthdays.csv")
birthdays_dict = 
{(data_row["month"], data_row["day"]): data_row for (index, data_row) in data.iterrows()}

해당하는 이메일과 앱 비밀번호를 입력해 줍시다

 

그런다음 now 를 활용해서 원하는 날짜, 월, 일을 today_tuple 튜플로 저장한다.

 

birthdays_dict 딕셔너리를 활용해 birthdays.csv 파일에 있는 데이터들을 가져온다.

 

(이 때, date.interrow()는 pandas 데이터프레임에서 행을 반복하는 메서드이다.)

 

 

# 만약 오늘이 생일인 사람이 있다면, 생일 축하 이메일을 전송
if today_tuple in birthdays_dict:
    birthday_person = birthdays_dict[today_tuple] # 생일인 사람의 정보를 가져온다
    # letter_templates 폴더 안에 있는 템플릿 중 하나를 랜덤으로 선택하여 가져온다
    file_path = f"letter_templates/letter_{random.randint(1,3)}.txt"
    with open(file_path) as letter_file: # 선택된 템플릿 파일을 읽는다
        contents = letter_file.read() # 읽어들인 파일 내용을 contents 변수에 저장
        contents = contents.replace("[NAME]", birthday_person["name"]) 
        # 파일 내용 중 [NAME] 문자열을 생일인 사람의 이름으로 대체

birthdays_dict csv 파일에 저장된 데이터들을 [today_tuple]로 인덱싱하여 오늘 날짜 시간을 찾는다

 

letter_1, letter_2, letter_3 세 가지 txt 파일이 있는데 randint 함수를 활용해 랜덤으로 가져옵니다

 

 

 

 

 

'with as' 문은 파일, 소켓, 락(lock) 등과같은 자원 사용할 떄 자동으로 정리하고 종료한다

예시는 다음과 같다. '해당 파일 경로'에서 파일을 열고 'as 파일'은 객체 '파일'변수 할당

이후 with 블록 안에서 '파일.read()' 파일 내용을 읽고 출력.

with open("파일경로/파일이름.txt", "r") as 파일:
    파일내용 = 파일.read()
    print(파일내용)

 

 

 

 

자 다시 코드로 돌아와서

 

   # Gmail SMTP 서버에 연결합니다.
    with smtplib.SMTP("smtp.gmail.com") as connection:
        connection.starttls() # 연결을 암호화합니다.
        connection.login(MY_EMAIL, MY_PASSWORD) # Gmail 계정에 로그인합니다.
        # 생일인 사람에게 Happy Birthday 이메일을 보냅니다.
        connection.sendmail(
            from_addr=MY_EMAIL, # 발신자 이메일 주소
            to_addrs=birthday_person["email"], # 수신자 이메일 주소
            msg=f"Subject:Happy Birthday!\n\n{contents}" # 이메일 제목과 내용을 작성합니다.
        )

앞서 설명한 SMTP 활용을 위해 저는 지메일을 이용했으므로 지메일 서버

 

smtp.gmail.com에 with문을 이용해 연결시킵니다.

 

그리고 계정에 로그인 후 

 

sendmail을 이용해 from, to를 설정 후 , 보낼 메세지를 msg를 통해 설정합니다.

 

 

 

이렇게 해서 Google 이메일을 통한 자동 이메일링을 알아보았는데요 !

 

datetime 클래스, 모듈을 이용해 원하는 시간을 정해 보낼 수도 있습니다 ! 

 

감사합니다

Comments