[Python DIY] 대량메일(일 500건) 발송 메뉴얼

Posted by Readiz
2014.02.27 14:22 Creation/Python

Python 사용 대량메일 발송 메뉴얼



1. Python이 어떻게 보낸다는 것인가?

  Python은 중간다리 역할을 하는 프로그램일 뿐입니다. 직접 지금 사용하는 컴퓨터로 메일을 보내는 것이 아니라, 구글에서 제공하는 SMTP서버를 사용하여, 이 서버에게 메일을 보내라고 명령하는 것입니다. 따라서 받는 사람이 쓰는 메일 서버에서 스팸으로 거르게 될 가능성이 더 낮아집니다. (구글 SMTP를 막는다면 그 수신인은 Gmail로 오는 메일을 아예 받지 못하게 되는 것이므로) 다만 이렇게 보낸다고 하더라도 이 사람이 Gmail로 바로 보낸 것인지, SMTP서버를 이용해서 경유하는 것인지를 알 수는 있습니다. 그렇지만 지금 사용하는 방법은 Outlook등을 통해 보내는 방법과 구조적으로 동일하기 때문에 스팸으로 걸러질 가능성은 거의 없다고 보면 되겠습니다.


2. 준비하기

  정지되지 않고 제대로 발송되는 Gmail 계정이 필요합니다. 계정당 일일 500건까지 발송이 가능합니다. 물론 여러 계정을 쓴다면 500건을 초과해서도 보낼 수 있겠지만, 이 방법으로 남용해서 메일을 발송하다가는 구글측에서 SMTP서버 사용을 제한할 수 있습니다. 그렇게 되면 낭패이므로 한 계정을 사용하여 일일 500건까지 발송하는 것이 안전하다고 볼 수 있겠습니다.

  그 다음으로 필요한 것은 당연하게도 Python 프로그램입니다. Python2.7버전을 이용하여 해당 코드를 작성하였으므로 이 버전을 받으시는게 좋습니다. 링크는



  위에서 WIndow 버전에 해당하는 것을 받으시면 되겠습니다.


  이제 보낼 메일 내용을 두가지 버전으로 준비합니다. 사실 요즘은 두가지를 준비하지 않아도 상관은 없는데, HTML태그를 읽지 못하는 프로그램을 위한 것입니다. 하지만 요즘은 스마트폰이 전부 다 HTML태그를 읽어들여올 수 있으므로 걱정은 그다지 하지 않으셔도 됩니다. 형식적인 것이라 생각하시면 되고, HTML버전을 만드신 후에 텍스트 부분만 복사해서 한번 더 만든다고 생각하시면 되겠습니다.


  텍스트 버전 메일 파일명: text.txt

  HTML 버전 메일 파일명: html.html


  위 파일명으로 실행하고자 하는 메일 발송 프로그램과 같은 위치에 넣어주시면 됩니다.


  마지막으로 준비하셔야 할 것은 당연하게도 보낼 메일 주소일 겁니다. 이것은 list.txt라는 파일을 만들어 활용합니다. 대량으로 보내기 위해서지요. 아래처럼 list.txt파일을 만드시면 됩니다.



  쉽게 얘기해서 한 줄에 주소 하나씩 들어가면 됩니다. 이제 sendMail.py파일 (실제로 메일 보내는 작업을 하는 파일)을 수정하면 메일 발송 준비가 끝납니다. 파일 내용은 다음처럼 되어 있습니다.


import os, smtplib from email.MIMEMultipart import MIMEMultipart from email.MIMEBase import MIMEBase from email.MIMEText import MIMEText from email import Encoders import time import datetime import random gmail_username="상대에게 보여질 닉네임입니다" gmail_user="지메일 아이디@gmail.com" gmail_pwd="지메일 패스워드" attach_file="만약 첨부파일을 발송한다면 첨부파일 명" def send_gmail(to, subject, text, html, attach): msg=MIMEMultipart('alternative') msg['From']=gmail_username msg['To']=to msg['Subject']=subject msg.attach(MIMEText(text, 'plain')) msg.attach(MIMEText(html, 'html')) #첨부파일을 넣는다면 이 아래부분에 붙어있는 #들을 제거하시면 됩니다. #part=MIMEBase('application','octet-stream') #part.set_payload(open(attach, 'rb').read()) #Encoders.encode_base64(part) #part.add_header('Content-Disposition','attachment; filename="%s"' % os.path.basename(attach)) #msg.attach(part) mailServer=smtplib.SMTP("smtp.gmail.com",587) mailServer.ehlo() mailServer.starttls() mailServer.ehlo() mailServer.login(gmail_user,gmail_pwd) mailServer.sendmail(gmail_user, to, msg.as_string()) mailServer.close() def mainLoop(): f = open("text.txt", "r") message = f.read() f.close() f = open("html.html", "r") html = f.read() f.close() title="메일 제목을 여기에 넣으시면 됩니다." print "Program Ready" print "----------------------" f = open("list.txt", "r") emails = f.readlines() for email in emails: rand = random.randrange(5,7) # Set range of the waiting time. email = email.strip() # Removing White spaces. if email == "" : continue print "[" + str(datetime.datetime.now()) + "] Sending email to " + email + "..." try: send_gmail(email,title,message,html,attach_file) except: print "Mail sending error. (" + email + ")" break print "[" + str(datetime.datetime.now()) + "] Complete... Waiting for " + str(rand) +" seconds." time.sleep(rand) print "Sending mail program is going to be terminated. Now waiting your command to exit." time.sleep(-1) if __name__ == "__main__": mainLoop()


