본문 바로가기

여기저기 쓰이는 짧은 실용함수/파이썬

[파이썬] 메일 읽기

파이썬을 이용해 메일을 읽기 위해서 우선 IMAP 액세스 설정이 필요합니다.

Gmail을 활용할 것이기 때문에 google 계정을 준비해주세요.

계정이 준비되었다면 아래 과정을 따라하시면 됩니다.

 

 

 

코드를 작성하기에 앞서 파이썬으로 메일을 읽으려면 먼저 해둬야 하는 작업이 있습니다.

바로 16자리 앱 비밀번호 발급 받기 입니다.


1.    구글 계정 보안설정에 접속합니다

https://myaccount.google.com/security

 

Google 계정

보안 계정을 안전하게 보호하기 위해 보안 설정을 검토 및 조정하고 권장사항을 받아보려면 계정에 로그인하세요.

myaccount.google.com


 

2. 앱 비밀번호 클릭

 

 


3. 빨간 박스를 메일, Windows 컴퓨터로 세팅하고 생성 클릭


 

앱비밀번호를 발급받았다면 다음으로 IMAP 액세스 설정을 해주세요 아래 과정을 따라가시면 됩니다.

 

 

 

 

 

 

아래 사진과 같다면 성공입니다.

 

 


아래 코드의 USER와 PASSWORD를 여러분의 구글 메일과 앱 비밀번호로 교체해주세요.

import imaplib
import email

#get_key_from_mail과 세트입니다. 메일을 읽들 때 사용됩니다.
def findEncodingInfo(txt):    
    info = email.header.decode_header(txt)
    s, encoding = info[0]
    return s, encoding

#USER와 PASSWORD를 여러분의 정보로 바꿔주세요
def get_key_from_mail():
    global api_key
    sendto = '당신의메일@gmail.com'
    user = '당신의메일@gmail.com'
    password = "16자리 앱 비밀번호"

    # 메일서버 로그인
    imapsrv = "smtp.gmail.com"
    #아래행 imap = imaplib.IMAP4_SSL('imap.gmail.com')에서 수정
    imap = imaplib.IMAP4_SSL(imapsrv, "993")
    id = user
    pw = password
    imap.login(id, pw)
     
    # 받은 편지함
    imap.select('inbox')
     
    # 받은 편지함 모든 메일 검색
    resp, data = imap.uid('search', None, 'All')
     
    # 여러 메일 읽기 (반복)
    all_email = data[0].split()
    all_email.reverse()
    #del(all_email[0])
    for mail in all_email:
     
        #fetch 명령을 통해서 메일 가져오기 (RFC822 Protocol)
        result, data = imap.uid('fetch', mail, '(RFC822)')
     
        #사람이 읽기 힘든 Raw 메세지 (byte)
        raw_email = data[0][1]
     
        #메시지 처리(email 모듈 활용)    
        email_message = email.message_from_bytes(raw_email)
     
        #이메일 정보 keys
        #print(email_message.keys())
        print('FROM:', email_message['From'])
        print('SENDER:', email_message['Sender'])
        print('TO:', email_message['To'])
        print('DATE:', email_message['Date'])
     
        b, encode = findEncodingInfo(email_message['Subject'])
        #제목
        print('SUBJECT:', str(b, encode))
        subject = str(b, encode)
        if subject != 'riotapikey':
            #print(subject)
            return 0
        text = ''
        #이메일 본문 내용 확인
        print('[CONTENT]')
        print('='*80)
        if email_message.is_multipart():
            for part in email_message.get_payload():
                bytes = part.get_payload(decode = True)    
                encode = part.get_content_charset()        
                print(str(bytes, encode))
                text=str(bytes, encode)
                break
        print('='*80)
        break
     
    imap.close()
    imap.logout()