파이썬 프로젝트 및 응용/QR코드로 사랑하는 사람에게 감사의 메시지 보내기

(프로젝트) QR코드로 사랑하는 사람에게 감사의 메시지를 보내세요.~ - 4. QR코드이미지+이메일발송 프로그램 만들기

파기차차 2022. 12. 28. 07:17
728x90
반응형
SMALL
728x90
반응형

ㅁ 개요

 

O 프로그램 소개

 

 


 - 이번 글은 이전글(2022.12.21 - [분류 전체보기] - (프로젝트) QR코드로 사랑하는 사람에게 감사의 메시지를 보내세요.~ - 3. 이메일보내기)에 이은 4번째 마지막 글로 QR코드 이미지를 이메일로 발송할 수 있는 프로그램을 만드는 방법에 대하여 설명합니다.

 

 

O 완성된 프로그램 실행 화면

 

 

- 최종 완성된 프로그램의 결과화면은 아래와 같습니다.(1.소개편에서 설명드린 내용과 동일)

 

1.프로그램 실행 후 '받는 사람 이메일 주소', '이메일 제목', '이메일 내용' 그리고 'QR코드 메시지'를 쓰고, '전송' 버튼을 클릭 합니다.

 

 

 

 

 

 

 

2. 정상적으로 이메일이 전송되면 아래와 같이 '입력하신 이메일 주소로 잘 전송되었습니다.' 라는 결과를 보실 수 있습니다.

 

 

3. 받는 사람 이메일 주소에서는 아래와 같이 위에서 보낸 메일이 잘 받아졌습니다.

 

 

 

 

4.메일을 열어보면 덩그러니 QR코드 이미지만 있습니다. 분명히 아빠가 보낸건 맞는데, 아무런 메시지가 없어 이상하고, 궁금합니다.

 

 

 

 

5.QR코드 이미지를 클릭하여 확대한 후 QR코드 스캐너로 찍어 봅니다.

 

 

 

 

 

6. 그랬더니, QR코드 이미지 속에 아빠가 보낸 비밀 메시지가 있었습니다. 약간은 가슴이 뭉클(?)합니다.

 

 

 

 

 

 

 

 

 

 

 

 

O 시작전 준비 사항

 

 

 

1. 프로그램을 실행하기 위해서는 아래 모듈들이 필요합니다. 아래와 같이 임포트(설치) 해줍니다.

 


# QR코드 관련 모듈
import qrcode # pip install qrcode


# GUI 창 띄우기 관련 모듈
import sys
from PyQt5.QtWidgets import *
from PyQt5 import uic, QtCore, QtGui, QtWidgets
import os
from PyQt5.QtGui import *


# 이메일 발송 관련 모듈
import smtplib
from email.encoders import encode_base64
from email.header import Header
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import formatdate

 

※ 설치 시 에러가 발생거나, 궁금하신 점이 있으시면 댓글로 문의 주시면 친절하게 답변드리겠습니다.

 

 

2. 추가로 메일을 발송하기 위해서는 네이버메일 '환경설정'에서 아래의 설정을 변경해 주셔야 합니다.

 

환경설정 > POP3/IMAP 설정 > IMAP/SMTP 설정 > '사용함' 으로 선택 후 '저장' 클릭

 

위와 같이 되셨다면 우리는 다음 단계로 넘어가실 수 있는 준비가 되었습니다.

 

 

 


 

 

 

 

ㅁ 세부 내용

 

O 완성된 소스

 

 

 

 

소스 : 3.py

# -*- coding: utf-8 -*-
# QR코드 관련 모듈
import qrcode # pip install qrcode


# GUI 창 띄우기 관련 모듈
import sys
from PyQt5.QtWidgets import *
from PyQt5 import uic, QtCore, QtGui, QtWidgets
import os
from PyQt5.QtGui import *


# 이메일 발송 관련 모듈
import smtplib
from email.encoders import encode_base64
from email.header import Header
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import formatdate



form_class = uic.loadUiType("QRCode.ui")[0]