복잡해보이지만 수정하셔야 할 부분은 6곳 뿐입니다. 

1) 상대에게 보일 닉네임 설정

2) 지메일 계정 입력

3) 지메일 암호 입력

4) 첨부파일이 있다면, 첨부파일 명

5) 4번에 첨부파일이 있다면, 파일 중간에 #으로 된 부분을 제거하시면 됩니다. (한글로 된 부분 제외)

6) 메일 제목 입력


이렇게 수정하시면 이제 준비작업은 끝이 납니다.



3. 메일 발송

  밑에 첨부해드릴 파일의 압축을 풀고, sendMail.py라고 되어있는 파일을 더블클릭하여 실행하면 끝이 납니다. 발송 과정을 모니터링 할 수 있고 다음처럼 화면에 출력됩니다.



다만 보내는 도중 에러가 나면 아래와 같이 프로그램이 중간에 멈춥니다.




  위 에러는 인위적으로 만든 것인데, 유효하지 않은 메일주소로 메일을 보내려고 했기 때문에 에러가 발생하는 것입니다. 발송이 되었다 하면 일단 SMTP서버로 보내는 명령이 전송은 된 것이고, 그 이후에 발생하는 에러는 Gmail계정에 로그인하시면 발송되지 않았다는 메일을 받으실 수 있습니다. 이것으로 받는 상대방의 메일이 유효하지 않은 메일이라는 것을 체크할 수 있습니다.



4. 파일 다운로드



  보내드리는 파일에 샘플들이 들어 있습니다. 만약에 한글로 된 메일을 보내신다면 kor 폴더에 들어있는 파일들로 보내시면 됩니다. 한글메일은 인코딩 문제가 있어서 이를 해결한 버전을 따로 폴더안에 넣어두었습니다.


  이상 Python으로 Google SMTP서버를 이용하여 메일을 보내는 방법에 대해 설명드렸습니다.



저작자 표시 비영리 변경 금지
신고
이 댓글을 비밀 댓글로
    • 2014.04.19 14:33
    비밀댓글입니다
    • 카테고리 다른 글 참고하세요~
      가능하게 코딩 해두었습니다.
    • 2014.07.11 16:32
    비밀댓글입니다
    • 2014.08.27 14:34
    비밀댓글입니다
    • 호랑나비
    • 2014.10.07 21:58 신고
    다른 기능들은 잘 작동하는 것 같은데, 유저네임 부분이 안 먹힙니다. 왜 일까요? ㅠ 고쳐주세요~ ^^
    받는 메일은 네이버 입니다.
    • 2014.11.03 11:37
    비밀댓글입니다
    • 유저네임 변경이 가능했었는데 구글에서 막은 듯 합니다.
    • 파이썬 입문자
    • 2016.07.17 18:37 신고
    이메일 내용에서 text.txt. html.html에서 입력한 Enter키가 적용이 안 됩니다. 결과적으로 이메일 수신자는 문단 나누기가 안 된 글을 받게 되네요.
    이메일 내용에 Enter가 적용되기 위해서는 어떻게 하면 될까요?
    • 파이썬입문자
    • 2016.07.18 02:19 신고
    어떤 컴퓨터에서는 되는데 다른 컴퓨터로 오니 전송 오류가 뜹니다.
    코드 문제는 아닌 것 같은데 구글 SMTP서버에서 막아서 위 현상이 있을수도 있나요?
    • 그렇죠.. 방화벽 문제일수도 있구요. 제가 알 수 있는 부분은 아닌듯 합니다.
    • 2016.11.09 00:23
    비밀댓글입니다

티스토리 툴바