본문 바로가기

개발새발/Python

[Python] Telegram 메일 알람 챗봇 만들기 (1) : 네이버 메일 연동해서 제목, 내용 가져오기.

회사 동료분들과의 내기 덕분에 드디어 쓰는 메일 알람 챗봇 개발기.

2달 전 개발했던 코드라 잘 기억은 안 나지만 코드를 더듬어 보면서 다시 개발하는 기분을 느껴봅시다.

 

imaplib 을 이용해서 메일 알람 봇을 만들었다.

개발기는 2편으로 나누어 쓸 예정. (파일이 두 개이기 때문에.)

 

import부터 차례로 따라오면  쉽게 챗봇을 만들 수 있다.

1편에서는 메일 내용 가져오기에 대한 내용을 주로 다루고

2편에서는 챗봇 설정에 대한 내용을 주로 다룰 예정이다.

 

전체 소스코드는 아래 링크를 참고하길 바랍니다.

https://github.com/Junnis0123/ChatBot

[import]

import imaplib
import email
from time import sleep
from email.header import decode_header
import base64

import목록.

imaplib, email을 쓴다. 타임 슬립 같은 경우에는 타이머를 돌아 주기적으로 메일을 체크하기 위함이다.

 

그리고 필요한 변수들을 미리 선언해주자.

[변수]

#MAIL SERVER SETTING
Server = ''
Port = 993

#FROM INFO
fromName = ''
fromMail = '{}{}{}'.format('(UNSEEN from ', fromName, ')')

#MAILINFO
latest = ''

메일 서버 연결을 위한 서버, 포트번호.(네이버 메일을 연동했기 때문에 포트번호는 993)

받는사람 필터를 걸고 싶어서 받는사람에 대한 정보를 저장했는데 필요없다면 생략해도 좋다.

최신 메일 변화를 체크하기 위해 최신 메일 아이디를 저장할 변수를 지정했다.

 

이제 함수를 만들어보자.

[함수]

def change_from_name(name):
global fromName
fromName = name
global fromMail
fromMail = '{}{}{}'.format('(UNSEEN from ', fromName, ')')

받는 사람 이름을 변경할 때 호출함 함수다. 받는 사람 이름을 global로 선언해서 전역으로 변경되도록 했다.

왜냐하면 메인 파일을 따로 만들었기 때문이지. 한 파일로 할 거면 그냥 생략해도 좋다.

def get_name():
return fromName

같은 맥락으로 받는 사람 이름에 대한 게터도 만들어주었다.

 

def ConnectMailSvr():
print('Connect To ' + UserId + "...")
mail = imaplib.IMAP4_SSL(Server, Port)
mail.login(UserId, Password)
mail.select("inbox")
print('Connect!')
_, unseen_data = mail.search(None, fromMail)

email_ids = unseen_data[0].split()

if len(email_ids) == 0:
mail.close()
return 0, 0

latest_id = email_ids[-1:][0]
global latest

if latest_id == latest:
mail.close()
return 0, 0

if latest == '': #first
latest = email_ids[0]
eachIdsList = email_ids[ email_ids.index(latest) : email_ids.index(latest_id) + 1 ]
else:
eachIdsList = email_ids[ email_ids.index(latest) + 1 : email_ids.index(latest_id) + 1 ]
latest = latest_id

result = str(len(email_ids))
print('unseen mail is {}, new unseen mail is {}.'.format(result, len(eachIdsList)))


mails = []
for e_id in eachIdsList:
_, data = mail.fetch(e_id, '(RFC822)')
mails.append(GetContents(data))


mail.close()
print('DisConnect!')
return result, mails

메일 서버에 연결하는 함수.IMAP4_SSL을 사용해서 메일 서버에 연결하고, 네이버 메일 서버에서 가져와서 사용했다.

(네이버 메일 키는 네이버에서 외부 메일 연동 기능을 설정하면 사용 가능하다.)

 

나는 최신 메일을 체크해서 최신 메일이 바뀌었을 때 다른 내용을 출력했기 때문에 코드에 해당 비교문이 있지만,

굳이 그런 처리가 필요없다면 제외해도 된다.

 

def GetContents(data):
raw_email = data[0][1]

raw_email_string = raw_email.decode('utf-8')
email_message = email.message_from_string(raw_email_string)

print (email.utils.parseaddr(email_message['From'])[1])
subject = email_message['Subject']

if len(subject) != 0:
subject, encoding = decode_header(subject)[0]
subject = subject.decode(encoding)
else:
subject = '()'

print(subject)

# Contents
while email_message.is_multipart():
email_message = email_message.get_payload(0)

content = email_message.get_payload()
content = base64.b64decode(content).decode()
print(content)
return subject, content

메일의 제목, 내용을 디코딩해서 뽑아내는 함수다.

네이버 메일이 자체적으로 base64 인코딩 된 상태로 넘어오기 때문에 사용하려면 뜯어내야한다.

 

다음편에서는 실제 텔레그램 봇의 행동을 제어하는 코드를 올려보겠습니다.

그럼 다음 편에서 만나요.