class MyWindow(QMainWindow, form_class):
    def __init__(self):
        super().__init__()

        self.setFixedSize(570,582)
        self.setWindowIcon(QIcon("pagichacha.png"))
        self.setupUi(self)

        self.pushButton.clicked.connect(self.transfer)
        self.toolButton_3.clicked.connect(self.emailSelectFile)
        

    def transfer(self):

        
        emailList = self.lineEdit_2.text()
        emailTitle = self.lineEdit.text()
        emailContent = self.textEdit_2.toPlainText()
        QRmessages = self.textEdit_3.toPlainText()

        if self.lineEdit.text() and self.lineEdit_2.text() and self.textEdit_2.toPlainText() and self.textEdit_3.toPlainText():

            ################################################################
            # 1. QR코드 이미지 생성
            ################################################################
            imgFile = "hello.png" #<-- 여기에 저장될 이미지의 경로 지정

            if os.path.exists(imgFile):
                os.remove(imgFile)

            img = qrcode.make(QRmessages) # 메시지 입력
            img.save(imgFile) # 위의 메시지를 저장한 qr코드 이미지로 저장
            print(type(img))
            print(img.size)


            # try:
            ################################################################
            # 2. 이메일 발송
            ################################################################
            msg = MIMEMultipart()

            msg['From'] = ''  # 본인 이메일 주소
            msg['To'] = emailList
            msg['Date'] = formatdate(localtime=True)
            msg['Subject'] = Header(s=emailTitle, charset='utf-8')
            body = MIMEText(emailContent, _charset='utf-8')
            msg.attach(body)

            files = list()
            files.append(imgFile)

            for f in files:
                part = MIMEBase('application', "octet-stream")
                part.set_payload(open(f, "rb").read())
                encode_base64(part)
                part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(f))
                msg.attach(part)

            mailServer = smtplib.SMTP_SSL('smtp.naver.com')

            debugMessage = mailServer.set_debuglevel(True)
            print(debugMessage, type(debugMessage)) 


            mailServer.login('', '')  # 본인 계정과 비밀번호 사용.
            mailServer.send_message(msg)
            mailServer.quit()

            self.textEdit.setText("입력하신 이메일 주소로 잘 전송되었습니다.")

            self.lineEdit_2.clear()
            self.lineEdit.clear()
            self.textEdit_2.clear()
            self.textEdit_3.clear()

        else:
            self.textEdit.setText("이메일 주소/제목/내용 및 QR메시지를 모두 입력하셔야 합니다.!!!")
        

    def emailSelectFile(self):
        file = QtWidgets.QFileDialog.getOpenFileName(self, 'Open file', './')
        print(file[0], "test")

        with open(file[0], encoding='utf-8') as f:
            keywords = f.read()
            print(keywords)
        
        self.lineEdit_2.setText('{}'.format(keywords))


app=QApplication(sys.argv)
window = MyWindow()
window.show()
print("Before event loop")
app.exec_()
print("After event loop")

 

 

QRCode.ui
0.00MB

 

 

 

O 소스 실행 방법

 
 
 
 - 소스파일을 3.py로 저장 후 cmd, 파워쉘, 비주얼스튜디오코드 등에서 아래와 같이 실행하시기 바랍니다.
(UI 파일인 QRCode.ui은 3.py 파일과 동일 위치에 있어야 합니다.)
 
 
 > python 3.py
 

 

 


 
 

O 주요 내용

 

1.소스코드에서 먼저 아래와 같이 관련 모듈을 임포트 해줍니다.

 

 

 

 

아래 소스에 대한 자세한 내용은 하단의 "소스 분석"을 참고하여 주시기 바라며, 간단히 요약 하면 아래와 같습니다.

 


qt designer로 미리 만들어둔 UI를 사용하기 위해 MyWindow클래스에서 상속을 받아 사용합니다.

class MyWindow(QMainWindow, form_class):

 

 

그리고 초기화 함수(__init__(self))에서 아래와 같이 pushButton버튼 클릭시 transfer()함수를, toolButton_3버튼 클릭시 emailSelectFile()함수를 호출합니다.

self.pushButton.clicked.connect(self.transfer)
self.toolButton_3.clicked.connect(self.emailSelectFile)

 

 

메일 주소,제목, 내용, QR메시지의 입력 값을 변수에 담습니다.

emailList = self.lineEdit_2.text()
emailTitle = self.lineEdit.text()
emailContent = self.textEdit_2.toPlainText()
QRmessages = self.textEdit_3.toPlainText()

 

 

 

 메일주소, 제목, 내용, QR메시지가 입력되었는지 체크하고, 입력되어 있으면 if문을 실행합니다.

if문에서는 먼저 QR코드 이미지를 생성합니다.(이전과 내용은 동일)

 

 

 

 

그리고 나서 이전글에서 살펴보았던 이메일 발송 후 별다른 에러가 없으면 화면(textEdit)에 잘 발송 되었다고 안내해 줍니다.(그 외 부분은 이전 소스코드와 동일)

 

 

 

 

 

정상발송 후 화면을 clear해 주었습니다.

 

def emailSelectFile(self): <-- 이함수의 경우 이메일을 받을 사람이 여러명인 경우 "..." 툴버튼을 클릭하여 미리 파일로 저장된 이메일주소 목록을 첨부할 수 있도록 해주는 함수입니다.

 

 

 

 

 

 

 

 

2. 프로그램을 실행하면 아래와 같이 실행됩니다.

 

