반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

2022.03.11 - [파이썬 패키지/라이브러리&패키지 소개] - 파이썬 주요 라이브러리 정리


업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

오늘은 파이썬으로 여러명에게 첨부파일이 포함된 메일을 보내는 방법에 대해 공부해보겠습니다.

 

<파이썬으로 이메일 보내기 관련 글>

2022.03.23 - [파이썬 패키지/이메일] - [python/smtplib] 파이썬으로 구글 Gmail 보내기 2편. smtplib와 email 모듈

2022.06.01 - [파이썬 패키지/이메일] - [python/imaplib] 파이썬으로 구글 Gmail 읽기

 

1. 구글 메일 자동화를 위한 설정

2022.03.17 - [파이썬 패키지/이메일] - [python/smtplib] 파이썬으로 구글 Gmail 보내기 1편. SMTP의 개념과 구글 앱 비밀번호 발급받기

 

2. 네이버 메일 자동화를 위한 설정

2022.06.15 - [파이썬 패키지/이메일] - [#shorts] 파이썬으로 네이버 메일 보내기 위한 초간단 설정

 


 

이전 시간까지는 정말 단순하게 단 한명에게 메일 제목과 내용만 포함하여 메일을 보내는 것을 해보았습니다. 

 

 

오늘 배워볼 내용은 한번에 여러명에게, 첨부파일을 포함시켜서 메일을 보내는 방법입니다.

 

1. 관련 모듈, 클래스 불러오기

 

우선 오늘 새로 등장하는 모듈과 클래스들이 많으므로 쉬운 이해를 위해서 기능에 따라 배치해보았습니다.

 

그림을 기준으로 소개드리자면,

 

MIMEBase:

첨부파일이 포함된 메일은 멀티파트(Multipart)로 구성되어 있으며, MIMEBase가 기본 포맷의 역할을 합니다. 즉, MIMEBase라는 종이 위에 텍스트도 넣고, 첨부파일도 넣는 느낌인 것입니다.

 

Header:

Header는 사람의 문장을 컴퓨터가 이해할 수 있는 문장으로 변환해줄 때 사용하는 모듈로 전반적으로 사용합니다.

 

MIMEText:

지난 시간에도 사용했던 MIMEText 클래스는 '본문 메세지'를 작성할 때 사용합니다.

 

MIMEApplication:

MIMEApplication 클래스는 파일을 첨부해줄 때 사용합니다. 

 

 

2. 전체 코드

 

위의 개념도만 대략 이해하시면, 그 외의 부분은 주석을 읽어보시면서 따라해보시면 되리하 생각합니다.

(더 친절하지 못해 죄송합니다..ㅜㅜ)

#step1.관련 모듈, 클래스 불러오기
import os
import smtplib
from email.header import Header
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication


#step2.SMTP 서버를 dictionary로 정의
smtp_info = {
    'gmail.com': ('smtp.gamil.com', 587),
    'naver.com': ('smtp.naver.com', 587),
    'outlook.com': ('smtp-mail.outlook.com', 587),
    'hotmail.com': ('smtp-mail.outlook.com', 587),
    'yahoo.com': ('smtp.mail.yahoo.com', 587),
    'nate.com': ('smtp.mail.nate.com', 465),
    'daum.net': ('smtp.daum.net', 465),
    'hanmail.net': ('smtp.daum.net',465)
}

#step3.메일 보내는 함수 정의 (발신 메일, 수신 메일(여러개 가능), 제목, 본문, 첨부파일 경로, 비밀번호)
def send_email(From, To, subject, message, attach_files=(), passwd='', subtype='plain'):
    
    
    #step4.멀티파트로 메일을 만들기 위한 포맷 생성
    form = MIMEBase('multipart', 'mixed')
    
    #step5.입력받은 메일주소와 제목, 본문 등의 문자열을 인코딩해서 form에 입력
    form['From'] = From
    form['To'] = ', '.join(To) #수신 메일 리스트를 문자열로 변환 (,와 한칸 공백을 추가해서 구분)
    form['Subject'] = Header(subject.encode('utf-8'), 'utf-8')
    msg = MIMEText(message.encode('utf-8'), _subtype=subtype, _charset='utf-8')
    form.attach(msg)
    
    #step6.여러개의 파일을 하나씩 첨부
    for fpath in attach_files:
        
        folder, file = os.path.split(fpath) # 파일의 절대 경로를 입력하면, 두 가지 문자열을 나눠서 반환
                                            # (ex./home/User/Desktop/file.txt --> (/home/User/Desktop/, file.txt)
        
        with open(fpath, 'rb') as f: # 첨부 파일을 열어서 내용을 가져옴
            body = f.read()
        
        msg = MIMEApplication(body, _subtype=subtype)
        
        msg.add_header('Content-Disposition', 'attatchment',
                        filename=(Header(file, 'utf-8').encode()))
        form.attach(msg)
        
    #step7.SMTP 서버 로그인 및 작성된 메일 보내기
    id, host = From.rsplit("@",1) #발신인 메일 주소의 @를 기준으로 id와 host로 나눔
    
    smtp_server, port = smtp_info[host] #step2의 dict를 이용해서 host와 port 정보들을 받아옴
    
    # SMTP 서버 접속 여부 확인
    if port == 587:
        smtp = smtplib.SMTP(smtp_server, port)
        rcode1, _ = smtp.ehlo()
        rcode2, _ = smtp.starttls()
    
    else:
        smtp = smtplib.SMTP_SSL(smtp_server, port)
        rcode1, _ = smtp.ehlo()
        rcode2 = 220 
        
    if rcode1 != 250 or rcode2 != 220:
        smtp.quit()
        return '연결에 실패하였습니다.'
    
    smtp.login(From, passwd)
    smtp.sendmail(From, To, form.as_string())    
    smtp.quit
    

#step8.실제 함수 실행 부분
me = 'continent9@naver.com'
receivers = ['codingswson@gmail.com','sonsangwoo91@gmail.com']

subject = '파이썬으로 메일 보내기 테스트'
message = """
안녕하세요, 코딩유치원에서 제작한 '메일 전송 봇'입니다.

첨부드리는 파일 참고 부탁드립니다.

감사합니다.
"""

attatch_files = ['5.png', 'test_excel.xlsx','Excel_sum.py','text파일.txt']
send_email(me, receivers, subject, message, attatch_files, passwd='네이버 로그인 비밀번호')

 

글을 마치며, 제가 네이버 메일로 발신했을 땐 정상작동 하는 코드가, 이상하게도 구글 메일로 발신하려고 하면 에러가 납니다. 당연히 구글 비밀번호를 '앱 비밀번호'로 하였는데도 말이죠.

 

혹시 여러분들은 되신다면 댓글을 달아주시면 감사하겠습니다!

 

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

2022.03.11 - [파이썬 패키지/라이브러리&패키지 소개] - 파이썬 주요 라이브러리 정리


업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 


 

파이썬 코드를 이용해서 네이버 메일을 발신/수신하기 위해서는 아래의 설정이 반드시 선행되어야합니다.

 

해당 설정을 하지 않으시고 파이썬 코드를 실행하시면 아래와 같은 오류가 출력된답니다.

 

SMTPAuthenticationError: (535, b'5.7.1 Username and Password not accepted wIKXs+XGQSmZsM0dOtS9cA - nsmtp')

 

그럼 지금부터 함께 설정을 해보겠습니다.

 

설정 방법

 

step1. 사용하고자 하시는 네이버 메일에 로그인 하신 후, 화면 왼쪽에 위치한 '외부메일 가져오기' 탭 오른쪽에 위치한 톱니바퀴 아이콘을 클릭해주세요.

 

 

step2. 화면이 전환되었다면 아마 '외부 메일 가져오기' 탭이 클릭된 상태일 거예요. 'POP3/IMAP 설정' 탭을 클릭하신 후, 아래 그림과 같이 사용함을 클릭해주세요.

 

 

정말 간단하죠?

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

2022.03.11 - [파이썬 패키지/라이브러리&패키지 소개] - 파이썬 주요 라이브러리 정리


업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

지난 시간에 파이썬 코드를 이용해서 Gmail에 메일을 보내는 방법에 대해서 공부해 보았다면, 이번 시간에는 받은 메일을 읽는 방법을 공부해보겠습니다.

 

이번 시간 역시 Gmail을 파이썬으로 사용하기 위해서는 '앱 비밀번호'가 필요합니다.

 

만약 구글에서 '2단계 인증'과 '앱 비밀번호' 설정을 함께 진행하지 않으셨다면 지난 글을 보시고 설정을 마치신 후에 이번 강의를 따라와 주세요!

 

2022.03.17 - [파이썬 패키지/이메일] - [python/smtplib] 파이썬으로 구글 Gmail 보내기 1편. SMTP의 개념과 구글 앱 비밀번호 발급받기

 

 


1.  imaplib 모듈 불러오기

 

가장 먼저 해줄 일은 imaplib 모듈을 import 해주는 것입니다. imaplib 역시 smtplib 모듈과 같이 파이썬 내장 라이브러리에 포함된 모듈로 별도의 설치가 필요 없답니다.

import imaplib

 

2.  imap 객체 생성

 

다음으로는 Gmail 메일의 imap 서버의 url 정보를 입력하고 server라는 이름의 변수에 담아줍니다.

imap = imaplib.IMAP4_SSL('imap.gmail.com')

 

3.  imap 서버에 로그인

 

이제 메일 정보를 입력해줍시다. 여기서 지난 시간에 발급받은 "앱 비밀번호"가 필요해요. 만약 error: b'[ALERT] Application-specific password required 라는 오류가 출력된다면 그건 평소 사용하시던 비밀번호를 입력하셨기 때문일거예요.

# imap.login('메일 주소', '비밀번호')
imap.login('xxxxx@gmail.com', '지난 시간 받았던 16자리 앱 비밀번호')

 

4.  사서함 선택

 

전체편지함을 선택하기 위해서는 아래의 코드가 필요합니다. 사서함을 선택하는 코드라고 하는데, 만약 사서함을 여러개로 분류해서 사용한다면 해당 사서함의 이름을 'INBOX' 대신 입력하면 되지 않을까 생각됩니다. (실제로 해보진 않았답니다!) 

# 사서함 선택, 반환 데이터는 mailbox에 있는 메시지 수
imap.select("INBOX")

 

5.  이메일 선택

 

사서함에서 가장 최신에 받은 메일을 참조하기 위해서는 아래와 같은 코드를 실행해줍니다. 이때 uid라는 함수를 사용해서 각 메일에 고유의 번호를 부여해서 인덱싱 할 수 있습니다. 세부적으로 코드가 어떻게 작동하는지 알고 싶으신 분들은 코드를 한줄 한줄 실행하면서 print( ) 함수로 출력해 보시는 걸 추천드립니다.

# 사서함의 모든 메일의 uid 정보 가져오기
# 만약 특정 발신 메일만 선택하고 싶다면 'ALL' 대신에 '(FROM "xxxxx@naver.com")' 입력
status, messages = imap.uid('search', None, 'ALL')

messages = messages[0].split()

# 0이 가장 마지막 메일, -1이 가장 최신 메일
recent_email = messages[-1]

 

저는 저의 네이버 메일을 이용해서 아래와 같이 '코딩유치원 화이팅!'이라는 제목으로 메일을 보냈고, 이 메일이 최신 메일인 상태입니다.

 

6.  선택한 메일의 내용 가져오기

 

선택한 메일(여기서는 가장 최신의 메일)의 내용을 사람이 읽을 수 있는 형태로 바꾸어 줍니다. decode하기 전의 내용이 궁금하시다면 raw를 print( ) 함수로 출력해보세요.

# fetch 명령어로 메일 가져오기
res, msg = imap.uid('fetch', recent_email, "(RFC822)")

# 사람이 읽을 수 있는 없는 상태의 이메일
raw = msg[0][1]

# 사람이 읽을 수 있는 형태로 변환
raw_readable = msg[0][1].decode('utf-8')

 

7.  선택한 메일의 내용 파싱하기

 

파싱이란 복잡하게 흩어진 정보에서 원하는 정보만 추출하는 것을 말합니다. 이때는 지난 시간에 메일을 보낼 때 사용했던 email 모듈을 여기서도 사용합니다. 메일 내용을 확인 하는 부분이 조금 복잡한데 이에 대한 내용은 여기서는 자세히 다루지 않겠습니다.

 

궁금 하신 분들은 글 마지막의 점프 투 파이썬 - 라이브러리 예제 편 (POP3) 링크를 참조하시면 설명이 잘 되어 있습니다.

 

import email

# raw_readable에서 원하는 부분만 파싱하기 위해 email 모듈을 이용해 변환
email_message = email.message_from_string(raw_readable)

from email.header import decode_header, make_header

# 보낸사람
fr = make_header(decode_header(email_message.get('From')))
print(fr)

# 메일 제목
subject = make_header(decode_header(email_message.get('Subject')))
print(subject)

# 메일 내용
if email_message.is_multipart():
    for part in email_message.walk():
        ctype = part.get_content_type()
        cdispo = str(part.get('Content-Disposition'))
        if ctype == 'text/plain' and 'attachment' not in cdispo:
            body = part.get_payload(decode=True)  # decode
            break
else:
    body = email_message.get_payload(decode=True)
    
body = body.decode('utf-8')
print(body)

 

<최종 실행 결과>

<실제 메일>

 

 

오늘 준비한 내용은 여기까지입니다.

 

감사합니다.

 


<참고 자료>

 

1. imaplib 공식 문서

https://docs.python.org/ko/3/library/imaplib.html

 

2. 점프 투 파이썬 - 라이브러리 예제 편 (imaplib)

https://wikidocs.net/130371

 

3. 점프 투 파이썬 - 라이브러리 예제 편 (pop3)

https://wikidocs.net/130215

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

2022.03.11 - [파이썬 패키지/라이브러리&패키지 소개] - 파이썬 주요 라이브러리 정리


업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

오늘은 지난 시간에 이어서 파이썬 코드를 이용해서 Gmail에 메일을 보내는 방법에 대해서 공부해보겠습니다.

 

만약 구글에서 '2단계 인증'과 '앱 비밀번호' 설정을 함께 진행하지 않으셨다면 지난 글을 보시고 설정을 마치신 후에 이번 강의를 따라와 주세요!

 

2022.03.17 - [파이썬 패키지/이메일] - [python/smtplib] 파이썬으로 구글 Gmail 보내기 1편. SMTP의 개념과 구글 앱 비밀번호 발급받기


1.  smtplib 모듈 불러오기

 

가장 먼저 해줄 일은 smtplib 모듈을 import 해주는 것입니다. 지난 시간에 말씀드렸 듯이 smtplib 모듈은 파이썬 내장 라이브러리에 포함된 모듈로 별도의 설치가 필요 없답니다.

 

import smtplib

 

2.  smtp 객체 생성

 

다음으로는 사용할 메일의 smtp 서버의 url과 포트(port) 정보를 입력하고 변수에 담아줍니다. 저는 gmail을 사용하기 위해서 위의 코드를 이용했습니다.

# smtplib.SMTP('사용할 SMTP 서버의 URL', PORT)
smtp = smtplib.SMTP('smtp.gmail.com', 587)

# TLS 암호화 (TLS 사용할 때에만 해당코드 입력)
smtp.starttls()

 

만약 네이버, 다음, 아웃룩 메일 등을 이용하시려면 아래의 smtp 정보를 참고하셔서 괄호 안의 정보만 바꿔주시면 됩니다.

# SMTP 서버 정보

smtp_info = {
    'gmail.com': ('smtp.gmail.com', 587),
    'naver.com': ('smtp.naver.com', 587),
    'outlook.com': ('smtp-mail.outlook.com', 587),
    'hotmail.com': ('smtp-mail.outlook.com', 587),
    'yahoo.com': ('smtp.mail.yahoo.com', 587),
    }

 

참고로 SMTP 서버의 암호화 방식에 따라 TLS(Transport Layer Security) 혹은 SSL(Secure Socket Layers)을 사용합니다.

TLS는 포트 587을, SSL은 465를 사용하는데 SSL 방식을 사용하기 위해서는 위와는 조금 다른 코드를 사용해야하니 주의해주세요.

 

smtp = smtplib.SMTP_SSL('smtp.daum.net',465)
# SMTP 서버 정보

smtp_info = {
    'daum.net': ('smtp.daum.net', 465),
    'hanmail.net': ('smtp.daum.net', 465),
    'nate.com': ('smtp.mail.nate.com', 465),
    }

 

 

3.  smtp에 메일주소와 비밀번호 입력

 

이제 메일 정보를 입력해줍시다. 여기서 지난 시간에 발급받은 "앱 비밀번호"가 필요해요.

 

# smtp.login('메일 주소', '비밀번호')
smtp.login('xxxxx@gmail.com', '지난 시간 받았던 16자리 앱 비밀번호')

 

 

4.  email 모듈의 MIMEText 클래스로 메일 내용 입력

 

간단한 메일을 보내는 경우에는 email 모듈의 MIMEText 클래스를, 좀 더 복잡한 메일은 MIMEMultipart 클래스를 사용합니다.

이번 시간에는 메일을 보내는 것이 목표이므로 MIMEText 클래스를 이용해서 메세지를 보내보겠습니다.

 

# email 모듈의 MIMEText 클래스 import
from email.mime.text import MIMEText

# 메일 내용 입력
msg = MIMEText('본문')

# 메일 제목 입력
msg['Subject'] = '제목'

 

 

5.  메일 보내기

 

마지막으로 해줄 일은 발신 메일과 수신 메일 주소를 입력해주는 일입니다.

 

smtp.sendmail('발신 할 메일 주소', '수신 받을 메일 주소', msg.as_string())

 

코드를 실행하였더니 아래와 같이 정상적으로 메일이 온 것을 확인할 수 있었습니다.

 

6.  smtp 종료

 

메일을 더 보낼 일이 없다면, 잘 사용했던 smtp 객체를 종료하여 SMTP 서버와의 연결을 끊어줍니다.

 

smtp.quit()

 

 


<참고 자료>

 

1. SSL과 TLS의 차이

http://www.ktword.co.kr/test/view/view.php?m_temp1=1957 

 

2. 예제로 배우는 파이썬 프로그래밍_메일 보내기(SMTP)

http://pythonstudy.xyz/python/article/508-%EB%A9%94%EC%9D%BC-%EB%B3%B4%EB%82%B4%EA%B8%B0-SMTP

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

2022.03.11 - [파이썬 패키지/라이브러리&패키지 소개] - 파이썬 주요 라이브러리 정리


업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

오늘은 파이썬으로 구글의 Gmail을 사용하는 방법에 대해서 공부해보겠습니다.

 

구글의 보안이 철저해서 별도의 설정 없이는 오늘 배울 smtplib 모듈을 제대로 다룰 수 없으므로,

간단하게 SMTP의 개념을 알아본 후, 구글에서 '2단계 인증'과 '앱 비밀번호' 설정을 함께 진행해보겠습니다.

 


1. SMTP의 개념과 smtplib 모듈 소개

 

파이썬에서 이메일을 보내기 위해서는 파이썬 내장 라이브러리(PIL)의 smtplib와 email 모듈을 사용합니다.

 

 

여기서 smtplib의 SMTP(Simple Mail Transfer Protocol)는 메일을 보내는데 사용되는 프로토콜입니다.

 

출처. 네이버 블로그_Life in Hong Kong

*프로토콜(Protocol)이란?
정보기기 사이에서 통신을 통한 정보 교환이 필요한 경우 이러한 통신을 원활하게 하기 위해 사전에 정의한 여러 통신 규칙과 방법에 대한 약속인 통신 규약을 의미합니다. 

 

이 SMTP 사용법만 익힌다면, 우리가 자주 사용하는 구글, 네이버, 다음, 아웃룩 등의 메일을 자동화 할 수 있답니다.

 

# SMTP 서버 정보

smtp_info = {      
    'gmail.com': ('smtp.gmail.com', 587),
    'naver.com': ('smtp.naver.com', 587),
    'daum.net': ('smtp.daum.net', 465),
    'hanmail.net': ('smtp.daum.net', 465),
    'nate.com': ('smtp.mail.nate.com', 465),
    'outlook.com': ('smtp.outlook.com', 587),
    }

 

참고로 SMTP 서버의 암호화 방식에 따라 TLS 혹은 SSL을 사용하는데, TLS는 포트 587을, SSL은 465를 사용합니다.

(이 부분은 추후에 다시 자세히 다루겠습니다)

 

SMTP에 대한 개념 설명은 여기까지 하고, 앞서 언급했던 Gmail 설정을 함께 진행해보겠습니다.

 

2. Gmail 계정 설정

 

당연한 이야기겠지만 Gmail을 사용하기 위해서는 구글 계정이 있으셔야 합니다. 구글 계정을 로그인 한 후, 아래의 그림을 따라서 순서대로 클릭 및 입력을 해주세요.

 

 

3. 메일 보내기 기초

 

설정이 잘 되었다면 아래의 코드를 실행했을 때, 메일이 자동으로 보내지는 것을 확인 하실 수 있답니다.

 

자세한 내용은 다음 시간에 이어서 설명 드리겠습니다.

 

import smtplib
from email.mime.text import MIMEText

smtp = smtplib.SMTP('smtp.gmail.com', 587)

smtp.ehlo()

smtp.starttls()

smtp.login('xxx@gmail.com', '발급받은 앱 비밀번호')

msg = MIMEText('내용 : 본문 내용')
msg['Subject'] = '제목: 파이썬으로 gmail 보내기'

smtp.sendmail('발신 할 메일 주소', '수신 받을 메일 주소', msg.as_string())

smtp.quit()

 

감사합니다.


<참고 문서>

 

1. SMTP, IMAP, POP3의 개념

https://m.blog.naver.com/ijoos/221742035684

 

2. 파이썬으로 이메일 보내기

https://coblin.xyz/23

반응형

+ Recent posts