내가 한 노력들

[ python ] email 자동화 본문

IT 공부/python

[ python ] email 자동화

JONGI-N CHOI 2020. 12. 26. 00:01

우선 email 관련 기능을 사용하기 위해서 smtplib 라이브러리를 사용해야 한다. 

import smtplib

그리고 한가지더 작업해줘야 하는 것이 있다. 

 

account.py 파일

EMAIL_ADDRESS = "ID@gmail.com"
EMAIL_PASSWORD = "PASSWORD"

따로 account.py 파일을 만들어서 그 안에 email주소, email password를 설정해야 한다. 

 

from account import *

그리고 위에 account.py 파일을 사용하기위해서 import한다. 

email password

email password를 설정하기 위해서는 우선 구글 계정관리에서 2단계 인증을 사용해야한다. 

그리고 바로 아래있는 앱 비밀번호를 설정해주면 16글자의 앱 비밀번호를 받을 수 있다. 이것은 현재 기기에만 적용되는 앱 비밀번호이기 때문에 다른 기기에서는 사용불가능하다.


email 전송

with smtplib.SMTP("smtp.gmail.com", 587) as smtp:  # 포트번호 587
    smtp.ehlo()  # smtp서버에 연결이 잘 수행되는지 확인
    smtp.starttls()  # 전송하는 모든 내용이 암호화
    smtp.login(EMAIL_ADDRESS, EMAIL_PASSWORD)  # 로그인

    subject = "text mail"  # 메일 제목
    body = "mail body"  # 메일 본문

    msg = f"Subject: {subject}\n{body}"  # 메일 보낼 때에 정해진 틀이다 이건 정해진 것

    # 발신자, 수신자, 정해진 형식의 메세지
    smtp.sendmail(EMAIL_ADDRESS, "chlwhddls1224@gamil.com", msg)

SMTP(Simple Mail Transfer Protocol)

인터넷 상의 유효한 이메일 아이디로

이메일을 보내는 데 사용되는 클라이언트입니다

smtplib.SMTP("smtp.gmail.com", 587)

 

 

세션을 만들기 위해 SMTP 인스턴스를 이용하여 SMTP 연결을 캡슐화합니다.

첫번째 매개변수는 지메일을 사용하기 위한 SMTP 변수이며,

두번째 매개변수는 포트번호를 입력합니다. 지메일의 경우 포트번호 587을 사용합니다

 

smtp서버에 연결이 잘 수행되는지 확인

smtp.ehlo()

전송하는 모든 내용이 암호화

smtp.starttls()

지메일은 보안상의 이유로 SMTP연결을 TLS(전송 계층 보안) 모드로 설정

로그인

smtp.login(EMAIL_ADDRESS, EMAIL_PASSWORD)

email 제목 입력

subject = "text mail"

email 본문 입력

body = "mail body"

제목과 본문을 형식에 맞게 입력

msg = f"Subject: {subject}\n{body}"

sendmail()

smtp.sendmail(EMAIL_ADDRESS, "chlwhddls1224@gamil.com", msg)

sendmail(발신자, 수신자, 정해진 형식의 메세지)의 형식으로 메일을 보낸다.


위에서 email을 보낸 방법으로는 한글은 보낼 수 없고 정해진 형식대로 해야하기 때문에 불편하다.

따라서, 좀 더 쉽고 한글로도 보낼 수 있는 방법이있다.

import smtplib
from account import *
from email.message import EmailMessage

EmailMessage라는 라이브러리를 사용하는 것이다. 

 

객체생성

msg = EmailMessage() 

제목

msg["Subject"] = "테스트 메일입니다."

본문

msg.set_content("테스트 본문입니다.")

보내는 사람

msg["From"] = EMAIL_ADDRESS

받는 사람

msg["To"] = "chlwhddls1224@gamil.com"

SMTP()

with smtplib.SMTP("smtp.gmail.com", 587) as smtp:
    smtp.ehlo()
    smtp.starttls()
    smtp.login(EMAIL_ADDRESS, EMAIL_PASSWORD)
    smtp.send_message(msg)

ehlo(), starttls(), login()까지는 위에 방법과 동일하다. 하지만 이메일을 보내는 방법에서 sendmail()이 아닌, 

send_message()를 사용한다

send_message()

smtp.send_message(msg)

위에서 생성한 인스턴스 msg를 매개로 넣어주면 좀 더 간단하고 한글로도 보낼 수 있게 된다. 

 

여러명에게 메일을 보낼 경우

msg["To"] = "chlwhddls1224@gmail.com, chlwhddls1224@gmail.com"

", "를 구분해서 여러개의 email 주소를 적어주면 된다.

 

list를 이용해서 여러명에게 메일을 보내고 싶을 때

to_list = ["chlwhddls1224@gmail.com", "두번째 메일", "세번째 메일"]
msg["To"] = ", ".join(to_list)

list형태의 이메일들을 join()을 이용해주면, 위에와 똑같은 형태로 바뀌기 때문에 여러명에게 보낼 수 있다.

참조

msg["Cc"] = "chlwhddls1224@gmail.com"

비밀참조

msg["Bcc"] = "chlwhddls1224@gmail.com"

 

 


첨부파일을 첨부하는 법

우선 위에와 동일하게 코딩을 짠다.

import smtplib
from account import *
from email.message import EmailMessage

msg = EmailMessage()  # 객체 생성
msg["Subject"] = "테스트 메일입니다."  # 제목
msg["From"] = EMAIL_ADDRESS  # 보내는 사람
msg["To"] = "chlwhddls1224@gmail.com"  # 받는 사람
msg.set_content("다운로드 하세요")

