Knowledge Map

파이썬으로 이메일 보내기 본문

PYTHON

파이썬으로 이메일 보내기

2016. 10. 10. 08:57

간단한 텍스트 내용을 파이썬으로 보내기

smtplib

  • smtplib 모듈은 RFC 821과 RFC 1869에 설명되어 있는 SMTP 프로토콜을 사용해 메일을 보내는 데 사용할 수 있는 저수준 SMTP 클라이 언트 인터페이스 제공

  • SMTP ( host , port )

    SMTP 서버로의 연결을 나타내는 객체를 생성한다. host를 주면 SMTP 서버의 이름을 가리키며, port는 옵션인 포트 번호로 기본 값은 25이다. host를 주면 connect() 메서드가 자동으로 호출된다. 아니면 연결을 맺기 위해 반환되는 객체에 직접 connect()를 호출해 주어야 한다.

    • SMTP.connect ( host, port) : SMTP서버에 연결. SMTP에 호스트 이름을 주었으면 호출할 필요 없음

    • SMTP.login ( user, password ) : 인증이 필요한 경우 서버에 로그인 한다.

    • SMTP.quit () : 서버에 종료 명령 보내서 세션 종료

    • SMTP.sendmail (fromaddr, toaddrs, message)

      서버에 메일 메세지를 보낸다.

      fromaddr 은 보내는 사람의 이메일 주소를 담은 문자열

      toaddrs 는 받는 사람의 이메일 주소를 담은 문자열들의 리스트이다.

      message 는 RFC-822 형식을 제대로 갖춘 메세지를 담은 문자열이다.

    • 보통 메세지를 생성하는데에는 email 패키지를 사용, message를 텍스트 문자열로 줄수 있지만 오직 0~127의 ASCII문자만 담을수 있으며 아닐 경우 인코딩 에러가 발생. UTF-8 같은 인코딩 메세지 전송의 경우 먼저 메세지를 바이트 문자열로 인코딩하고 message에 지정하면 된다.

    • SMTP.ehlo( hostname ) : ESMTP서버를 스스로 확인한다. hostname은 기본적으로 로컬호스트의 자격 얻은 도메인 이름이다.

    • SMTP.starttls( keyfile, certfile ) : TLS ( Transport Layer Security ) 모드에서 SMTP 연결을 놓는다. 따라오는 모든 SMTP 커멘드가 암호화 된다. 그리고 나서 ehlo()를 다시 호출해야 한다. 만약 keyfile, certfile가 제공되었다면 이들은 소켓 모듈의 ssl() 함수에 전달한다. 만약 이전 EHLO, HELO 커맨드가 없다면, 이 메소드는 ESMTP의 EHLO를 먼저 시도한다.

      • TLS : TCP/IP와 같은 통신에서 사용하는 암호규약
      • STARTTLS : 텍스트에 대한 암호화를 업그레이드 하고 확장한 버전이다.

email 패키지

  • email 패키지는 MIME 표준에 따라 인코딩된 이메일 메세지를 파싱하거나 조작하는데 사용할수 있는 다양한 함수와 객체를 제공한다. 많기 때문에 먼저 텍스트 보내는 것만 정리한다.

  • MIMEText( data, subtype, charset ) : email.mime.text에 정의, 텍스트 데이터를 담는 메세지를 생성한다.

    data : 메세지 페이로드를 담는 문자열이다.

    subtype : 'plain' (기본값) 또는 'html'와 같이 텍스트 타입을 나타내는 문자열이다.

    charset : 문자 집합으로 기본값은 'us-ascii'이며 내용에 따라 메세지를 인코딩할수 있다.

  • as_string ( unixfrom ) : 전체 메세지를 문자열로 변환한다. unixfrom은 불리언 플래그이며 True로 설정되면 유닉스 스타일의 'From ...' 줄이 첫번째 줄이 된다. 기본적으로는 False 이다.

# -*- coding:utf-8 -*-

# import smtplib for the actual sending function
import smtplib

# import the email modules we'll need
from email.mime.text import MIMEText
from email import Utils

# 한글 작업 하고 싶다면 반드시 유니코드를 쓰자!!!
textfile = "shorttext.txt"
textfile = u"안녕하세요.txt"

# 보낼 텍스트 문서 생성 및 읽기
testfile = open(textfile,'w')
testfile.write('안녕하세요~')
testfile.close()
fp = open(textfile, 'rb')

# 텍스트 메세지 생성
msg = MIMEText(fp.read(), "html", _charset="utf-8")

fp.close()

# From == 보내는사람, To == 받는 사람
# Subject == 메일 제목
# 구글이메일의 경우 subject를 한글로 해도 깨지지는 않지만 내용은 utf-8로 하면 깨지므로 따로 처리한다.

me = '보내는 사람 @ 이메일 주소'
you = '받는 사람 @ 이메일 주소'

msg['Subject'] = "안녕하세요3"
msg['From'] = me
msg['To'] = you

# 구글이메일이 아닌 사설 SMTP의 경우에는 Date 정보도 들어가야 한다. 
# date.now()로 하면 UTC 타임 전송되므로 다르게 시간을 구한다.
msg['Date'] = Utils.formatdate(localtime=1)

# Send the message SMTP server (로컬 SMTP 서버가 있을 경우) 테스트 안 했으니 참고만.
# s = smtplib.SMTP('192.168.1.42')
# s.sendmail(me, you, msg.as_string())
# s.quit()

# 로컬 SMTP 서버가 없을 경우 ( Gmail 의 경우 ), starttls를 
s = smtplib.SMTP('smtp.gmail.com', 587)
s.ehlo()
s.starttls()
s.ehlo()

s.login("username@gmail.com","password")
s.sendmail(me, you, msg.as_string())
s.quit()

안 될 경우

/* 참고 출처 */ 
https://docs.python.org/2/library/smtplib.html?highlight=starttls#smtplib.SMTP.starttls
http://blog.saltfactory.net/python/send-mail-via-smtp-and-python.html
http://yujeong0801.tistory.com/14
파이썬 완벽가이드


Comments