본문 바로가기

Creation/Python

[Python] 한글로 된 메일 Gmail(지메일) 자동대량발송 하기



Gmail 대량발송 - 한국어 메일 인코딩 깨짐 문제 해결


  Python이 고질적인 문제를 가지고 있는 것이 한글 인코딩으로 된것이 따로 설정을 하지 않으면 인코딩문제로 깨진다는 것인데요, 이메일을 보내는 코드에서도 마찬가지입니다. 하지만, 몇가지 수정만 해주면 문제가 없습니다.


# -*- coding:utf-8 -*- import os, smtplib from email.MIMEMultipart import MIMEMultipart from email.MIMEBase import MIMEBase from email.MIMEText import MIMEText from email.header import Header from email import Encoders import time import datetime import random gmail_username="상대방에게 뜰 발신자" gmail_user="실제Gmail계정@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']=Header(subject,'utf-8') # 제목 인코딩 msg.attach(MIMEText(text, 'plain', 'utf-8')) # 내용 인코딩 msg.attach(MIMEText(html, 'html', 'utf-8')) # 내용 인코딩 2 # 아래 코드는 첨부파일이 있을 경우에만 주석처리 빼시면 됩니다. #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(1,5) # Set range of the waiting time. email = email.strip() # Removing White spaces. if email == "" : continue print "[" + str(datetime.datetime.now()) + "] Sending email to " + email + "..." send_gmail(email,title,message,html,attach_file) print "[" + str(datetime.datetime.now()) + "] Complete... Waiting for " + str(rand) +" seconds." time.sleep(rand) print "Mails have just been sent. The program is going to end." if __name__ == "__main__": mainLoop()

  저번 글도 참고 하시구요,



 저번 글에서 변한 부분은 몇가지 되지 않구요, 아래 세 줄이 변화된 내용입니다.

msg['Subject']=Header(subject,'utf-8') # 제목 인코딩 msg.attach(MIMEText(text, 'plain', 'utf-8')) # 내용 인코딩 msg.attach(MIMEText(html, 'html', 'utf-8')) # 내용 인코딩 2


 utf-8로 인코딩 하면 한국어 뿐만 아니라 어느 언어로 해도 깨질리 없죠. 위와 같은 코드를 사용하시고, html.html 파일에 html버전의 메일을, text.txt파일에 텍스트 버전의 메일을 위 소스코드와 같은 폴더에 넣으신 다음에 메일 발송 하시면 됩니다. list.txt에 있는 메일 주소들을 대상으로 보낸다는 것 잊지 마시구요. 프로그램을 실행시키면 아래와 같이 발송과정이 나옵니다.




  + Gmail(지메일)의 발송 한도는 1일 500부라는 것 잊지 마세요.