본문 바로가기

일상/일상 IT

[이메일 대규모 전송] 천 명, 만 명한테 이메일 하나하나 직접 보내지 말자!

반응형

대규모/대용량 이메일, 아직도 일일이 한 명 한 명한테 직접 보내세요?

세상에는 일을 열심히 하는 사람, 못하는 사람, 잘하는 사람, 등등 여러 사람이 있지만,

굳이 내가 '일을 힘들게 하는 사람'이 될 필요는 없다.

 

마케팅 업무나 기타 업무를 하다보면,

혹은 행사를 하다 보면,

가끔 대규모 이메일을 전송해야할 때가 있다.

 

적게는 몇 천 명 단위에서 많게는 몇 만 명 그 이상 단위까지 올라가는데,

이걸 일일이 다 보내고 앉아있으려면 내 손모가지도 분질러지고 인생도 기구해진다.

 

그럴 때는 아래 프로그램을 이용해보자.


파이썬 이메일 대규모 전송 프로그램

# Gmail Sender
# 아래 라이브러리들은 파이썬 기본 내장 라이브러리이므로 별도의 설치가 필요 없습니다.

from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import smtplib

# Google의 Gmail 같은 경우 아래의 STMP 설정을 그대로 쓰면 됩니다. 포트 번호도 바꿀 필요 없습니다.
# 이는 Google에서 설정한 것이므로 gmail, 혹은 gsuite 기준 그대로 쓰면 됩니다.
# 단, 회사 메일이나 네이버, 다음 같은 경우 다르므로 SMTP 서버에 대해 알아보는 게 좋습니다.
# 더 자세한 정보는 각 홈페이지에서 SMTP를 검색해주세요.

# Gmail 같은 경우 해당 코드가 바로는 돌아가지 않습니다. 경고창에 뜨는 google의 URL로 들어가서
# "보안 수준이 낮은 앱 허용"을 "활성화"로 바꿔주셔야 합니다.
# "보안 수준이 낮은 앱 허용"의 기본 상태는 "비활성화"입니다.
# 해당 상태를 바꾸지 않으면 코드 실행에 에러가 발생합니다.

SMTP_SERVER = "smtp.gmail.com"
SMTP_PORT = 465
# 보내는 메일 계정
SMTP_USER = "보내는 사람 메일 계정"
SMTP_PASSWORD = "보내는 사람 메일 비밀번호"
# 만약 아래 메일 유효성 검사 함수에서 False가 나오면 메일을 보내지 않습니다.
def is_valid(addr):
    import re
    if re.match('(^[a-zA-Z-0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)', addr):
        return True
    else:
        return False
# 이메일 보내기 함수
def send_mail(addr, subj_layout, cont_layout, attachment=None):
    if not is_valid(addr):
        print("Wrong email: " + addr)
        return
    
    # 텍스트 파일
    msg = MIMEMultipart("alternative")
    # 첨부파일이 있는 경우 mixed로 multipart 생성
    if attachment:
        msg = MIMEMultipart('mixed')
    msg["From"] = SMTP_USER
    msg["To"] = addr
    msg["Subject"] = subj_layout
    contents = cont_layout
    text = MIMEText(_text = contents, _charset = "utf-8")
    msg.attach(text)

    if attachment:
        from email.mime.base import MIMEBase
        from email import encoders
        file_data = MIMEBase("application", "octect-stream")
        file_data.set_payload(open(attachment, "rb").read())
        encoders.encode_base64(file_data)
        import os
        filename = os.path.basename(attachment)
        file_data.add_header("Content-Disposition", 'attachment', filename=('UTF-8', '', filename))
        msg.attach(file_data)
    # smtp로 접속할 서버 정보를 가진 클래스변수 생성
    smtp = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT)
    # 해당 서버로 로그인
    smtp.login(SMTP_USER, SMTP_PASSWORD)
    # 메일 발송
    smtp.sendmail(SMTP_USER, addr, msg.as_string())
    # 닫기
    smtp.close()

# 한 명에게 하나의 메일을 보낼 때
send_mail("받는 사람 주소", "메일 제목", "내용", "첨부파일 경로(생략 가능)")

# 한 명에게 여러 메일을 보낼 때
for i in range(100):
    send_mail("받는 사람 주소", "메일 제목", "내용", "첨부파일 경로(생략 가능)")

