본문 바로가기
Python

[Python 이메일 발송] 파일 첨부하여 Gmail 보내기 (SMTP)

2023. 1. 8.

파이썬 smtplib 라이브러리와 Gmail 계정을 이용하여 파일을 첨부한 메일을 전송해보자.

사전 준비
파이썬 코드를 통해 Gmail을 보내기 위해선 "IMAP 사용" 설정이 필요하다.

설정 방법
1. 설정 진입 : 메일 보낼 계정으로 Gmail 접속 후 우측 상단 톱니바퀴 - 모든 설정 보기

 
2. 전달 및 POP/IMAP  -> IMAP 사용 체크 -> 변경사항 저장

imap

IMAP 사용 설정은 메일 계정의 외부 접속에 대한 보안 설정 과정으로 필수이다.
생략하고 진행하게 되면 로그인 시도가 차단되었다는 보안 메일을 받게 된다.

인터넷에서 메일을 송수신할 때는 SMTP(Simple Mail Transfer Protocol)이라는 규약을 사용한다. 파이썬 프로그램(Client)와 메일 Server, Server와 Server 사이에 SMTP를 사용한다. 우리가 평소에 웹 사이트에 직접 접속해서 메일을 사용할 때는 Client 개념이 없고 Server와 Server의 통신인 셈이다.

우리는 파이썬에서 이 프로토콜을 지키기 위해 파이썬 내장 라이브러리 smtplib를 사용한다.

또한 인터넷의 전자 메일에서 사용되는 문자 데이터를 표현하기 위한 형식 표준인 MIME을 사용한다.
우리가 보낼 메일을 컴퓨터가 이해할 수 있는 형태로 변환해야 하는데, 이 때 사용하는 포맷이다.
이 포맷을 사용함에 따라 영어가 아닌 언어로 메일을 전송할 수 있고, 파일도 첨부할 수 있다.


SMTP와 MIME을 이해했다면 전체 코드를 보자.

import smtplib  # SMTP 사용을 위한 모듈
import re  # Regular Expression을 활용하기 위한 모듈
from email.mime.multipart import MIMEMultipart  # 메일의 Data 영역의 메시지를 만드는 모듈
from email.mime.text import MIMEText  # 메일의 본문 내용을 만드는 모듈
from email.mime.image import MIMEImage  # 메일의 이미지 파일을 base64 형식으로 변환하기 위한 모듈

def sendEmail(addr):
    reg = "^[a-zA-Z0-9.+_-]+@[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$"  # 유효성 검사를 위한 정규표현식
    if re.match(reg, addr):
        smtp.sendmail(my_account, to_mail, msg.as_string())
        print("정상적으로 메일이 발송되었습니다.")
    else:
        print("받으실 메일 주소를 정확히 입력하십시오.")

# smpt 서버와 연결
gmail_smtp = "smtp.gmail.com"  # gmail smtp 주소
gmail_port = 465  # gmail smtp 포트번호. 고정(변경 불가)
smtp = smtplib.SMTP_SSL(gmail_smtp, gmail_port)

# 로그인
my_account = "(MY MAIL ADDRESS)"
my_password = "(MY PASSWORD)"
smtp.login(my_account, my_password)

# 메일을 받을 계정
to_mail = "(DESTINATION)"

# 메일 기본 정보 설정
msg = MIMEMultipart()
msg["Subject"] = f"첨부 파일 확인 바랍니다"  # 메일 제목
msg["From"] = my_account
msg["To"] = to_mail

# 메일 본문 내용
content = "안녕하세요. \n\n\
데이터를 전달드립니다.\n\n\
감사합니다\n\n\
"
content_part = MIMEText(content, "plain")
msg.attach(content_part)

# 이미지 파일 추가
image_name = "test.png"
with open(image_name, 'rb') as file:
    img = MIMEImage(file.read())
    img.add_header('Content-Disposition', 'attachment', filename=image_name)
    msg.attach(img)

# 받는 메일 유효성 검사 거친 후 메일 전송
sendEmail(to_mail)

# smtp 서버 연결 해제
smtp.quit()

(MY EMAIL ADDRESS), (MY PASSWORD), (DESTINATION) 부분에
본인의 gmail 정보와 받는 이메일 주소를 입력하고 코드를 실행하면 된다.

코드 실행 후 - 메일이 잘 전송되고 수신됐는지 확인

mailsuccess

my_account에 입력한 Gmail 계정의 보낸 편지함에서 사진이 첨부된 메일이 잘 보내진 것을 확인했고

receive

to_mail에 입력한 메일 주소의 받은 편지함에서 test.png 사진이 잘 첨부되어 수신된 것을 확인했다.

댓글