Email SMTP and the datetime module

SMTP를 이용하여 파이썬으로 이메일을 보내는 방법

SMTP

  • Simple Mail Transfer Protocol의 약자
  • 이메일을 메일 서버가 어떻게 받고, 다음 메일 서버로 전달하고
    인터넷을 통해 어떻게 전송하는지 결정 하는 모든 규칙이 담겨 있음


파이썬의 smtplib모듈

  • SMTP를 이용해서 이메일을 인터넷의 어떤 주소로 발송할 수 있게 해줌


1️⃣ import 후 객체 생성

  • 이메일 제공자의 SMTP 서버 위치를 지정해야 함


2️⃣ starttls()호출

  • tls : Transport Layer Security의 약자
  • 이메일 서버와의 연결을 안전하게 만드는 방식
  • 이메일 전송시 다른 누군가 이메일을 가로채 읽으려 하면 작동
  • 메시지가 암호화됨


3️⃣ 로그인 정보


4️⃣ 메일 전송

  • 메일 제목 Subject:
  • 본문 \n\n 사용해 새 라인 추가해서 본문 넣으면 됨


5️⃣ 파일 닫기

오류해결

2

1


*️⃣ close() 없이 같은 기능 하도록 with 사용

  • 이메일 전송이 완료되면 자동으로 연결이 종료 됨

3



datetime 모듈 사용법

4

5



이메일로 월요일 동기부여 명언 전송하기

1️⃣ 사용할 모듈들 import, 현재 날짜, 요일 객체 생성

2️⃣ 명언 파일 열어서 리스트화한 후 객체 저장

3️⃣ 랜덤으로 하나 선택해서 객체 저장

4️⃣ smtplip을 이용해서 전송

6



생일 자동 축하기

1️⃣ 오늘 날짜가 birthdays.csv에 있는 생일과 일치하는지 확인

  • 오늘 날짜 객체 생성
  • pandas 이용해서 birthdays.csv를 데이터화
  • 컴프리헨션 사용해서 새로운 딕셔너리 생성
  • if문으로 딕셔너리 안에 날짜가 존재하는지 확인


2️⃣ if문이 참이면 무작위로 편지 뽑기


3️⃣ replace()사용해 편지 각각의 NAME플레이스 홀더를 생일자로 대체

  • 날짜 키를 넣어서 키값을 구한 후 객체 생성
  • 키값에 있는 name값 구해 대체


4️⃣ 편지 전송

7



Final Code

from datetime import datetime
import pandas
import random
import smtplib

MY_EMAIL = "dahna0915@gmail.com"
MY_PASSWORD = "*********"

today = datetime.now()
today_tuple = (today.month, today.day)

data = pandas.read_csv("birthdays.csv")
birthday_dict = {(data_row["month"], data_row["day"]): data_row for (index, data_row) in data.iterrows()}
if today_tuple in birthday_dict:
    birthday_person = birthday_dict[today_tuple]
    file_path = f"letter_templates/letter_{random.randint(1,3)}.txt"
    with open(file_path) as letter_file:
        contents = letter_file.read()
        contents = contents.replace("[NAME]", birthday_person["name"])

    with smtplib.SMTP("smtp.gmail.com") as connection:
        connection.starttls()
        connection.login(MY_EMAIL, MY_PASSWORD)
        connection.sendmail(
            from_addr=MY_EMAIL,
            to_addrs=birthday_person["email"],
            msg=f"Subject:Happy Birthday!\n\n{contents}"
        )