[Python]mail(gmail) 다루기

Posted by Albert 769Day 23Hour 50Min 43Sec ago [2023-03-12]

라이브러리설치

(myenv) PS D:\pythonProject\RPA> pip install imap-tools

gmail 을 python으로 다루는 내용으로 우선 gmail 2중인증단계설정 및 앱 비밀번호 설정을 하여야 한다.

chrome상 gmail계정으로 로그인후 Account 항목으로 접속=> 보안=> 2단계 인증 활성화 및 앱비밀번호 생성한다.



1. gmail 계정정보 설정 (account.py)

EMAIL_ADDRESS = "yougmailAccount@gmail.com" ' 주소
EMAIL_PASSWORD = "your app password" ' 앱 비밀번호


2. 간단한 메일보내기1

import smtplib
from account import *

with smtplib.SMTP("smtp.gmail.com", 587) as smtp:
smtp.ehlo() ' 연결이 잘 수립되는지 확인
smtp.starttls() ' 모든 내용이 암호화되어 전송
smtp.login(EMAIL_ADDRESS, EMAIL_PASSWORD) ' 로그인

subject = "test mail" ' 메일 제목
body = "mail body" ' 메일 본문

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

' 발신자, 수신자, 정해진 형식의 메시지
smtp.sendmail(EMAIL_ADDRESS, "target@gmail.com", msg)


3. 간단한 메일보내기2

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

msg = EmailMessage()
msg["Subject"] = "테스트 메일입니다" ' 제목
msg["From"] = EMAIL_ADDRESS ' 보내는 사람
msg["To"] = "visionboy@nate.com" ' 받는 사람

' 여러 명에게 메일을 보낼 때
'msg["To"] = "nadocoding@gmail.com, nadocoding@gmail.com"
'to_list = ["nadocoding@gmail.com", "nadocoding@gmail.com"]
'msg["To"] = ", ".join(to_list)

' ' 참조
' msg["Cc"] = "nadocoding@gmail.com"

' ' 비밀참조
' msg["Bcc"] = "nadocoding@gmail.com"

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

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


4. 파일첨부하여 메일보내기

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

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

'MIME Type
'msg.add_attachment()
with open("btn_brush.png", "rb") as f:
msg.add_attachment(f.read(), maintype="image", subtype="png", filename=f.name)

with open("테스트.pdf", "rb") as f:
msg.add_attachment(f.read(), maintype="application", subtype="pdf", filename=f.name)

with open("엑셀.xlsx", "rb") as f:
msg.add_attachment(f.read(), maintype="application", subtype="octet-stream", filename=f.name)

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


5. 받은 메일리스트 출력

from imap_tools import MailBox
from account import *

mailbox = MailBox("imap.gmail.com", 993)
mailbox.login(EMAIL_ADDRESS, EMAIL_PASSWORD, initial_folder="INBOX")

' limit : 최대 메일 갯수
' reverse : True 일 경우 최근 메일부터, False 일 경우 과거 메일부터
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)
print("본문", msg.text)
print("HTML 메시지", msg.html)
print("=" * 100)

' 첨부 파일
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)
print("첨부 파일 {} 다운로드 완료".format(att.filename))

mailbox.logout()


6. 받은메일 필터링 하여 출력

from imap_tools import MailBox
from account import *

' mailbox = MailBox("imap.gmail.com", 993)
' mailbox.login(EMAIL_ADDRESS, EMAIL_PASSWORD, initial_folder="INBOX")
' mailbox.logout()

with MailBox("imap.gmail.com", 993).login(EMAIL_ADDRESS, EMAIL_PASSWORD, initial_folder="INBOX") as mailbox:
' 전체 메일 다 가져오기
' for msg in mailbox.fetch():
' print("[{}] {}".format(msg.from_, msg.subject))

' 읽지 않은 메일 가져오기
' for msg in mailbox.fetch('(UNSEEN)'):
' print("[{}] {}".format(msg.from_, msg.subject))

' 특정인이 보낸 메일 가져오기
' for msg in mailbox.fetch('(FROM nadocoding@gmail.com)', limit=3, reverse=True):
' print("[{}] {}".format(msg.from_, msg.subject))

' 작은 따옴표로 먼저 감싸고, 실제 TEXT 부분은 큰 따옴표로 감싸주세요
' 어떤 글자를 포함하는 메일 (제목, 본문)
' for msg in mailbox.fetch('(TEXT "test mail")'):
' print("[{}] {}".format(msg.from_, msg.subject))

' 어떤 글자를 포함하는 메일 (제목만)
'for msg in mailbox.fetch('(SUBJECT "test mail")'):
' print("[{}] {}".format(msg.from_, msg.subject))

' 어떤 글자(한글)을 포함하는 메일 필터링 (제목만)
for msg in mailbox.fetch(limit=5, reverse=True):
if "보안" in msg.subject:
print("[{}] {}".format(msg.from_, msg.subject))

' 특정 날짜 이후의 메일
' for msg in mailbox.fetch('(SENTSINCE 07-Nov-2020)', reverse=True, limit=5):
' print("[{}] {}".format(msg.from_, msg.subject))

' 특정 날짜에 온 메일
' for msg in mailbox.fetch('(ON 07-Nov-2020)', reverse=True, limit=5):
' print("[{}] {}".format(msg.from_, msg.subject))

' 2가지 이상의 조건을 모두 만족하는 메일 (그리고 조건)
' for msg in mailbox.fetch('(ON 07-Nov-2020 SUBJECT "test mail")', reverse=True, limit=5):
' print("[{}] {}".format(msg.from_, msg.subject))

' 2가지 이상의 조건 중 하나라도 만족하는 메일 (또는 조건)
' for msg in mailbox.fetch('(OR ON 07-Nov-2020 SUBJECT "test mail")', reverse=True, limit=5):
' print("[{}] {}".format(msg.from_, msg.subject))


소스다운로드


원글: https://www.youtube.com/watch?v=exgO1LFl9x8





LIST

Copyright © 2014 visionboy.me All Right Reserved.