본문 바로가기
IT/Python

PYTHON으로 이미지 등 이메일(gmail) 보내는 방법!

by 아키우스 2022. 4. 28.
728x90
반응형

 

안녕하세요. 파이썬으로 이메일 보내는 exe를 만들어 실행하면 상대방 email로 jpg와 내용을 보내는 방법을 설명하려고 합니다. smtp에 대한 설명은 다른 페이지에서 하고 개발 방법에 대해서만 설명하겠습니다.

 

개발 목적

파이썬의 email, smtp 모듈 사용하여 email로 데이터와 이미지를 보내기.

 

 

smtp로 설정할 개인 gmail 주소에 smtp 설정

개인 gmail 주소가 smtp 설정되었다고 가정하고 진행

 

 

email.exe 제작을 위한 python 코드
import io
import json
import smtplib
import os
import email
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.utils import formatdate
from email.mime.image import MIMEImage

class cEMail():
    emailData = {}
    def __init__(self, smtpServer, password='password'):
        filename = os.getcwd() + '/info.txt'
        filename = filename.replace("\\","/")

        msg = ''
        with io.open(filename, 'r', encoding='utf8') as f:
            text = f.read()
            msg = msg.join(text.splitlines())

        msg = msg.strip(' \n\r')
        cEMail.emailData = json.loads(msg)

        self.smtpServer = smtpServer
        self.smtp = smtplib.SMTP('smtp.gmail.com')
        self.smtp.ehlo()
        self.smtp.starttls()
        self.smtp.login(self.smtpServer, password)

    def __del__(self):
        try:
            self.smtp.quit()
        except:
            pass

    def send(self):
        msg = MIMEMultipart()
        msg['Subject'] = cEMail.emailData['subject']
        msg['Date'] = formatdate(localtime=True)
        msg['From'] = self.smtpServer
        msg['To'] = cEMail.emailData['toMail']

        body = MIMEText(cEMail.emailData['message'])
        msg.attach(body)

        filename = cEMail.emailData['image']
        fp = open(filename, 'rb')
        att = MIMEApplication(fp.read(), _subtype="pdf")
        fp.close()
        att.add_header('Content-Disposition', 'attachment', filename=filename)
        msg.attach(att)
        fromEMail = self.smtpServer
        self.smtp.sendmail(fromEMail, cEMail.emailData['toMail'], msg.as_string())

if __name__ == '__main__':
    smtp_server = 'test@gmail.com'
    smtp_server_password = 'xxxxxxxxxxxx'
    m_eMail = cEMail(smtp_server, smtp_server_password)

    m_eMail.send()

 

파이썬 빌드 후 디렉토리 구조 및 사용 방법

info.txt의 내용

{"toMail":"admin@naver.com","image":"test.png","message":"테스트중","subject":"테스트로 메일 보내기"}

 

 

 

Email 폴더는 파이썬에서 빌드시 생성되는 dist 폴더 안에 있는 폴더이며 Email 폴더 안에 Email.exe가 들어 있습니다.

Email.exe를 실행하면 한단계 위의 폴더인 위 이미지에서 보이는 info.txt를 읽어 test.jpg를 메일에 첨부하여 발송합니다.

 

 

코드 리뷰

1. 파이썬 실행시 main 함수 자동 실행.

if __name__ == '__main__':
    smtp_server = 'test@gmail.com'
    smtp_server_password = 'xxxxxxxxxxxx'
    m_eMail = cEMail(smtp_server, smtp_server_password)

    m_eMail.send()

main 함수에 보면

1. smtp_server(개인 gmail 주소를 발신자로 설정하여 상대방에게 보내는 코드라서 개인 email로 설정)로 설정할 gmail 을 입력.

2. smtp_server_password는 (개인 gmail의 smtp 사용을 위한 접속 password로 개인 gmail에서 설정된 패스워드 입력.

3. m_eMail = cEMail(smtp_server, smtp_server_password)이 실행되어 전체 코드의 13번째 줄 cEMail 클래스가 생성되어 cEMail 클래스의 __init__ 함수 자동 호출(클래스는 클래스가 생성되면 __init__ 함수가 자동 실행됩니다.)되며 16번째 줄 ~ 36번째 줄까지 코드 실행.

 

*16번째 줄 ~ 36번째줄까지 코드*

def __init__(self, smtpServer, password='password'):
        filename = os.getcwd() + '/info.txt'  # os.getcwd()는 현재 디렉토리 경로 가리킴
        filename = filename.replace("\\","/") #현재 디렉토리 경로의 \\로 사용된 경로이면 /로 치환

        msg = ''    # 메일로 보낼 메시지를 담을 변수
        with io.open(filename, 'r', encoding='utf8') as f: #현재 경로로 설정된 파일을 'r'을 통해
            text = f.read()								   #읽어온후 
            msg = msg.join(text.splitlines())              # msg 변수에 join을 통해 이어 붙임.

        msg = msg.strip(' \n\r')			# 보낼 메시지에 줄바꿈이 있을 경우 제거
        cEMail.emailData = json.loads(msg)   # cEmail 클래스의 emaildata에 대입

        self.smtpServer = smtpServer     # 발송자의 smtpserver 설정
        self.smtp = smtplib.SMTP('smtp.gmail.com')
        self.smtp.ehlo()
        self.smtp.starttls()
        self.smtp.login(self.smtpServer, password)

 

 

4. m_eMail.send()는 cEMail 클래스의 send 함수 호출함.

 

cEMail 클래스의 39~56번 코드 실행

def send(self):
        msg = MIMEMultipart()   # MIMEMultipart를 사용하여 json 형태의 데이터를 만듬.
        
        #__init__ 함수에서 info.txt에서 읽어온 데이터를 MIMEMultipart의 json데이터에 맞게 입력.
        msg['Subject'] = cEMail.emailData['subject'] #발송할 제목을 설정
        msg['Date'] = formatdate(localtime=True) #발송시간을 현지 시간으로 설정
        msg['From'] = self.smtpServer # 발송할 gmail주소를 대입.
        msg['To'] = cEMail.emailData['toMail'] # 받을 email 주소 설정

        body = MIMEText(cEMail.emailData['message'])  #보낼 텍스트 내용을 대입.
        msg.attach(body)

        filename = cEMail.emailData['image']  # info.txt에 설정된 image 이름을
        fp = open(filename, 'rb')             # 파일로 불러와서 붙임.
        att = MIMEApplication(fp.read(), _subtype="pdf")
        fp.close()
        att.add_header('Content-Disposition', 'attachment', filename=filename)
        msg.attach(att)
        fromEMail = self.smtpServer
        self.smtp.sendmail(fromEMail, cEMail.emailData['toMail'], msg.as_string())
        #최종으로 smtp.sendmail 함수를 이용하여 메일 발송

 

 

맺음

exe 실행 시 코드 실행 순서대로 설명을 했는데 도움이 됐을지 모르겠네요. 나름 설명한다고 주석을 달아 놓긴 했는데.

궁금한 거 있으면 댓글 남겨주세요.

 

"포스팅이 도움이 되셨다면 좋아요와 댓글 그리고 커피 한잔의 여유~ 감사합니다."

728x90
반응형

댓글