# 엑셀 파일에 정리된 명단으로 한꺼번에 보낼 때
# 아래 openpyxl 라이브러리는 외부 라이브러리이므로 pip3를 통해 설치 후 사용하시기 바랍니다.
from openpyxl import load_workbook
wb = load_workbook('ex.xlsx')
ws = wb.active
for row in ws.iter_rows():
    addr = row[0].value
    subj_layout = row[1].value
    cont_layout = row[2].value
    attachment = row[3].value
    send_mail(addr, subj_layout, cont_layout, attachment)

위 프로그램 소스 코드를 그대로 복사 붙여넣기 한 후,

sender.py 라는 이름으로 저장하자.

 

위 프로그램에도 적혀있듯, 별도의 라이브러리를 다운로드할 필요 없으니 pip니 뭐니에 대해 알 필요도 없다.

 

아, 혹시… 파이썬도 없으시다고요?

 

Welcome to Python.org

The official home of the Python Programming Language

www.python.org

위 링크에서 다운로드 받으면 된다.

(파이썬은 있어야 하니까…)

 

SMTP_USER = "보내는 사람 메일 계정"
SMTP_PASSWORD = "보내는 사람 메일 비밀번호"

그러고 나서, 소스 코드에서 위 두 줄에 본인의 구글 Gmail 계정과 비밀번호를 입력하면 된다.

현재 코드에서 Gmail이 아닌 네이버 메일이나 카카오 메일 같은 것을 활용하고 싶다면,

네이버에서 SMTP 포트 번호를 부여받아야 한다.

 

어렵진 않지만 조금 귀찮다.

차라리 스마트폰에서 사용하는 구글 계정으로 Gmail을 보내는 게 편하다.

 

회사 메일을 써야한다면,

회사에서 운용하는 SMTP 서버가 있을 텐데, 이는 각 회사마다 다르므로 관련 부처에 협업을 요청하면 된다.

 

마지막으로,

# 한 명에게 하나의 메일을 보낼 때
send_mail("받는 사람 주소", "메일 제목", "내용", "첨부파일 경로(생략 가능)")

# 한 명에게 여러 메일을 보낼 때
for i in range(100):
    send_mail("받는 사람 주소", "메일 제목", "내용", "첨부파일 경로(생략 가능)")

# 엑셀 파일에 정리된 명단으로 한꺼번에 보낼 때
# 아래 openpyxl 라이브러리는 외부 라이브러리이므로 pip3를 통해 설치 후 사용하시기 바랍니다.
from openpyxl import load_workbook
wb = load_workbook('ex.xlsx')
ws = wb.active
for row in ws.iter_rows():
    addr = row[0].value
    subj_layout = row[1].value
    cont_layout = row[2].value
    attachment = row[3].value
    send_mail(addr, subj_layout, cont_layout, attachment)

위 3가지 옵션 중 하나를 선택해서 기입하면 되는데,

3번째 옵션은 마이크로소프트 엑셀을 이용해야하기 때문에, openpyxl이란 라이브러리가 필요하다.

이에 대해서는 그냥 python3 프롬프트를 열고,

$ pip install openpyxl

을 입력하고 엔터를 누르면 된다.


설정해야할 것

이외에도 설정할 것이 있는데,

구글 메인 페이지에서 개인 계정버튼을 누르면 보이는

<Google 계정 관리> 로 들어가자.

 

들어가면 왼쪽의 메뉴에서 보안 탭에 들어가도록 하자.

보안 탭에서 아래로 스크롤을 조금만 내리면,

<보안 수준이 낮은 앱의 액세스> 라는 항목이 보인다.

이 항목을 클릭하면 아래와 같은 창이 나타나게 된다.

여기서 보안 수준이 낮은 앱 허용: 사용 안함 우측에 보이는 토글을 옆으로 밀어서 사용할 수 있도록 활성화시켜주면 된다.

 

그러고 나서 마지막으로,

파이썬3 프롬프트에서

$ python3 sender.py

라고 입력하면,

1만 명이 넘는 사람에게도 몇 십 분 내로 알아서 보내주는 프로그램이 실행된다!

 

우리가 준비할 것은,

보낼 사람의 이메일 주소 목록, 이메일 내용, 그리고 사진이나 파일이 필요하다면 그것을 준비하는 것밖에 없다!

 

아주 쉽고 간단하고 편리한 대규모 이메일 보내기,

이제 더 이상 손으로 일일이 보내지 말고,

 

스마트하게 하자!

 

p.s. 네이버 메일 대규모 전송 프로그램은 다음에 다뤄보도록 하겠다.


 

반응형