엑셀에 저장한 이름과 이메일로 파일을 첨부하여 파이썬으로 이메일 보내기
엑셀 파일에는 이름과 이메일을 저장해서 리스트로 만든다.
파이썬 파일이 있는 동일한 폴더에 엑셀에 작성한 이름과 똑같은 이름의 폴더를 만들고 메일로 첨부될 파일(1..jpg, 2.jpg ...)을 둔다.
python auto_email.py를 실행시키면 엑셀에 작성된 수십 수백개의 명단으로 메일이 전송된다.
보통 60명 많으면 200명 정도 메일링 작업을 하는데,
시간도 1시간 이상 걸릴 뿐더러 실수할 수 있는 확률이 많다.
python 프로그램을 돌리면 5~10분 정도 밖에 안걸리고 노동강도와 피로도도 적다
auto_email.py 코드설명
from datetime import datetime, timedelta 날짜 포매팅과 계산을 위해 사용
from os import listdir, makedirs 첨부될 파일의 폴더를 만들고 읽기 위해서 사용
from os.path import isdir 파이썬에서 폴더를 읽을 때 폴더가 맞는지 확인하기 위해 사용
from my_email import send_mail 추가로 만든 파이썬 파일에서 send_mail()을 불러옴
from openpyxl import load_workbook 파이썬에서 엑셀 프로그램을 읽어오기 위해서 사용
######## auto_email.py ########
# 날짜 포매팅과 계산을 위해 사용
from datetime import datetime, timedelta
# 첨부될 파일의 폴더를 만들고 읽기 위해서 사용
from os import listdir, makedirs
# 파이썬에서 폴더를 읽을 때 폴더가 맞는지 확인하기 위해 사용
from os.path import isdir
#추가로 만든 파이썬 파일에서 send_mail()을 불러옴
from my_email import send_mail
# 파이썬에서 엑셀 프로그램을 읽어오기 위해서 사용
from openpyxl import load_workbook
# 촬영한 날짜 변수 선언 추후 메일제목과 본문내용에서 사용
photo_date = "2022-**-**"
# 촬영한 업체 변수 추후 메일제목과 본문내용에서 사용
company = "**********"
# 날짜 변수를 -를 없앤다 엑셀파일 제목이 -가 없어서 사용했음
insert_date = photo_date.replace("-", "")
# 이메일 리스트가 있는 엑셀 파일을 불러온다.
xlsx = load_workbook(f"{insert_date}_emailList.xlsx", read_only=True)
# 엑셀에 첫번째 sheet를 활성화 시킨다
sheet = xlsx.active
# 보정이 완료된 시점(오늘)에서 3일을 더한 날짜가 until_date라고 선언하고 추후 본문내용에서 사용
until_date = (datetime.now() + timedelta(days=3)).strftime("%Y년 %m월 %d일 (%A)")
# 엑셀 리스트에 명단의 한줄한줄을 읽어온다.
for row in sheet.iter_rows():
# 엑셀의 2번째 셀에 있는 값은 name, 3번째는 email, 4번째는 status 변수에 넣는다
name = row[1].value
email = row[2].value
status = row[3].value
try:
# 엑셀에서 불러온 이름과 내가 저장한 폴더에서 동일한 폴더안에 있는 0.jpg, 1.jpg ... 불러온다
file_photo = [
str(name + "/0.jpg"),
str(name + "/1.jpg"),
str(name + "/2.jpg"),
str(name + "/3.jpg"),
str(name + "/4.jpg"),
]
except (FileNotFoundError, TypeError):
pass
# 엑셀 status 값이 "1차"이면 content 값을 아래와 같이 넣는다
if status == "1차":
contents = f"""
안녕하세요. {company}에서 촬영을 진행했던 아이캔입니다.
촬영에 친절히 협조해주셔서 너무 감사합니다.
추가 요청은 {until_date} 까지 말씀해 주셔야 합니다.
기타 전할 말을 남기시면 됩니다.
"""
# 로그 창에 name, email, contents, file_photo, photo_date, compay 를 출력
print(name, email, contents, file_photo, photo_date, company)
# send_mail 함수를 파라미터 값을 넣어 불러온다
send_mail(name, email, contents, file_photo, photo_date, company)
######## my_email.py ########
# 이메일 전송하기 위해 아래와 같이 불러온다.
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import smtplib, ssl
# 구글 이메일을 사용하기 위한 세팅값
SMTP_SERVER = "smtp.gmail.com"
SMTP_PORT = 465
SMTP_USER = "******@gmail.com"
# SMTP_PASSWORD는 구글이메일의 패스워드가 아니고, 얼마전부터 보안강화로
# https://myaccount.google.com/security 16자리 앱 패스워드를 생성한 후 작성한다.
SMTP_PASSWORD = "******************"
def send_mail(name, addr, contents, attachments, photo_date, company):
msg = MIMEMultipart("alternative")
if attachments:
msg = MIMEMultipart("mixed")
msg["From"] = SMTP_USER
msg["To"] = addr
# 파라미터 값으로 제목 작성
msg["Subject"] =f"{name}님, {photo_date} {company} 사진촬영"
text = MIMEText(contents)
msg.attach(text)
if attachments:
for attachment in attachments:
from email.mime.base import MIMEBase
from email import encoders
file_data = MIMEBase("application", "octet-stream")
f = open(attachment, 'rb')
file_contents = f.read()
file_data.set_payload(file_contents)
encoders.encode_base64(file_data)
from os.path import basename
filename = basename(attachment)
file_data.add_header("Content-Disposition",
"attachment", filename=filename)
msg.attach(file_data)
smtp = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT)
# smtp 로그인
smtp.login(SMTP_USER, SMTP_PASSWORD)
# smtp 메일전송
smtp.sendmail("******@gmail.com", addr, msg.as_string())
smtp.close()
코드를 변형하여 단체메일을 활용하거나,
content 내용에 html코드를 넣어 예쁘게 디자인 해서 사용하면 좋을 것 같다.
'Python, Django' 카테고리의 다른 글
| 비디오 파일에서 설정 단위로 이미지 캡쳐 (0) | 2022.08.30 |
|---|---|
| 파이썬, 자동으로 그림파일 불러 와서 워드파일 만들기 (0) | 2022.08.29 |