Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬(Python)으로 Gmail에 첨부 파일을 포함한 이메일 보내는 방법

이 글에서는 파이썬(Python)을 사용해 첨부 파일이 포함된 이메일을 전송하는 방법을 알아봅니다. 다행히 별도의 외부 라이브러리 없이도 메일을 보낼 수 있습니다. 파이썬에는 기본으로 제공되는 smtplib라는 모듈이 있으며, 이 모듈은 SMTP(Simple Mail Transfer Protocol)를 이용해 메일을 발송합니다. SMTP 클라이언트 세션 객체를 생성하여 메일 전송 작업을 처리합니다.

SMTP를 사용하려면 유효한 발신자·수신자 이메일 주소와 포트 번호가 필요합니다. 포트 번호는 서비스마다 다르며, 구글(Gmail)의 경우 587번 포트를 사용합니다.

1. 필요한 모듈 임포트하기

메일을 보내려면 먼저 관련 모듈을 임포트해야 합니다.

import smtplib

여기서 더 나은 유연성을 위해 MIME(Multipurpose Internet Mail Extension) 모듈도 함께 사용합니다. MIME 헤더에는 발신자와 수신자 정보 등 여러 세부 정보를 저장할 수 있으며, 메일에 첨부 파일을 추가할 때도 반드시 필요합니다.

2. Gmail 보안 설정

구글의 Gmail 서비스를 통해 메일을 보내려면 구글의 보안 정책에 맞춰 몇 가지 사전 설정이 필요합니다. 외부 애플리케이션 접근이 차단되어 있다면 아래 코드가 동작하지 않을 수 있습니다.

과거에는 Google 계정 설정에서 '보안 수준이 낮은 앱 허용(Less Secure App Access)' 옵션을 켜야 했습니다. 단, 2단계 인증이 켜져 있다면 이 옵션은 사용할 수 없습니다.

참고: 현재 구글은 '보안 수준이 낮은 앱' 옵션을 폐지했습니다. 대신 2단계 인증을 활성화한 뒤 Google 계정 → 보안 → 앱 비밀번호(App Password)를 생성하고, 일반 로그인 비밀번호 대신 이 앱 비밀번호를 사용하는 것이 표준적인 방법입니다.

3. smtplib로 첨부 파일 메일 보내는 절차

  • MIME 객체를 생성한다
  • 발신자, 수신자 주소를 MIME에 추가한다
  • 메일 제목(Subject)을 MIME에 추가한다
  • 본문(body)을 MIME에 첨부한다
  • 첨부할 파일을 바이너리(binary) 모드로 연다
  • 바이트 스트림을 읽어 base64 인코딩 방식으로 인코딩한다
  • 첨부 파일에 헤더를 추가한다
  • 적절한 보안 설정과 함께 유효한 포트 번호로 SMTP 세션을 시작한다
  • 로그인한다
  • 메일을 전송하고 세션을 종료한다

4. 예제 코드

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders

mail_content = '''안녕하세요,
테스트 메일입니다.
이 메일에는 몇 가지 파일이 첨부되어 있습니다.
파이썬 SMTP 라이브러리를 사용해 전송했습니다.
감사합니다.
'''

# 메일 주소와 비밀번호
sender_address = 'sender123@gmail.com'
sender_pass = 'xxxxxxxx'
receiver_address = 'receiver567@gmail.com'

# MIME 설정
message = MIMEMultipart()
message['From'] = sender_address
message['To'] = receiver_address
message['Subject'] = 'A test mail sent by Python. It has an attachment.'

# 본문과 첨부 파일 추가
message.attach(MIMEText(mail_content, 'plain'))
attach_file_name = 'TP_python_prev.pdf'
attach_file = open(attach_file_name, 'rb')  # 파일을 바이너리 모드로 열기
payload = MIMEBase('application', 'octate-stream')
payload.set_payload((attach_file).read())
encoders.encode_base64(payload)  # 첨부 파일 인코딩

# 파일 이름이 포함된 payload 헤더 추가
payload.add_header('Content-Decomposition', 'attachment', filename=attach_file_name)
message.attach(payload)

# 메일 전송을 위한 SMTP 세션 생성
session = smtplib.SMTP('smtp.gmail.com', 587)  # gmail과 587 포트 사용
session.starttls()  # 보안(TLS) 활성화
session.login(sender_address, sender_pass)  # 메일 주소와 비밀번호로 로그인
text = message.as_string()
session.sendmail(sender_address, receiver_address, text)
session.quit()
print('Mail Sent')

5. 실행 결과

D:\Python TP\Python 450\linux>python 327.Send_Mail.py
Mail Sent

코드가 정상적으로 실행되면 콘솔에 'Mail Sent'가 출력되고, 수신자의 받은 편지함에 첨부 파일이 포함된 메일이 도착한 것을 확인할 수 있습니다.