이메일 주소 등 내용을 입력 후 '전송' 버튼을 클릭하면

 

 

 

 아래와 같이 실행되면서, '입력하신 이메일 주소로 잘 전송되었습니다.' 라고 뜨면 정상적으로 발송된 것입니다.

 

 3. 실제 메일에서 확인한 결과 네이버 메일과,

 

 

 지메일 모두 잘 수신되었습니다.

 

 

 

 

4. 메일 클릭 후 본문에서 이미지를 클릭하면 아래와 같이 뜨는데,

 

 

 

 

 5. QR코드 스캐너로 확인하면, 아래와 같이 내가 보낸 메시지가 잘 나타나는 것을 보실 수 있습니다.

 

 

 

 

 

 

 

 

 


 

 

O 소스 분석

 


 

def emailSelectFile(self):
        file = QtWidgets.QFileDialog.getOpenFileName(self, 'Open file', './') #<-- 파일 한개 열때 사용, getOpenFileName
        print(file[0], "test") # <--파일의 전체 경로를 리턴

        with open(file[0], encoding='utf-8') as f: # <--파일의 내용을 열어서
            keywords = f.read() # <-- keywords변수에 저장(여기에 이메일 주소가 저장됨)
            print(keywords)
        
        self.lineEdit_2.setText('{}'.format(keywords)) # <-- lineEdit_2('받는 사람 이메일 주소')에 보여줌

 

 

 


 

ㅁ 정리

 

O 우리가 배운 내용

 
 - 오늘은 QR코드 이미지를 이메일로 발송할 수 있는 프로그램을 만드는 방법에 대하여 알아보았습니다.
 
 
 
 
 
 - 오늘 우리가 배운 핵심내용을 정리해 보면 아래와 같습니다.
 
 
1. 이전글에서 배운 내용을 단순히 합치고, GUI 부분을 추가해 준 것이 전부입니다.
2. QR코드 이미지 생성 후 이메일 발송시 해당 이미지를 첨부하여 발송 하도록 하였으며, 윈도우(GUI)폼을 구성하여 메일 주소, 제목, 내용, QR메시지를 입력할 수 있도록 해주었습니다.

 

 

 

O 향후 개선 사항

 

1. 소개편에서 말씀드린 바와 같이 우리 프로그램은 완전하지 않으며, 추가로 아래와 같은 내용의 개선이 필요합니다.

직접 프로그램을 개선하려고 노력해 보시고, 뭔가 작은 것이라도 성취해 보신다면 이런 노력을 통해서 향후 엄청난 스킬업을 경험하실 수 있을 것이라고 확신합니다.

 

 

1.이메일 유효성 검증 루틴 추가하기

 - 현재 프로그램은 잘못된 이메일 주소를 넣더라도 이메일이 실제 존재하는 이메일인지 여부를 검증하지 않습니다. 따라서 잘못된 이메일 주소를 보내는 경우 보낸사람 이메일 주소로 아래와 같이 오류 메시지가 날아 옵니다.

따라서 이메일 검증 부분을 추가하신다면 더 신뢰할 수 있는 프로그램이 될 것입니다.

 

 

2.발송 후 에러 발생시 화면에 에러 내용 보여주기

 - 현재 프로그램 실행 후 이메일이 잘 발송된 경우 '입력하신 이메일 주소로 잘 전송되었습니다.' 란 메시지를 볼 수 있습니다.

다만, 어떤 이유로 오류가 발생한 경우에는 별다른 메시지를 보여주지 않고, 프로그램이 종료되는데, 이때 오류 발생시 오류가 발생하는 메시지를 뿌려준다면 오류를 해결하는데 훨씬 도움이 될 것입니다.

 

 

3.이메일이 아닌 문자 등으로 발송하기

 - 이부분은 제가 찾아보다 찾지 못하였습니다.

API서비스를 제공하고, 무료로 MMS문자 서비스를 제공하는 업체를 찾아 보았으나, 제대로된 업체를 찾지 못하였습니다.

대부분 유료이거나, 무료인 경우 MMS 서비스가 없거나, 있더라도 API 관련문서의 정보가 부족하여 제대로 구현되지 않았습니다.

 

혹시 직접 찾아보시고, 좋은 정보를 발견하신다면 공유 부탁드리고, 스스로 문자 발송 기능까지 만들어 보신다면 스킬업 향상에 좋은 경험이 될것입니다.

 

 

 

 

 

이것으로 'QR코드로 사랑하는 사람에게 감사의 메시지를 보내세요...' 프로젝트를 마칩니다.

여기까지 이 글을 읽고 계신다면 그 열정에 박수를 보내드리며, 지속적인 동기부여를 위해 우리 '파기차차'와 함께 가보시죠.

 

 

위의 내용이 유익하셨다면, 좋아요와 구독 부탁드립니다.

 

 

감사합니다.

 

 

 

 

 

※ 추가적인 정보는 아래 유튜브 영상에서 해당 내용을 더욱 자세히 보실 수 있습니다.

 

 

 

 

728x90
반응형
LIST