파이썬으로 메일 보내기
이메일이 발송되는 원리는 무엇일까? 지메일, 아웃룩과 같은 앱들은 SMTP(Simple Mail Transfter Protocol) 프로토콜을 사용한다. SMTP를 활용해 파이썬으로 메일을 보내보자. 이를 위해선 관련 패키지가 필요하다.
패키지 설치
리플 패키지에서 ‘yagmail’을 설치해주자. yagmail은 명칭을 보면 알겠지만 지메일 메일을 보내기 위한 패키지다.
일회용 메일 주소 얻기
드롭메일.미(https://dropmail.me/en/)에서 일회용 메일 주소를 가져오자.
코드 작성
import yagmail sender = 'omymailaddress@gmail.com' receiver = 'fvhdheoz@yomail.info' subject = 'This is the subject ' contents = """ You can put content of the email here. Voila! """ # create SMTP object with SMTP class yag = yagmail.SMTP(user = sender, password=???) # Not good idea to write password on Python code otherwise other can see it. |
마지막 줄에 SMTP 클래스로 SMTP 객체를 만들어주었다. user과 password의 아규먼트를 넣어주어야 하는데, 이때 패스워드의 아규먼트(전달인자)를 그대로 기재하는 것은 보안상 좋지 않다. 다른 이들이 파이썬 코드를 보고 비밀번호를 파악할 수 있기 때문이다.
이를 위해 리플의 Secret 기능을 활용해보자.
이메일 주소의 비밀번호를 기재한 후 ‘Add new secret’버튼을 누르자.
시크릿 코드가 반영되었다. 메일을 보내주자.
특정 시간에 주기적으로 메일 보내기
특정 시간에 맞춰 주기적으로 메일을 보내고 싶다면 아래 while 반복문을 활용하면 된다.
import yagmail import os import time from datetime import datetime as dt sender = '********@gmail.com' receiver = 'sdfhhzgtc@emlhub.com' subject = 'This is the subject ' contents = """ You can put content of the email here. Voila! """ while True: now = dt.now() if now.hour == 13 and now.minute == 49: yag = yagmail.SMTP(user=sender, password=os.getenv('PASSWORD')) yag.send(to=receiver, subject=subject, contents=contents) print('E-mail Sent!') time.sleep(60) |
연락처 CSV 데이터의 메일 주소로 메일 보내기
아래와 같이 contacts.csv 파일을 만들어 주자. 메일을 보낼 사람 이름과 메일 주소 데이터를 임의로 지정해주었다. 아래 메일 주소는 드롭메일.미에서 만든 임의 주소다. 참고로 CSV파일에서 comma 다음 email 스트링을 띄어쓰기 하면 ‘email’이 아니라’ email’로 인식하는 경우가 있다.
import yagmail import os import pandas sender = '****@gmail.com' subject = 'This is the subject ' yag = yagmail.SMTP(user=sender, password=os.getenv('PASSWORD')) df = pandas.read_csv('contacts.csv') #print(df) for index, row in df.iterrows(): contents = f" Hi {row['name']} You can put content of the email here. Voila!" print(row['email']) yag.send(to=row['email'], subject=subject, contents = contents) print("E-mail Sent!") |
판다스의 iterrows() 메소드를 활용해서 row의 name 컬럼과 email 컬럼에서 데이터를 가져와 각 주소로 메일을 보내주었다.
정상적으로 드롭메일에 도착한 것을 알 수 있다.
PythonAnywhere
그 외 파이썬 스크립트를 특정시간에 주기적으로 실행시키는 방법들 중 또 다른 하나는 PythonAnywhere(https://www.pythonanywhere.com/)에 스크립트를 올리는 것이다.
이 서비스의 장점은 내가 따로 서버를 만들어 반복실행하는 코드를 짤 필요가 없다는 점이다.
하는 방법은 아래 사이트를 참조하자.
https://pythonhow.com/how/schedule-a-python-script-for-execution-at-a-specific-time-every-day/
Reflection
csv 파일에서 띄어쓰기를 하지 않는 것이 좋다. 띄어쓰기를 하게되면 데이터에 공백이 함께 포함되기 때문이다. 예를 들어 name, mail 이라는 칼럼을 작성한 경우, 여기서 mail칼럼은 ‘mail’이 아니라 ‘ mail’이라는 칼럼명을 가지게 되는 것이다. 공백을 넣고 Key Error가 계속 발생된 것을 확인했다. csv파일 뿐만 아니라 다른 파일에도 공백을 넣을 때 파일이 공백을 어떻게 인식하는지에 대해 생각을 해야한다.
첨부 파일과 함께 E-mail 보내기
import yagmail import os sender = '***@gmail.com' receiver = '3cc2phz6@10mail.tk' subject = 'This is the subject ' contents = [""" This is amazaing contents, are't they? """, 'contacts.csv'] yag = yagmail.SMTP(user=sender, password=os.getenv('PASSWORD')) yag.send(to=receiver, subject=subject, contents=contents) print("Email Sent!") |
contacts.csv 파일이 같은 폴더 내 있다는 가정하에 위 코드가 작성되었다. contents의 아규먼트에 contents 변수를 할당했다. contents는 리스트 형태이며, 스트링 문구와 함께 csv파일도 함께 있다. 이렇게 리스트 형태의 contents를 보내면 아래와 같이 나타난다.
엄청난다!
연락처 CSV 파일을 기반으로 특정 인물에게 맞는 첨부파일과 함께 메일 보내기
Pandas로 csv 파일을 읽어오는 것과 반복문을 잘 활용해서 메일을 보낼 수도 있다.
import yagmail import os import pandas as pd sender = "****@gmail.com" df = pd.read_csv('contacts.csv') #print(df) for index, row in df.iterrows(): subject = f"Dear {row['name']}, This is our frequent service" receiver = row['email'] contents = [f""" Hey, {row['name']} you have to pay {row['amount']}. Bill is attached! Check this out ;) """, row['filepath']] yag = yagmail.SMTP(user=sender, password=os.getenv('PASSWORD')) yag.send(to=receiver, subject=subject, contents=contents) print("E-mail Sent") |
import yagmail import os import pandas as pd sender = "****@gmail.com" yag = yagmail.SMTP(user=sender, password=os.getenv('PASSWORD')) df = pd.read_csv('contacts.csv') for index, row in df.iterrows(): subject = f"Dear {row['name']}, This is our frequent service" receiver = row['email'] contents = [f""" Hey, {row['name']} you have to pay {row['amount']}. Bill is attached! Check this out ;) """, row['filepath']] yag.send(to=receiver, subject=subject, contents=contents) print("E-mail Sent") |
yag 선언 코드는 보내는 사람의 로그인 정보이므로 반복문 이전에 코드를 작성해도 괜찮다.
첨부파일 수정과 함께 메일 보내기
import yagmail import os import pandas as pd sender = "****@gmail.com" #Login yag = yagmail.SMTP(user=sender, password=os.getenv('PASSWORD')) #Open Pandas df = pd.read_csv('contacts.csv') def generate_file(filename, content): with open(f"{filename}.csv", 'w') as file: file.write(str(content)) #iterate from contact.csv table for index, row in df.iterrows(): name = row['name'] amount = row['amount'] receiver_email = row['email'] generate_file(name, amount) subject = f"Dear {name}, This is our frequent service" receiver = row['email'] contents = [f""" Hey, {name} you have to pay {amount}. Bill is attached! Check this out ;) """, name, ] yag.send(to=receiver_email, subject=subject, contents=contents) print("E-mail Sent") |
generate_file 함수에서 filename을 csv파일로 바꿔주도록 해주었지만, 이는 그다지 좋은 코드가 아니다. filename이 올 자리에는 filename만 적어주는 것이 좋다. 어떻게 하면 이 문제를 해결할 수 있을까? 해답은 filename이라는 변수를 새로 추가해주면 된다. 심플하다.
import yagmail import os import pandas as pd sender = "****@gmail.com" #Login yag = yagmail.SMTP(user=sender, password=os.getenv('PASSWORD')) #Open Pandas df = pd.read_csv('contacts.csv') def generate_file(filename, content): with open(filename, 'w') as file: file.write(str(content)) #iterate from contact.csv table for index, row in df.iterrows(): name = row['name'] filename = name + ".txt" amount = row['amount'] receiver_email = row['email'] generate_file(filename, amount) subject = f"Dear {name}, This is our frequent service" receiver = row['email'] contents = [f""" Hey, {name} you have to pay {amount}. Bill is attached! Check this out ;) """, filename, ] yag.send(to=receiver_email, subject=subject, contents=contents) print("E-mail Sent") |
'Research > Python' 카테고리의 다른 글
파이썬 gspread 라이브러리로 구글시트 다루기 (0) | 2022.02.22 |
---|---|
MoviePy 장단점과 설치 주소 (0) | 2022.02.13 |
파이썬을 활용할 수 있는 유용한 툴들(DeepNote, Streamlit) (0) | 2022.01.03 |
Python_replit으로 파이썬 개발 환경 구축하기 (0) | 2022.01.03 |
[Labelimg] 이미지 라벨링 하기 (0) | 2021.11.08 |
댓글