add_attachment()

with open("김사원세끼.txt", "rb") as f:
    msg.add_attachment(f.read(), maintype="text",
                       subtype="plain", filename=f.name)

생성한 instance인 msg에  add_attachment()를 사용하는 것으로 첨부파일도 같이 이메일을 통해 보낼 수 있다. 

f.read()

우선 f.read()를 통해서 내용을 모두 읽어오는 작업이다.

 

mime type(maintype, subtype)

mime type관련 사이트

developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types

 

인터넷 공간에 글을 올릴 때, type에 따라 등록하는 방식이 따로있다.

웹에서 사용할려는 컨텐츠의 type이 어떤 것인지 알려주는 것

 

따라서 지금 첨부파일을 보내는 것에 type에 따라서 mime type 규격에 맞춰서 적어줘야한다. 

 

지금 보내는 "김사원세끼.txt"라는 파일은 txt파일이기 때문에 그거에 맞는 규격을 찾는다. 

 

위에 사이트에서 찾아보면 

  • text/plain는 텍스트 파일을 위한 기본값입니다. 텍스트 파일은 인간이 읽을 수 있어야 하며 이진 데이터를 포함해서는 안됩니다.

이렇게 설명이 나와있으므로 

maintype

maintype="text"

subtype

subtype="plain"

이렇게 maintype, subtype을 설정해주면 된다. 

filename

filename=f.name

filename은 위에 with를 통해서 만들어놓은 f instance에서 name을 사용해서 적용 

 

마지막으로 메일보내기

with smtplib.SMTP("smtp.gmail.com", 587) as smtp:
    smtp.ehlo()
    smtp.starttls()
    smtp.login(EMAIL_ADDRESS, EMAIL_PASSWORD)
    smtp.send_message(msg)

위에 방법대로 하게 되면, 메일과 함께 첨부파일도 보낼 수 있게된다. 


메일 받기

메일을 받기 위해서는 우선 라이브러리 설치를 해야한다. 

pip install imap_tools

설치한 라이브러리와 account 정보가 담긴 파일 불러오기

from imap_tools import MailBox
from account import *

객채생성

mailbox = MailBox("imap.gmail.com", 993)

로그인

mailbox.login(EMAIL_ADDRESS, EMAIL_PASSWORD, initial_folder="INBOX")

initial_folder="INBOX"는 받은 편지함을 의미한다. 

fetch()

for msg in mailbox.fetch(limit=1, reverse=True):
    print("제목", msg.subject)
    print("발신자", msg.from_)
    print("수신자", msg.to)
    # print("참조자", msg.cc)
    # print("비밀참조자", msg.bcc)
    print("날짜", msg.date)  # GMT-8 로스엔젤러스 시간기준으로 나온다.
    print("본문", msg.text)
    print("HTML 메세지", msg.html)
    print("=" * 30)

fetch()는 모든 메일을 다 불러온다. 

limit 는 최대 갯수를 제한할 수 있다. 

reverse는 최신메일부터 받아올지, 오래된 순으로 받아올지 정할 수 있다. 

reverse = True일 경우에는, 최신순

reverse = False일 경우에는, 오래된순

 

subject

print("제목", msg.subject)

제목을 가져온다. 

from

print("발신자", msg.from_)   

발신자를 가져온다

to

print("수신자", msg.to)

수신자를 가져온다

cc

print("참조자", msg.cc)

참조자를 가져온다

bcc

print("비밀참조자", msg.bcc)

비밀참조자를 가져온다

date

print("날짜", msg.date)

날짜를 가져온다.

text

print("본문", msg.text)

본문내용을 가져온다

html 

print("HTML 메세지", msg.html)

html태그를 가져온다.

attachment

    for att in msg.attachments:
        print("첨부파일 이름", att.filename)
        print("첨부파일 타입", att.content_type)
        print("첨부파일 크기", att.size)

        # 파일 다운로드
        with open("download_"+att.filename, "wb") as f:
            f.write(att.payload)  # payload 파일에다가 첨부파일을 쓰는 것
            print("첨부파일 {} 다운로드 완료".format(att.filename))

attachment는 첨부파일을 모두 가져온다. 

filename

print("첨부파일 이름", att.filename)

첨부파일 이름을 가져온다

content_type

print("첨부파일 타입", att.content_type)

첨부파일 타입을 가져온다

size

print("첨부파일 크기", att.size)

첨부파일의 크기를 가져온다.

첨부파일 다운로드 

with open("download_"+att.filename, "wb") as f:
            f.write(att.payload)  # payload 파일에다가 첨부파일을 쓰는 것
            print("첨부파일 {} 다운로드 완료".format(att.filename))

파일을 만들기위해서 with와 wirte를 이용한다. 

payload

f.write(att.payload)

payload는 파일에다가 첨부파일를 옮긴다. 

logout()

mailbox.logout()

다사용하고 난 뒤에는 logout 해준다.

 


 

 

 

 

 

 

<참고자료 youtube - 나도코딩>

www.youtube.com/watch?v=exgO1LFl9x8&t=30182s&ab_channel=%EB%82%98%EB%8F%84%EC%BD%94%EB%94%A9

 

'IT 공부 > python' 카테고리의 다른 글

[ python ] django로 웹만들기  (0) 2021.01.01
[ python ] 자동 이메일 프로젝트  (0) 2020.12.26
[ python ] Web Scraping 총정리  (1) 2020.12.14
[ python ] 화면 스크린샷  (0) 2020.12.13
[ python ] Tkinter project  (0) 2020.12.11